def test_providers(): # NOTE: only tests they download, does not check pixel values w, s, e, n = ( -106.6495132446289, 25.845197677612305, -93.50721740722656, 36.49387741088867, ) for provider in [ ctx.providers.OpenStreetMap.Mapnik, ctx.providers.Stamen.Toner, ctx.providers.NASAGIBS.ViirsEarthAtNight2012, ]: ctx.bounds2img(w, s, e, n, 4, source=provider, ll=True)
def test_url(): # NOTE: only tests they download, does not check pixel values w, s, e, n = ( -106.6495132446289, 25.845197677612305, -93.50721740722656, 36.49387741088867, ) ctx.bounds2img(w, s, e, n, 4, url=ctx.providers.OpenStreetMap.Mapnik, ll=True)
def add_basemap(ax, zoom, url='httpS://t1.data.amsterdam.nl/topo_wm_zw/tileZ/tileX/tileY.png', alpha=.5): xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) ax.imshow(basemap, extent=extent, interpolation='bilinear', alpha=alpha) # restore original x/y limits ax.axis((xmin, xmax, ymin, ymax))
def add_ctx_basemap(ax, zoom=15, url='https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}', buffer=0): """ OpenTopoMap = 'https://tile.opentopomap.org/{Z}/{X}/{Y}.png' OpenStreetMap = 'http://tile.openstreetmap.org/{Z}/{X}/{Y}.png' GoogleHybrid = 'https://mt1.google.com/vt/lyrs=y&x={X}&y={Y}&z={Z}' GoogleSatellite = 'https://mt1.google.com/vt/lyrs=s&x={X}&y={Y}&z={Z}' GoogleRoad = 'https://mt1.google.com/vt/lyrs=m&x={X}&y={Y}&z={Z}' GoogleTerrain = 'http://mt0.google.com/vt/lyrs=p&hl=en&x={X}&y={Y}&z={Z}' GoogleTerrainOnly = 'http://mt0.google.com/vt/lyrs=t&hl=en&x={X}&y={Y}&z={Z}' ESRIImagery = 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{Z}/{Y}/{X}.jpg' Wikimedia = 'https://maps.wikimedia.org/osm-intl/{Z}/{X}/{Y}@2x.png' """ xmin, xmax, ymin, ymax = ax.axis() xmin = xmin - buffer xmax = xmax + buffer ymin = ymin - buffer ymax = ymax + buffer basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) ax.imshow(basemap, extent=extent, interpolation='bilinear') # restore original x/y limits ax.axis((xmin, xmax, ymin, ymax))
def add_basemap(ax, zoom, url='https://maps.wikimedia.org/osm-intl/{z}/{x}/{y}.png', ll=False): """ Adds basemap background to geometry. Make sure to convert geometry to epsg 3857 beforehand. :param ax: matplotlib axes :param zoom: int zoom level, usually between 5-19 :param url: string Tile URL, with placeholders TileZ, tileX, tileY :param ll: bool: are coordinates assumed to be lon/lat as opposed to Spherical Mercator. Default False :return: None """ xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url, ll=ll) ax.imshow(basemap, extent=extent, interpolation='bilinear') # restore original x/y limits ax.axis((xmin, xmax, ymin, ymax)) ax.set_axis_off()
def add_basemap(ax, zoom, url='http://tile.stamen.com/terrain/tileZ/tileX/tileY.png'): #xmin, xmax, ymin, ymax = ax.axis() xmin, xmax, ymin, ymax = -7925000, -7895000, 5195000, 5220000 basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) ax.imshow(basemap, extent=extent, interpolation='bilinear') # restore original x/y limits ax.axis((xmin, xmax, ymin, ymax))
def test_sources(): # NOTE: only tests they download, does not check pixel values w, s, e, n = (-106.6495132446289, 25.845197677612305, -93.50721740722656, 36.49387741088867) sources = [i for i in dir(tilers) if i[0] != '_'] for src in sources: img, ext = ctx.bounds2img(w, s, e, n, 4, ll=True)
def test_deprecated_url_format(): old_url = "http://a.tile.openstreetmap.org/tileZ/tileX/tileY.png" new_url = "http://a.tile.openstreetmap.org/{z}/{x}/{y}.png" w, s, e, n = ( -106.6495132446289, 25.845197677612305, -93.50721740722656, 36.49387741088867, ) with pytest.warns(FutureWarning, match="The url format using 'tileX'"): img1, ext1 = ctx.bounds2img(w, s, e, n, 4, source=old_url, ll=True) img2, ext2 = ctx.bounds2img(w, s, e, n, 4, source=new_url, ll=True) assert_allclose(img1, img2) assert_allclose(ext1, ext2)
def get_basemap(ax, zoom, url='http://tile.stamen.com/terrain/tileZ/tileX/tileY.png'): """Helper function to add a basemap for the plot""" xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) return basemap, extent
def add_basemap(ax, zoom, url): xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) ax.imshow(basemap, extent=extent, interpolation='bilinear') ax.axis((xmin, xmax, ymin, ymax))
def add_basemap(ax, zoom, url='http://tile.stamen.com/terrain/tileZ/tileX/tileY.png'): """ Function to add an underlay basemap to geopandas plot. Necessary if version of contextily does not contain function. """ xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) ax.imshow(basemap, extent=extent, interpolation='bilinear') # restore original x/y limits ax.axis((xmin, xmax, ymin, ymax))
def plot_background_map(ax): url = ctx.sources.ST_TONER_LITE xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=12, url=url) ax.imshow(basemap, extent=extent, interpolation='bilinear', zorder=0) ax.axis((xmin, xmax, ymin, ymax))
def test_bounds2img(): w, s, e, n = (-106.6495132446289, 25.845197677612305, -93.50721740722656, 36.49387741088867) img, ext = ctx.bounds2img(w, s, e, n, zoom=4, ll=True) solu = (-12523442.714243276, -10018754.171394622, 2504688.5428486555, 5009377.085697309) for i, j in zip(ext, solu): assert round(i - j, TOL) == 0 assert img[100, 100, :].tolist() == [230, 229, 188] assert img[100, 200, :].tolist() == [156, 180, 131] assert img[200, 100, :].tolist() == [230, 225, 189]
def add_basemap(ax, zoom, url='http://tile.stamen.com/terrain/tileZ/tileX/tileY.png'): xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) ax.imshow(basemap, extent=extent, interpolation='bilinear') ax.axis((xmin, xmax, ymin, ymax))
def add_basemap(ax, zoom=15, url='http://tile.stamen.com/toner/tileZ/tileX/tileY.png'): xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) ax.imshow(basemap, extent=extent, interpolation='bilinear') # restore original x/y limits ax.axis((xmin, xmax, ymin, ymax))
def add_ctx_basemap(ax, zoom=15, url='https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}'): xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) ax.imshow(basemap, extent=extent, interpolation='bilinear') # restore original x/y limits ax.axis((xmin, xmax, ymin, ymax))
def add_basemap(ax, zoom, url='http://tile.stamen.com/terrain/tileZ/tileX/tileY.png'): # Special thanks to Prof. Martin Christen at FHNW.ch in Basel for # his GIS-Hack to make the output scales show proper lat/lon values! xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, ll=True, url=url) # calculate extent from WebMercator to WGS84 xmin84, ymin84 = Mercator2WGS84(extent[0], extent[2]) xmax84, ymax84 = Mercator2WGS84(extent[1], extent[3]) extentwgs84 = (xmin84, xmax84, ymin84, ymax84) ax.imshow(basemap, extent=extentwgs84, interpolation='bilinear') # restore original x/y limits ax.axis((xmin, xmax, ymin, ymax))
def add_basemap( ax, zoom, url='http://tiles.kartat.kapsi.fi/taustakartta/tileZ/tileX/tileY.png'): xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) ax.imshow(basemap, extent=extent, interpolation='bilinear') # restore original x/y limits ax.axis((xmin, xmax, ymin, ymax))
def test_plot_map(): # Place as a search loc = ctx.Place(SEARCH, zoom_adjust=ADJUST) w, e, s, n = loc.bbox_map ax = ctx.plot_map(loc) assert ax.get_title() == loc.place ax = ctx.plot_map(loc.im, loc.bbox) assert_array_almost_equal(loc.bbox, ax.images[0].get_extent()) # Place as an image img, ext = ctx.bounds2img(w, s, e, n, zoom=10) ax = ctx.plot_map(img, ext) assert_array_almost_equal(ext, ax.images[0].get_extent())
def add_basemap(ax, zoom, url='http://tile.stamen.com/terrain/tileZ/tileX/tileY.png'): xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) ax.imshow(basemap, extent=extent, interpolation='bilinear') # restore original x/y limits ax.axis((xmin, xmax, ymin, ymax)) ax = df.plot(figsize=(10, 10), alpha=0.5, edgecolor='k')
def add_basemap( ax, zoom, url='http://mt0.google.com/vt/lyrs=s&hl=en&x={x}&y={y}&z={z}' ): #url='http://tile.stamen.com/terrain/{z}/{x}/{y}.png'):#url='http://tile.stamen.com/terrain/tileZ/tileX/tileY.png'): xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, source=url) ax.imshow(basemap, extent=extent, interpolation='bilinear') # restore original x/y limits ax.axis((xmin, xmax, ymin, ymax))
def add_basemap(ax, zoom=12): """ Adds map to a plot. """ url = ctx.sources.ST_TONER_LITE xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) ax.imshow(basemap, extent=extent, interpolation='bilinear') # restore original x/y limits ax.axis((xmin, xmax, ymin, ymax))
def add_basemap(ax, crs, url='http://a.tile.stamen.com/terrain/tileZ/tileX/tileY.png'): xmin, xmax, ymin, ymax = ax.axis() bb = geopandas.GeoSeries([Point(xmin, ymin), Point(xmax, ymax)]) bb.crs = crs bb = bb.to_crs(epsg=4326) zoom = ctx.calculate_zoom(bb[0].x, bb[0].y, bb[1].x, bb[1].y) basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) ax.imshow(basemap, extent=extent, interpolation='bilinear') # restore original x/y limits ax.axis((xmin, xmax, ymin, ymax))
def test_sources(): # NOTE: only tests they download, does not check pixel values w, s, e, n = ( -106.6495132446289, 25.845197677612305, -93.50721740722656, 36.49387741088867, ) sources = tilers.deprecated_sources for src in sources: img, ext = ctx.bounds2img(w, s, e, n, 4, source=getattr(tilers, src), ll=True)
def add_basemap(axi, zoom, url="http://tile.stamen.com/terrain/tileZ/tileX/tileY.png"): """Added a basemap to a subplot :param obj axi: subplot axes :param int zoom: the number of zoom to use :param str url: the url """ import contextily as ctx try: xmin, xmax, ymin, ymax = axi.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) axi.imshow(basemap, extent=extent, interpolation="bilinear") # restore original x/y limits axi.axis((xmin, xmax, ymin, ymax)) return True except Exception: return False
def test_warp_tiles(): w, s, e, n = ( -106.6495132446289, 25.845197677612305, -93.50721740722656, 36.49387741088867, ) img, ext = ctx.bounds2img(w, s, e, n, zoom=4, ll=True) wimg, wext = ctx.warp_tiles(img, ext) assert wext == ( -112.54394531249996, -90.07903186397023, 21.966726124122374, 41.013065787006276, ) assert wimg[100, 100, :].tolist() == [228, 221, 184] assert wimg[100, 200, :].tolist() == [213, 219, 177] assert wimg[200, 100, :].tolist() == [133, 130, 109]
def test_validate_zoom(): # tiny extent to trigger large calculated zoom w, s, e, n = (0, 0, 0.001, 0.001) # automatically inferred -> set to known max but warn with pytest.warns(UserWarning, match="inferred zoom level"): ctx.bounds2img(w, s, e, n) # specify manually -> raise an error with pytest.raises(ValueError): ctx.bounds2img(w, s, e, n, zoom=23) # with specific string url (not dict) -> error when specified url = "https://a.tile.openstreetmap.org/{z}/{x}/{y}.png" with pytest.raises(ValueError): ctx.bounds2img(w, s, e, n, zoom=33, source=url) # but also when inferred (no max zoom know to set to) with pytest.raises(ValueError): ctx.bounds2img(w, s, e, n, source=url)
def add_basemap(axis, zoom, url='http://tile.stamen.com/terrain/tileZ/tileX/tileY.png', flip=False): """ Add image to given axis. Coordinates need to be in epsg=3857. Parameters: (cartopy.mpl.geoaxes.GeoAxesSubplot): plot axis zoom (int, optional): zoom coefficient used in the satellite image url (str, optional): image source, e.g. ctx.sources.OSM_C """ xmin, xmax, ymin, ymax = axis.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) if flip: basemap = np.flip(basemap, 0) axis.imshow(basemap, extent=extent, interpolation='bilinear') axis.axis((xmin, xmax, ymin, ymax))
def add_basemap( ax, zoom, url='http://tile.stamen.com/terrain-background/tileZ/tileX/tileY.png', errors='ignore', ): #TODO : move to another file try: import contextily as ctx xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) ax.imshow(basemap, extent=extent, interpolation='bilinear') # restore original x/y limits ax.axis((xmin, xmax, ymin, ymax)) except Exception as e: print('could not add basemap:', e) if errors != 'ignore': assert False
def add_basemap(ax, zoom, url='http://tile.stamen.com/terrain/tileZ/tileX/tileY.png'): xmin, xmax, ymin, ymax = ax.axis() basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url) ax.imshow(basemap, extent=extent, interpolation='bilinear') # restore original x/y limits ax.axis((xmin, xmax, ymin, ymax))
# Print some metadata for attr in ["w", "s", "e", "n", "place", "zoom", "n_tiles"]: print("{}: {}".format(attr, getattr(loc, attr))) # Show the map im1 = loc.im fig, axs = plt.subplots(1, 3, figsize=(15, 5)) ctx.plot_map(loc, ax=axs[0]) ############################################################################### # The zoom level will be chosen for you by default, though you can specify # this manually as well: loc2 = ctx.Place("boulder", zoom=11) ctx.plot_map(loc2, ax=axs[1]) ############################################################################### # Downloading tiles from bounds # ============================= # # You can also grab tile information directly from a bounding box + zoom level. # This is demoed below: zoom = ctx.calculate_zoom(loc.w, loc.s, loc.e, loc.n) im2, bbox = ctx.bounds2img(loc.w, loc.s, loc.e, loc.n, zoom=zoom, ll=True) ctx.plot_map(im2, bbox, ax=axs[2], title="Boulder, CO") plt.show()