如何在Python中获取带MultiPolygon的静态地图图片
免费静态多边形地图实现方案
下面是几个满足需求的免费方案,支持传入多边形坐标、返回PNG格式静态地图,Python/Django环境均可直接使用:
1. Mapbox Static Images API(免费额度可用)
Mapbox提供每月50000次请求的免费静态地图API额度,完全支持多边形绘制。
- 使用方式:通过
path参数定义多边形样式和坐标,格式为path=stroke_color+stroke_weight,fill_color|lon1,lat1;lon2,lat2;... - Python请求示例:
import requests MAPBOX_ACCESS_TOKEN = "你的Mapbox免费Token" # 闭合多边形的经纬度串 polygon_coords = "-122.4,37.7;-122.3,37.7;-122.3,37.8;-122.4,37.8;-122.4,37.7" url = f"https://api.mapbox.com/styles/v1/mapbox/streets-v12/static/path-5+ff0000,0.5+00ff00({polygon_coords})/auto/600x400?access_token={MAPBOX_ACCESS_TOKEN}" response = requests.get(url) if response.status_code == 200: # Django视图中直接返回图片响应 from django.http import HttpResponse return HttpResponse(response.content, content_type='image/png') # 或保存为本地文件 # with open("static_map.png", "wb") as f: # f.write(response.content)
- 注意:注册Mapbox账号即可获取免费
access_token,免费层额度足够小型项目使用。
2. Geoapify Static Map API(免费层)
Geoapify静态地图API支持GeoJSON格式的多边形叠加,每月提供30000次免费请求。
- 使用方式:通过
overlay参数传入GeoJSON格式的多边形数据 - Python请求示例:
import requests import json GEOAPIFY_API_KEY = "你的Geoapify免费API Key" polygon_geojson = { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [[ [-122.4, 37.7], [-122.3, 37.7], [-122.3, 37.8], [-122.4, 37.8], [-122.4, 37.7] ]] }, "properties": {"fill": "#00ff00", "stroke": "#ff0000", "stroke-width": 2} } url = f"https://api.geoapify.com/v1/staticmap?style=osm-bright&width=600&height=400¢er=lonlat:-122.35,37.75&zoom=12&apiKey={GEOAPIFY_API_KEY}" overlay_params = {"overlay": json.dumps(polygon_geojson)} response = requests.get(url, params=overlay_params) if response.status_code == 200: from django.http import HttpResponse return HttpResponse(response.content, content_type='image/png')
- 注意:注册Geoapify免费账号即可获取API Key,支持自定义多边形的填充色、边框样式。
3. 本地生成方案(无外部API依赖)
如果不想依赖第三方API,可以用Python地理库本地生成PNG地图,适合离线场景:
- 依赖库:
geopandas、matplotlib、contextily(用于加载OSM底图) - 代码示例:
import geopandas as gpd import matplotlib.pyplot as plt from shapely.geometry import Polygon from django.http import HttpResponse import io # 定义多边形坐标 polygon_coords = [[-122.4, 37.7], [-122.3, 37.7], [-122.3, 37.8], [-122.4, 37.8], [-122.4, 37.7]] polygon = Polygon(polygon_coords) gdf = gpd.GeoDataFrame([1], geometry=[polygon], crs="EPSG:4326") # 转换坐标匹配底图投影 gdf = gdf.to_crs(epsg=3857) # 绘制地图 fig, ax = plt.subplots(figsize=(6, 4)) gdf.plot(ax=ax, facecolor='green', edgecolor='red', linewidth=2) # 添加OpenStreetMap底图 import contextily as ctx ctx.add_basemap(ax, source=ctx.providers.OpenStreetMap.Mapnik) # 转为PNG字节流 img_buffer = io.BytesIO() plt.savefig(img_buffer, format='png', bbox_inches='tight') img_buffer.seek(0) # Django视图返回响应 return HttpResponse(img_buffer, content_type='image/png')
- 注意:提前安装依赖库(
pip install geopandas matplotlib contextily),适合对隐私或离线环境有要求的场景。
内容的提问来源于stack exchange,提问作者Ernesto Ruiz
相关产品推荐
相关产品推荐

