I followed some of the suggestions that were posted online but I’m getting
HTTP Error 404: Not Found
with my below test script (Note-my actual API-key from StadiaMaps is replaced with X below):
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from cartopy.io.img_tiles import Stamen
import cartopy.io.img_tiles as cimgt
class Stamen(cimgt.Stamen):
def _image_url(self, tile):
x,y,z = tile
url = "https://tiles.stadiamaps.com/tiles/stamen_terrain_background/{z}/{x}/{y}{r}.png?api_key={XXXXXX-XXXX-XXXX-XXXX-XXXXXXXX}"
return url
def main():
tiler = Stamen('terrain_background')
fig = plt.figure(figsize=(10, 5))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
ax.set_extent([32.08, 45, 12, 32], crs=ccrs.PlateCarree())
ax.add_image(tiler, 8)
ax.scatter(36.116, 25.772, transform=ccrs.PlateCarree(), marker='.', s=1200, c='purple')
ax.scatter(40.743, 18.58, transform=ccrs.PlateCarree(), marker='.', s=300, c='purple')
ax.scatter(37.929, 22.046, transform=ccrs.PlateCarree(), marker='.', s=50, c='purple')
ax.scatter(34.507, 27.897, transform=ccrs.PlateCarree(), marker='.', s=300, c='purple')
ax.scatter(39.799, 17.996, transform=ccrs.PlateCarree(), marker='.', s=1800, c='purple')
ax.scatter(38.781, 20.525, transform=ccrs.PlateCarree(), marker='.', s=600, c='purple')
ax.coastlines(resolution='10m')
plt.gcf().set_size_inches(20,10)
plt.savefig("test_RedSeaMap_HiRes.png", dpi=600)
plt.savefig("test_RedSeaMap_HiRes.jpg", dpi=600)
plt.savefig("test_RedSeaMap_HiRes.svg")
plt.show()
if __name__ == '__main__':
main()
I’ve also made the following modifications to conda_new_cartopy_env/lib/python3.12/site-packages/cartopy/io/img_tiles.py
def __init__(self, style='toner',
desired_tile_form=None, cache=False):
warnings.warn("The Stamen styles are no longer served by Stamen and "
"are now served by Stadia Maps. Please use the "
"StadiaMapsTiles class instead.")
# preset layer configuration
layer_config = {
'terrain': {'extension': 'png', 'opaque': True},
'terrain_background': {'extension': 'png', 'opaque': True},
'terrain_labels': {'extension': 'png', 'opaque': False},
'terrain_lines': {'extension': 'png', 'opaque': False},
'toner_background': {'extension': 'png', 'opaque': True},
'toner': {'extension': 'png', 'opaque': True},
'toner_hybrid': {'extension': 'png', 'opaque': False},
'toner_labels': {'extension': 'png', 'opaque': False},
'toner_lines': {'extension': 'png', 'opaque': False},
'toner_lite': {'extension': 'png', 'opaque': True},
'watercolor': {'extension': 'jpg', 'opaque': True},
}
def _image_url(self, tile):
x, y, z = tile
return 'http://tile.stamen.com/' +
f'{self.style}/{z}/{x}/{y}.{self.extension}' +
'myapikeyXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX'