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

如何用Python筛选位于任意多边形范围内的地理数据点?

不规则多边形内数据点筛选方案

方案一:Python结合几何库实现(推荐)

如果数据库不支持空间筛选,用Python的shapely库是最直接的解决方式,步骤如下:

  • 安装依赖库:pip install shapely
  • 用pyodbc拉取所有待筛选的坐标数据
  • 定义目标多边形的边界坐标(需按顺时针/逆时针顺序排列,保证多边形闭合)
  • 遍历每个数据点,判断是否在多边形内部

代码示例

import pyodbc
from shapely.geometry import Point, Polygon

# 1. 连接SQL并拉取数据
conn = pyodbc.connect('你的数据库连接字符串')
cursor = conn.cursor()
cursor.execute("SELECT lat, lon FROM your_target_table")
raw_points = cursor.fetchall()
conn.close()

# 2. 定义天使岛州立公园的多边形边界(替换为实际的边界坐标点)
# 注意:坐标要按顺序排列,首尾可重复保证闭合
angel_island = Polygon([
    (37.8600, -122.4350),
    (37.8650, -122.4300),
    (37.8680, -122.4200),
    (37.8630, -122.4100),
    (37.8580, -122.4150),
    (37.8590, -122.4320),
    (37.8600, -122.4350)  # 闭合点,可选
])

# 3. 筛选内部点
filtered_points = []
for lat, lon in raw_points:
    # shapely的Point参数是(经度, 纬度),注意和你的数据字段对应
    point = Point(lon, lat)
    if angel_island.contains(point):
        filtered_points.append((lat, lon))

# 后续处理:比如写入数据库或输出
print(f"共筛选出{len(filtered_points)}个内部点")

注意事项

  • 多边形坐标顺序不能乱,否则会生成交叉的无效多边形,导致判断错误
  • 确认经纬度的顺序和shapely的要求一致,搞反会导致所有点判断错误
  • 如果数据量超大(百万级以上),先在SQL里用正方形范围初步过滤,再用Python精准筛选,能大幅提升速度

方案二:SQL原生空间筛选(效率更高)

如果你的数据库支持空间扩展(比如PostgreSQL+PostGIS、SQL Server),直接用SQL就能完成筛选,不用Python介入:

  • 将多边形转为数据库支持的空间对象
  • 用内置的空间函数判断点是否在多边形内

示例SQL(PostGIS为例)

SELECT lat, lon
FROM your_target_table
WHERE ST_Contains(
    -- 定义多边形,SRID=4326代表WGS84坐标系(GPS常用)
    ST_GeomFromText('POLYGON((-122.4350 37.8600, -122.4300 37.8650, -122.4200 37.8680, -122.4100 37.8630, -122.4150 37.8580, -122.4320 37.8590, -122.4350 37.8600))', 4326),
    -- 将数据点转为空间对象
    ST_SetSRID(ST_MakePoint(lon, lat), 4326)
);

这个方案效率比Python高,适合数据量较大的场景,但前提是数据库支持空间扩展。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:33:37