def convertEastingNorthing(self, eastingnorthing):
     from mapnik import Projection, Coord
     
     britishProjection = Projection('+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +datum=OSGB36 +units=m +no_defs')
     c = Coord(float(eastingnorthing[0]), float(eastingnorthing[1]))
     c = britishProjection.inverse(c)
     return [c.y,c.x]
Пример #2
0
    def convertEastingNorthing(self, eastingnorthing):
        from mapnik import Projection, Coord

        britishProjection = Projection(
            '+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +datum=OSGB36 +units=m +no_defs'
        )
        c = Coord(float(eastingnorthing[0]), float(eastingnorthing[1]))
        c = britishProjection.inverse(c)
        return [c.y, c.x]
Пример #3
0
    def __init__(self, content):
        """ With MapRenderer you can render an aktionskarten map in different
            file formats like pdf, svg or png.

            Internally it uses mapnik and cairo to archieve this. A valid style
            has to be defined through `MAPNIK_OSM_XML`. Normally this a carto
            derived `style.xml`. In this file your datasource is specified. This
            can be for instance a postgres+postgis database with imported osm
            data.

            :param content: dict of map content
        """
        # Mapnik uses mercator as internal projection. Our data is encoded in
        # latlon. Therefor we need a transformer for coordindates from longlat
        # to mercator
        proj_merc = Projection('+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0\
                                +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m  \
                                +nadgrids=@null +no_defs +over')
        proj_longlat = Projection('+proj=longlat +ellps=WGS84 +datum=WGS84  \
                                   +no_defs')
        transformer = ProjTransform(proj_longlat, proj_merc)

        # our maps should be printable on a DIN A4 page with 150dpi
        self._map = Map(1754, 1240)
        bbox = transformer.forward(Box2d(*content['bbox']))
        self._map.zoom_to_box(bbox)
        self._map.buffer_size = 5

        start = timer()

        # add osm data (background)
        load_map(self._map, current_app.config['MAPNIK_OSM_XML'])

        mid = timer()

        self._add_grid(content['grid'])
        self._add_features(content['features'])
        self._add_legend(content['name'], content['place'], content['datetime'],
                        content['attributes'])

        end = timer()
        print("Map.init - OSM: ", mid - start)
        print("Map.init - Map: ", end - mid)
        print("Map.init - Total: ", end - start)
Пример #4
0
class CRS:
    def __init__(self, namespace, code):
        self.namespace = namespace
        self.code = int(code)
        self.proj = None

    def __repr__(self):
        return '%s:%s' % (self.namespace, self.code)

    def __eq__(self, other):
        if str(other) == str(self):
            return True
        return False

    def Inverse(self, x, y):
        if not self.proj:
            self.proj = Projection(['init=%s' % str(self).lower()])
        return self.proj.Inverse(x, y)

    def Forward(self, x, y):
        if not self.proj:
            self.proj = Projection(['init=%s' % str(self).lower()])
        return self.proj.Forward(x, y)
Пример #5
0
#!/usr/bin/env python

from mapnik import Coord, Envelope, Projection, forward_, inverse_
import sys

if (len(sys.argv) < 2):
    print sys.argv[0] + " <epsg:code> <Coord or Envelope>"
    sys.exit(1)
else:
    epsg = sys.argv[1]
    p = Projection('+init=%s' % epsg)
    coord = map(float,sys.argv[2].split(','))
    if len(coord) == 2:
        long_lat = Coord(*coord)
        print 'Forwarded:',
        print p.forward(long_lat)
        print
        print 'Inversed:',
        print p.inverse(long_lat)      
    elif len(coord) == 4:
        extent = Envelope(*coord)
        print 'Forwarded:',
        print forward_(extent,p)
        print
        print 'Inversed:',
        print inverse_(extent,p)
Пример #6
0
import MySQLdb

""" 
To install mapnik via aptitude use something like apt-get install 
python-mapnik. Might need to apt-cache search on some distros.

Alternatively http://mapnik.org/
"""
from mapnik import Projection, Coord
from decimal import Decimal

DB_HOST = "localhost"
DB_USER = "******"
DB_PASSWORD = "******"
DB_DATABASE = "database"

britishProj = Projection('+init=epsg:27700') # British National Grid

con = MySQLdb.Connect(host = DB_HOST, user = DB_USER, passwd = DB_PASSWORD, db = DB_DATABASE)

cursor = con.cursor()
cursor.execute("SELECT postcode, eastings, northings FROM %s", (DB_DATABASE))
results = cursor.fetchall()

for result in results:
	 val = Coord(float(result[1]), float(result[2]))
	 val = britishProj.inverse(c)
	 #cursor.execute("UPDATE uk_postcode_dev SET latitude='%f', longitude='%f' WHERE postcode='%s'" % (val.y, val.x, result[0]))
	 print result[0]
	 print val.y, val.x
Пример #7
0

