python - PostGIS 中多边形内的点

标签 python postgresql postgis psycopg2

我有一个包含(示例)的表 samplecol:

vessel_hash  | status | station | speed |  latitude   |  longitude  | course | heading |        timestamp         |                      the_geom                      
--------------+--------+---------+-------+-------------+-------------+--------+---------+--------------------------+----------------------------------------------------
 103079215239 | 99     | 841     | 5     | -5.41844510 | 36.12160900 | 314    | 511     | 2016-06-12T06:31:04.000Z | 0101000020E61000001BF33AE2900F424090AF4EDF7CAC15C0
 103079215239 | 99     | 3008    | 0     | -5.41778710 | 36.12144900 | 117    | 511     | 2016-06-12T06:43:27.000Z | 0101000020E6100000E2900DA48B0F424042C3AC61D0AB15C0
 103079215239 | 99     | 841     | 17    | -5.42236900 | 36.12356900 | 259    | 511     | 2016-06-12T06:50:27.000Z | 0101000020E610000054E6E61BD10F42407C60C77F81B015C0
 103079215239 | 99     | 841     | 17    | -5.41781710 | 36.12147900 | 230    | 511     | 2016-06-12T06:27:03.000Z | 0101000020E61000004D13B69F8C0F424097D6F03ED8AB15C0
 103079215239 | 99     | 841     | 61    | -5.42201900 | 36.13256100 | 157    | 511     | 2016-06-12T06:08:04.000Z | 0101000020E6100000CFDC43C2F71042409929ADBF25B015C0
 103079215239 | 99     | 841     | 9     | -5.41834020 | 36.12225000 | 359    | 511     | 2016-06-12T06:33:03.000Z | 0101000020E6100000CFF753E3A50F42408D68965F61AC15C0

我尝试获取多边形内的所有点:

poisInpolygon = """SELECT col.vessel_hash,col.longitude,col.latitude,
            ST_Contains(ST_GeomFromEWKT('SRID=4326; POLYGON((-15.0292969 47.6357836,-15.2050781 47.5172007,-16.2597656 29.3821751, 35.0683594 26.1159859, 38.0566406 47.6357836,-15.0292969 47.6357836))'),
            ST_GeomFromEWKT(col.the_geom)) FROM samplecol As col;"""

输出是:

(103079215291L, Decimal('40.87123100'), Decimal('29.24107000'), False) 

(103079215291L, Decimal('40.86702000'), Decimal('29.23967000'), False) 

(103079215291L, Decimal('40.87208200'), Decimal('29.22113000'), False) 

(103079215291L, Decimal('40.86973200'), Decimal('29.23963000'), False) 

(103079215291L, Decimal('40.87770800'), Decimal('29.20229900'), False)

我不明白结果中的 False 是什么。这是正确的方法还是我做错了什么?

此代码还使用 the_geom 字段中的索引吗?

最佳答案

查询返回 false 因为样本中的所有点都在给定的多边形之外。这是您的点(坦桑尼亚东北部某处)和多边形(南欧和北非)的概述:

enter image description here

为了测试您的查询,我在 Málaga 的某处添加了另一个点,它位于您的多边形内部,并且它按预期返回 true(插入语句中的最后一个几何图形为 EWKT)。这是脚本:

CREATE TEMPORARY TABLE t (the_geom GEOMETRY);
INSERT INTO t VALUES ('0101000020E61000001BF33AE2900F424090AF4EDF7CAC15C0'),
             ('0101000020E6100000E2900DA48B0F424042C3AC61D0AB15C0'),
             ('0101000020E610000054E6E61BD10F42407C60C77F81B015C0'),
             ('0101000020E61000004D13B69F8C0F424097D6F03ED8AB15C0'),
             ('0101000020E6100000CFDC43C2F71042409929ADBF25B015C0'),
             ('0101000020E6100000CFF753E3A50F42408D68965F61AC15C0'),
             (ST_GeomFromEWKT('SRID=4326;POINT(-4.4427 36.7233)'));

这是您的查询:

db=# SELECT 
ST_Contains(ST_GeomFromEWKT('SRID=4326; POLYGON((-15.0292969 47.6357836,-15.2050781 47.5172007,-16.2597656 29.3821751, 35.0683594 26.1159859, 38.0566406 47.6357836,-15.0292969 47.6357836))'),
            ST_GeomFromEWKT(col.the_geom)) 
FROM t As col;

st_contains 
-------------
 f
 f
 f
 f
 f
 f
 t
(7 Zeilen)

顺便说一句:存储与 GEOMETRYNUMERIC 相同的坐标是完全多余的。您可能想要删除列 latitudelongitude 并使用 ST_X 提取它们的值和 ST_Y按需。

关于python - PostGIS 中多边形内的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50665715/

相关文章:

python - 修改多边形,使它们不重叠并且面积保持不变

python - 如何在 python 中向绘图添加一些统计信息

python - 在 python 中执行 OneHotEncoder 后保留列名的最佳方法是什么?

postgresql - PSQL:聚合函数(总和)不起作用

postgresql - 在psql的一列中连接日期(时间戳)和小时(数字)列

postgresql - Debian 包 postgresql-9.3-postgis-2.1 突然停止安装

postgresql - Postgres 9.3 的 Docker 入口点

python - python 字符串格式中的元组?

Python:服务多个用户的最佳方式?

Java Hibernate 奇怪的编码错误?