在PostgreSQL / PostGIS中的多边形交点内查找点

时间:2019-06-25 10:44:26

标签: postgresql postgis psycopg2

我想在PostgreSQL中找到多边形交点(图1)内的点。

图1示例 enter image description here

我使用psycopg2,而我使用的代码是:

intersects = """select ST_Intersects( ST_GeographyFromText('SRID=4326; POLYGON(( 32.0361328 33.6877818, 31.9042969 33.5780147,33.5742188 11.3507967,66.2695313 20.4270128, 51.9433594 34.270836, 32.0361328 33.6877818))'),
              ST_GeographyFromText('SRID=4326; POLYGON((33.7060547 37.1953306,36.6943359 16.0880422,64.9072266 12.4258478,64.8632813 37.0551771,33.5742188 37.1953306,33.7060547 37.1953306))')), col.vessel_hash,ST_X(col.the_geom) AS long, ST_Y(col.the_geom) AS lat
        from samplecol as col"""

        cursor.execute(intersects)
        pointsINtw = cursor.fetchall()
        count = 0;
        shipsrecords = open("/home/antonis/Desktop/testme1.txt", "w")
        for ex in pointsINtw:
            if str(ex[0])=='True':
                count = count + 1
                shipsrecords.write(str(ex) + "\n")

        print (CBLUE + "Number of returned results: " + CBLUEEND), count

示例记录:

vessel_hash  | speed |  latitude   |  longitude  | course | heading |        timestamp         |                      the_geom                      
--------------+--------+---------+-------+-------------+-------------+--------+---------+--------------------------+----------------------------------------------------
 103079215239 | 5     | -5.41844510 | 36.12160900 | 314    | 511     | 2016-06-12T06:31:04.000Z | 0101000020E61000001BF33AE2900F424090AF4EDF7CAC15C0

问题是上述代码无法正常工作。我创建了两个如图1所示的多边形,并且我知道相交内部存在一些点。但是代码总是返回db中的所有点。

如果我创建两个不相交的多边形,则该算法似乎正常运行,因为它不返回任何点。

有人知道我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

demo:db<>fiddle(对于您的查询,带有多边形,自己的点),

visualisation of the situation(也许需要Chrome)

ST_Intersects()仅检查两个给定的多边形是否共享一些空间。的确,他们共享。但是查询中没有任何部分包含带有点的检查。您只调用交集检查,而无需使用点列。<​​/ p>


我相信您需要计算交集多边形(ST_Intersection())而不是仅检查其存在性。之后,您可以使用此结果来检查您的点是否在其中(ST_Contains()):

伪代码:

SELECT
    ST_Contains(
        ST_Intersection(my_geometry1, my_geometry2),
        my_pointgeometry
    )
...

demo:db<>fiddle (演示使用几何图形而不是地理图形,并且出于某些原因,多边形需要有效;因此您需要根据使用情况进行调整)