if __name__ == "__main__":
    mapfile = "my_styles/mapnik2normal.xml"

    map_uri = "map.png"

    lat = 49.25
    lon = 7.0
    if len(sys.argv) == 2:
        zoom = int(sys.argv[1])
    else:
        zoom = 13
    imgx = 500
    imgy = 400

    ll = center_to_bbox(lat, lon, zoom, imgx, imgy)
    m = Map(imgx, imgy)
    load_map(m, mapfile)
    prj = Projection(
        "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m"
        " +nadgrids=@null +no_defs +over")
    c0 = prj.forward(Coord(ll[0], ll[1]))
    c1 = prj.forward(Coord(ll[2], ll[3]))
    bbox = Box2d(c0.x, c0.y, c1.x, c1.y)
    m.zoom_to_box(bbox)
    im = Image(imgx, imgy)
    render(m, im)
    view = im.view(0, 0, imgx, imgy)  # x,y,width,height
    view.save(map_uri, 'png')
Пример #8
0
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Converts a latlon coordinate or bounding box to web mercator, moving/cropping
# it to within the web mercator 'square world' if necessary.
#
# Example usage: latlon2merc.py -180 -90 180 90

import sys
from mapnik import Box2d, Coord, Projection, ProjTransform

latlon = Projection('+proj=latlong +datum=WGS84')
merc = Projection(
    '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs'
)

max_4326 = 85.0511287798066
max_3785 = 20037508.3427892

transform = ProjTransform(latlon, merc)

if len(sys.argv) == 3:
    ll = transform.forward(Coord(float(sys.argv[1]), float(sys.argv[2])))
    if (ll.y > max_3785):
        print(' '.join([str(ll.x), str(max_3785)]))
    elif (ll.y < -max_3785):
        print(' '.join([str(ll.x), str(-max_3785)]))
    else:
        print(' '.join([str(ll.x), str(ll.y)]))

elif len(sys.argv) == 5:
Пример #9
0
# note: requires mapnik SVN r822 or greater.

# Example of reprojecting the extent for the netherlands in epsg:28992 to google mercator and then back to the original netherlands extent.

import sys

try:
    from mapnik import ProjTransform, Projection, Envelope
except ImportError, E:
    sys.exit('Requires Mapnik SVN r822 or greater:\n%s' % E)

# http://spatialreference.org/ref/epsg/28992/
# http://mapnik.dbsgeo.com/days/2009-01-25
amersfoort_extent = Envelope(13599.999985, 306799.999985, 277999.999985,
                             619299.999985)
amersfoort_proj = Projection('+init=epsg:28992')

merc_proj = Projection(
    '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs'
)

transform = ProjTransform(amersfoort_proj, merc_proj)

merc_extent = transform.forward(amersfoort_extent)
if transform.backward(merc_extent).__repr__() == amersfoort_extent.__repr__():
    print 'Transformation successful!'
    print 'Original Dutch Extent: %s' % amersfoort_extent
    print 'Merc Extent: %s' % merc_extent
else:
    print 'Reprojection failure...'
Пример #10
0
    logging.info("range: bottomleft(%s, %s), topright(%s, %s)" % (west, lat - lat_half, east, lat + lat_half))
    return west, south, east, north

if __name__ == "__main__":
    mapfile = "my_styles/mapnik2normal.xml"

    map_uri = "map.png"

    lat = 49.25
    lon = 7.0
    if len(sys.argv) == 2:
        zoom = int(sys.argv[1])
    else:
        zoom = 13
    imgx = 500
    imgy = 400

    ll = center_to_bbox(lat, lon, zoom, imgx, imgy)
    m = Map(imgx, imgy)
    load_map(m, mapfile)
    prj = Projection("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m"
                     " +nadgrids=@null +no_defs +over")
    c0 = prj.forward(Coord(ll[0], ll[1]))
    c1 = prj.forward(Coord(ll[2], ll[3]))
    bbox = Box2d(c0.x, c0.y, c1.x, c1.y)
    m.zoom_to_box(bbox)
    im = Image(imgx, imgy)
    render(m, im)
    view = im.view(0, 0, imgx, imgy)  # x,y,width,height
    view.save(map_uri, 'png')
Пример #11
0
        h = RAD_TO_DEG * (2 * atan(exp(g)) - 0.5 * pi)
        return Coord(f, h)

    def envLLToPixel(self, env, zoom):
        lb = self.LLToPixel(Coord(env.minx, env.miny), zoom)
        rt = self.LLToPixel(Coord(env.maxx, env.maxy), zoom)
        return Box2d(lb.x, lb.y, rt.x, rt.y)

    def envPixelToLL(self, env, zoom):
        lb = self.pixelToLL(Coord(env.minx, env.miny), zoom)
        rt = self.pixelToLL(Coord(env.maxx, env.maxy), zoom)
        return Box2d(lb.x, lb.y, rt.x, rt.y)


GOOGLE_PROJECTION = GoogleProjection()
LATLONG_PROJECTION = Projection(LATLONG_PROJECTION_DEF)
MERCATOR_PROJECTION = Projection(MERCATOR_PROJECTION_DEF)

