我想在PostgreSQL中找到多边形交点(图1)内的点。
我使用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中的所有点。
如果我创建两个不相交的多边形,则该算法似乎正常运行,因为它不返回任何点。
有人知道我在做什么错吗?
答案 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 (演示使用几何图形而不是地理图形,并且出于某些原因,多边形需要有效;因此您需要根据使用情况进行调整)