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

经纬度是否在Shapefile中判断返回False问题排查求助

问题排查与解决方案

你的代码里有三个核心问题导致顶点判断返回False,下面逐一说明并给出修正方案:

1. 手动四舍五入导致精度丢失与拓扑偏差

你提取多边形坐标后做了round(coord,4)处理,再重构新Polygon。原始顶点可能有更多小数位(比如130.89283),四舍五入后会和传入的点(130.8928)产生微小偏移,同时重构的多边形边的位置也会变化,导致原本的顶点不在新多边形的边界上。

2. contains方法不包含多边形边界

Shapely的contains方法仅判定点是否完全在多边形内部(不含边界),而多边形顶点属于边界范围,因此返回False。需要改用covers或within方法,这两个方法会包含边界点的判断。

3. 不必要的多边形重构操作

从GeoDataFrame中提取的polygon = soa_shape_map_geo['geometry'].iloc[0]本身就是合法的Shapely Polygon对象,无需重新提取坐标再构建,这一步完全多余且引入了问题。

修正后的代码

import geopandas as gpd
from shapely.geometry import Point

in_shp = 'C:\\shape_file.shp'

# 读取Shapefile并转换为WGS84坐标系
soa_shape_map = gpd.read_file(in_shp)
soa_shape_map_geo = soa_shape_map.to_crs(epsg=4326)

# 直接使用原始Polygon对象,跳过冗余的重构步骤
polygon = soa_shape_map_geo['geometry'].iloc[0]

def check_point_in_polygon(lon, lat):
    point = Point(lon, lat)
    # covers方法包含边界与内部点的判断
    return polygon.covers(point)
    # 也可以使用point.within(polygon),效果一致

# 测试多边形首个顶点(正确坐标顺序)
print(check_point_in_polygon(130.8928, -12.4831))
# 注意:第二个测试是经纬度写反了,返回False是正常结果
print(check_point_in_polygon(-12.4831, 130.8928)) 

额外提示

  • 第二个测试调用的坐标顺序错误(把纬度当经度传入),这个点的位置和目标多边形无关,返回False是合理的。
  • 如果必须做精度处理,推荐使用Shapely官方的reduce_precision方法,而非手动四舍五入,能更好地保留多边形拓扑结构:
    from shapely.geometry.precision import reduce_precision
    polygon = reduce_precision(polygon, grid_size=0.0001) # 对应四位小数精度
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 22:48:37