一、问题现象描述
在使用Plotly的add_scattergeo()方法绘制地理散点图时,开发者经常遇到坐标点显示位置异常的情况。典型表现为:
- 坐标点偏离预期地理位置
- 某些坐标点显示在错误的大洲
- 部分数据点神秘消失
- 经纬度坐标出现镜像对称错误
二、根本原因分析
通过分析GitHub issue和Stack Overflow的案例,我们发现主要问题集中在以下方面:
1. 坐标系标准混淆
地理坐标系存在多种标准(WGS84、GCJ-02、BD09等),Plotly默认使用WGS84坐标系。当输入其他坐标系数据时会导致位置偏移。例如中国地图数据若使用GCJ-02坐标而不转换,会出现500-1000米的偏差。
# 错误示例:直接使用GCJ-02坐标
fig.add_scattergeo(
lon = [121.472644], # 未转换的GCJ-02坐标
lat = [31.231706],
mode = 'markers'
)
2. 经纬度顺序错误
Plotly严格要求经度在前纬度在后(lon/lat),但部分地理数据库使用相反顺序。这种错误会导致坐标点出现在对称位置,如输入[lat, lon]格式数据时,北京的点可能显示在南非附近。
3. 值域范围异常
有效的经纬度范围应为:经度[-180,180],纬度[-90,90]。当数据包含:
- 经度>180或<-180的值
- 纬度>90或<-90的值
- None或NaN空值
都会导致显示异常。
三、6种解决方案
方案1:强制坐标系转换
使用第三方库如pyproj进行坐标转换:
from pyproj import Transformer
transformer = Transformer.from_crs("EPSG:4490", "EPSG:4326") # GCJ02转WGS84
lon, lat = transformer.transform(31.231706, 121.472644)
方案2:数据清洗验证
添加数据校验步骤:
def validate_coords(lon, lat):
assert -180 <= lon <= 180, f"Invalid longitude: {lon}"
assert -90 <= lat <= 90, f"Invalid latitude: {lat}"
return True
方案3:使用GeoJSON格式
通过GeoJSON规范确保数据格式正确:
fig.add_scattergeo(
geojson = {
"type": "FeatureCollection",
"features": [{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [lon, lat] # GeoJSON标准顺序
}
}]
}
)
四、高级调试技巧
当问题复杂时,建议:
- 使用
fig.full_figure_for_development()查看完整数据结构 - 开启
layout.geo.projection.scale参数调整投影比例 - 添加参考网格辅助定位:
layout.geo.lataxis.showgrid = True
五、最佳实践建议
根据我们的测试经验,推荐以下工作流:
- 数据采集阶段明确坐标系标准
- 预处理时进行坐标转换和验证
- 使用
plotly.express.scatter_geo()简化基础配置 - 分阶段验证:先显示单个点,再扩展数据集