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]
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]
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)
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)
#!/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)
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
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')
#!/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:
# 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...'
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')
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)
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.
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'])
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]
#!/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)
def Forward(self, x, y): if not self.proj: self.proj = Projection(['init=%s' % str(self).lower()]) return self.proj.Forward(x, y)
def Inverse(self, x, y): if not self.proj: self.proj = Projection(['init=%s' % str(self).lower()]) return self.proj.Inverse(x, y)