【问题标题】:Points inside polygon in PostGISPostGIS中多边形内的点
【发布时间】:2018-11-12 21:52:34
【问题描述】:

我有一个包含(样本)的表 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字段中的索引?

【问题讨论】:

  • 为什么表格中有latitudelongitudethe_geom 应该是他们对应的Point 吗?那么这个表没有正确规范化,这可能是你问题的一部分。
  • 所以你的意思是纬度经度一定不能放在桌子上?查找我创建的多边形中所有点的功能错误?
  • 如果the_geom 是实际点,则经纬度已经存在(使用st_x 和/或st_y 获取它们)。当您在表中另外添加它们时,the_geom 的纬度和/或经度可能与其他列中的不同。这可能会给你一个看起来不正确的结果,因为你正在查看实际上没有使用的坐标。但是您没有回答列之间是否存在这种关系。
  • 连接是:UPDATE samplecol SET the_geom = ST_GeomFromText('POINT(' || longitude || ' ' || latitude || ')',4326);
  • 那么longitudelatitude 是多余的。只保存Point

标签: python postgresql postgis psycopg2


【解决方案1】:

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

为了测试您的查询,我在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_XST_Y 提取它们的值。

【讨论】:

  • 非常感谢。我会尝试并通知你。
  • 我突然想到以下想法:确保您没有放错坐标对。 WGS84 需要 longitude, latitude,而不是 latitude,longitude。后者将在您的多边形内。
  • 我已经这样做了: UPDATE samplecol SET the_geom = ST_GeomFromText('POINT(' || longitude || ' ' || latitude || ')',4326); ,所以我有经度第一和纬度第二。所以我觉得我还好吗?这是正确的吗?另外我还有一个问题。我修复了我的多边形,现在代码返回所有“t”。我不明白如何获取真实坐标。你能提供一个解决方案吗?谢谢
  • q1) 我建议你使用内置的postgis函数来创建点,例如:SELECT ST_SetSRID(ST_MakePoint(-4.4427,36.7233),4326);(马拉加的同一个点),这样你就可以确定结果是什么其他功能会期望。 q2) 如果函数返回true,则意味着所有点都在给定的多边形内。你能分享一下fixed多边形让我看看吗?
  • 另外,如果我想在查询中同时获取vessel_hash,我可以在单个查询中实现吗?
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 2018-09-22
  • 2015-03-06
  • 2019-11-07
  • 1970-01-01
  • 2018-06-27
  • 2010-12-24
  • 2018-02-28
相关资源
最近更新 更多