##### Geographic coordinate transformation


def LLToMerc(coord):
    """Converts a Coord(lon,lat) or Box2d(l,b,r,t) to
    OSM Mercator (x,y)."""
    return MERCATOR_PROJECTION.forward(coord)


def mercToLL(coord):
    """Converts an OSM Mercator Coord(x,y) or Box2d(l,b,r,t)
    to (lon,lat)."""
    return MERCATOR_PROJECTION.inverse(coord)
Пример #12
0
import os, csv
try:
    from mapnik import Projection, Coord
except ImportError:
    print "See https://github.com/mapnik/mapnik/wiki/Mapnik-Installation"
    print "for instructions on installing mapnik"
    raise

BRITISH_PROJECTION = Projection('+init=epsg:27700')
LAT_KEY, LNG_KEY = 'Latitude', 'Longitude'
_CSV_FOLDER_PATH = 'Data/CSV'
_COLUMN_HEADERS_PATH = 'Doc/Code-Point_Open_Column_Headers.csv'


def file_generator(sub_dir):
    for root, _, files in os.walk(sub_dir):
        for f in files:
            full_path = os.path.join(root, f)
            yield full_path


def eastings_northings_to_lat_lng(eastings, northings):
    c = Coord(eastings, northings)
    c = BRITISH_PROJECTION.inverse(c)
    return c.y, c.x


def post_code_data_generator(code_point_download_location):
    """Generate a dictionary of location data for each post code
    in the United Kingdom, based on the Code-Point Open download from
    https://www.ordnancesurvey.co.uk/opendatadownload/products.html.
Пример #13
0
    demfile = getfilename('dem')
    hillshadefile = getfilename('hillshade')

    # create hillshade
    from osgeo.gdal import DEMProcessing, DEMProcessingOptions, Open
    #   alg --- 'ZevenbergenThorne' or 'Horn'
    print 'creating hillshading in', hillshadefile, '...'
    DEMProcessing(hillshadefile,
                  demfile,
                  'hillshade',
                  zFactor=args['hillshade'],
                  combined=True)

m = Map(args['size'][0], args['size'][1])

load_map(m, args['xml'])

m.zoom_all()
if args['scale']:
    m.zoom(args['scale'] / m.scale_denominator())

if args['center']:
    mapcoordcenter = Projection(m.srs).forward(
        Coord(args['center'][1], args['center'][0]))
    center = m.view_transform().forward(mapcoordcenter)
    m.pan(int(center.x), int(center.y))

print 'scale denominator', m.scale_denominator()
print 'writing to', args['output']
render_to_file(m, args['output'])
Пример #14
0
import MySQLdb
""" 
To install mapnik via aptitude use something like apt-get install 
python-mapnik. Might need to apt-cache search on some distros.

Alternatively http://mapnik.org/
"""
from mapnik import Projection, Coord
from decimal import Decimal

DB_HOST = "localhost"
DB_USER = "******"
DB_PASSWORD = "******"
DB_DATABASE = "database"

britishProj = Projection('+init=epsg:27700')  # British National Grid

con = MySQLdb.Connect(host=DB_HOST,
                      user=DB_USER,
                      passwd=DB_PASSWORD,
                      db=DB_DATABASE)

cursor = con.cursor()
cursor.execute("SELECT postcode, eastings, northings FROM %s", (DB_DATABASE))
results = cursor.fetchall()

for result in results:
    val = Coord(float(result[1]), float(result[2]))
    val = britishProj.inverse(c)
    #cursor.execute("UPDATE uk_postcode_dev SET latitude='%f', longitude='%f' WHERE postcode='%s'" % (val.y, val.x, result[0]))
    print result[0]
Пример #15
0
#!/usr/bin/env python

from mapnik import Coord, Envelope, Projection, forward_, inverse_
import sys

if (len(sys.argv) < 2):
    print sys.argv[0] + " <epsg:code> <Coord or Envelope>"
    sys.exit(1)
else:
    epsg = sys.argv[1]
    p = Projection('+init=%s' % epsg)
    coord = map(float, sys.argv[2].split(','))
    if len(coord) == 2:
        long_lat = Coord(*coord)
        print 'Forwarded:',
        print p.forward(long_lat)
        print
        print 'Inversed:',
        print p.inverse(long_lat)
    elif len(coord) == 4:
        extent = Envelope(*coord)
        print 'Forwarded:',
        print forward_(extent, p)
        print
        print 'Inversed:',
        print inverse_(extent, p)
Пример #16
0
 def Forward(self, x, y):
     if not self.proj:
         self.proj = Projection(['init=%s' % str(self).lower()])
     return self.proj.Forward(x, y)
Пример #17
0
 def Inverse(self, x, y):
     if not self.proj:
         self.proj = Projection(['init=%s' % str(self).lower()])
     return self.proj.Inverse(x, y)