经纬度是否在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
相关产品推荐
相关产品推荐

