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

Folium地图经度-180至180范围显示问题及几何叠加方向反转的解决方法咨询

解决Folium中圆形几何图形左右颠倒及经度范围显示问题

我来帮你搞定这两个问题——你的核心困扰其实是生成的圆形线条因为跨越了180°经线,导致Folium渲染时把本该在右侧的部分“绕”到了左侧,几何叠加方向的问题也和经度范围的处理直接相关。

问题根源

当你用方位等距投影(aeqd)生成大半径圆形,转换回WGS84(EPSG:4326)后,几何图形的坐标会包含大于180°的经度值。而Folium遵循的GeoJSON标准默认处理的经度范围是-180°到180°,它会把>180°的经度直接当作相邻的-180°侧坐标来渲染,最终导致线条显示方向完全颠倒。

解决方案:调整经度坐标范围

我们可以在转换回WGS84后,把所有大于180°的经度减去360°,转换成对应的负经度值,这样Folium就能正确识别并渲染出正常的圆形。

修改后的完整代码如下:

import pandas as pd
import geopandas as gpd
import folium
from shapely.geometry import Polygon, Point, LineString
from shapely.ops import transform
from functools import partial
import pyproj

def adjust_longitude(geom):
    """调整几何图形的经度,将>180°的转为负经度"""
    def _fix_coords(coords):
        return [(lon - 360 if lon > 180 else lon, lat) for lon, lat in coords]
    
    if isinstance(geom, Polygon):
        exterior = _fix_coords(geom.exterior.coords)
        interiors = [_fix_coords(ring.coords) for ring in geom.interiors]
        return Polygon(exterior, interiors)
    elif isinstance(geom, LineString):
        return LineString(_fix_coords(geom.coords))
    else:
        return geom

def circle(lon):
    lat=0
    radius = 12756000
    local_azimuthal_projection = "+proj=aeqd +R=6378000 +units=m +lat_0={} +lon_0={}".format(lat, lon)
    # 移除多余引号,避免pyproj解析错误
    wgs84_to_aeqd = partial(pyproj.transform, 
                           pyproj.Proj("+proj=longlat +datum=WGS84 +no_defs"), 
                           pyproj.Proj(local_azimuthal_projection))
    aeqd_to_wgs84 = partial(pyproj.transform, 
                           pyproj.Proj(local_azimuthal_projection), 
                           pyproj.Proj("+proj=longlat +datum=WGS84 +no_defs"))
    center = Point(float(lon), float(lat))
    point_transformed = transform(wgs84_to_aeqd, center)
    buffer = point_transformed.buffer(radius/1.4, resolution=64)
    circle_poly = transform(aeqd_to_wgs84, buffer)
    # 新增:调整经度范围,修正渲染方向
    circle_poly = adjust_longitude(circle_poly)
    elevation=LineString(list(circle_poly.exterior.coords))
    return elevation

elevation = circle(100)
test = pd.DataFrame({'geometry':[elevation]})
# 标准化crs参数格式,移除多余引号
test = gpd.GeoDataFrame(test , geometry='geometry', crs="EPSG:4326")
# 添加默认定位和缩放参数,方便查看效果
m = folium.Map(control_scale=True, location=[0, 100], zoom_start=1)
tooltip=folium.GeoJson(test , name='circle').add_to(m)
folium.LayerControl().add_to(m)
m

除了核心的经度调整逻辑,我还修复了代码里两个容易踩坑的小细节:

  • 移除了pyproj.Proj参数中多余的引号,避免投影解析报错
  • 给地图添加了location和zoom_start参数,默认定位到圆形中心,方便直接查看效果

替代工具推荐

如果经常处理跨180°经线的地理可视化,这些工具可能更省心:

  • Leafmap:基于Folium和Ipyleaflet的高阶库,内置了处理跨日界线几何图形的工具,不需要手动调整坐标
  • Plotly Express:交互式可视化库,对地理图形的自动适配性更强,支持直接渲染跨180°的几何
  • Cartopy:适合静态地图绘制,对投影和坐标范围的控制非常灵活,能轻松处理各种边界情况

内容的提问来源于stack exchange,提问作者goanes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 23:43:15