You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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&center=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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:30:59