如何在go.Scattermapbox上绘制多边形及提取经纬度方法咨询
解决方案:在Scattermapbox上添加多边形凸包
1. 解析POLYGON格式数据
你的多边形数据是WKT格式(Well-Known Text),核心是提取括号内的经纬度对,注意WKT里的坐标顺序是经度在前,纬度在后。可以用正则表达式快速解析:
import re import pandas as pd # 假设多边形数据存储在DataFrame的`geometry`列中 polygons_df = pd.DataFrame({ 'geometry': [ 'POLYGON ((13.77168 45.55315, 13.76797 45.55402, 13.76898 45.55429, 13.77202 45.55397, 13.77309 45.55315))', 'POLYGON ((11.99333 51.47548, 11.98722 51.48514, 11.98768 51.48617, 11.98827 51.48736, 11.98868 51.48823, 11.99333 51.47548))' ] }) # 定义解析函数 def parse_wkt_polygon(wkt_str): # 提取括号内的坐标字符串 coords_part = re.findall(r'\(\((.*?)\)\)', wkt_str)[0] # 分割每个坐标点 points = coords_part.split(', ') # 拆分经纬度并转换为浮点数 lon_lat_pairs = [tuple(map(float, point.split())) for point in points] # 分离经度和纬度列表 lons = [pair[0] for pair in lon_lat_pairs] lats = [pair[1] for pair in lon_lat_pairs] # 确保多边形闭合(最后一个点与第一个点重合) if lons[-1] != lons[0] or lats[-1] != lats[0]: lons.append(lons[0]) lats.append(lats[0]) return lons, lats # 应用解析函数,生成经纬度列 polygons_df[['lon', 'lat']] = polygons_df['geometry'].apply( lambda x: pd.Series(parse_wkt_polygon(x)) )
2. 批量添加多边形轨迹到地图
不需要把所有多边形的经纬度合并到同一列,逐个多边形添加独立轨迹是更灵活的方案——可以分别设置每个多边形的样式(颜色、透明度等),也便于后续维护:
# 遍历每个多边形,添加到地图 for _, row in polygons_df.iterrows(): fig.add_trace( go.Scattermapbox( mode="lines", fill="toself", lon=row['lon'], lat=row['lat'], # 自定义样式示例 fillcolor='rgba(0, 128, 255, 0.2)', # 填充色+透明度 line=dict(color='darkblue', width=2), # 边框样式 name='Cluster Convex Hull' # 轨迹名称,会显示在图例中 ) )
关键细节说明
- 坐标顺序:WKT格式的POLYGON是
经度 纬度,提取时不要搞反,否则多边形会出现在错误位置。 - 闭合要求:必须保证多边形的最后一个点与第一个点坐标一致,否则
fill="toself"无法正确填充区域。 - 性能考量:如果多边形数量超过1000个,可以考虑将所有多边形的经纬度打包为列表的列表,合并成单个轨迹添加,但独立轨迹的可读性和可定制性更强。
内容的提问来源于stack exchange,提问作者Florida Man
相关产品推荐
相关产品推荐

