Python PostGIS中多边形内的点

Python PostGIS中多边形内的点,python,postgresql,postgis,psycopg2,Python,Postgresql,Postgis,Psycopg2,我有一个表samplecol,其中包含(一个样本): 我尝试使用以下方法获取多边形内的所有点: 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, 3

我有一个表samplecol,其中包含(一个样本):

我尝试使用以下方法获取多边形内的所有点:

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)
我不知道结果中有什么是错误的。这是正确的方法还是我做错了什么


此外,此代码还使用了字段
中的索引。\u geom

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

为了测试您的查询,我在中的某个位置添加了另一个点,它位于多边形的内部,它返回的
true
与预期一样(insert语句中的最后一个几何体为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)

顺便说一句:存储与
几何体
数字
相同的坐标是完全多余的。您可能希望去掉列
纬度
经度
,并根据需要提取它们的值。

为什么表中有
纬度
经度
几何图形
是否应该是它们对应的
?那么这个表没有正确的标准化,这可能是您的问题的一部分。所以您的意思是纬度经度不能在表上?查找我创建的多边形中的所有点的函数是错误的?如果
几何图形
是实际点,则lat和lon已经在其中(使用
st_x
和/或
st_y
获取它们)。当您在表中另外添加它们时,可能会发现,
的lat和/或lon与其他列中的不同。这可能会给你一个结果,看起来不对,因为你看到的坐标实际上没有被使用。但是您没有回答列之间是否存在这种关系。连接是:更新samplecol设置_geom=ST_GeomFromText('点('| | | | |'''''| | | |'),4326);然后,
经度
纬度
是冗余的。只保存
。非常感谢。我会试试并通知你。我刚刚想到了以下想法:确保你没有错放坐标对。WGS84需要经度,纬度,而不是经度,经度。后者将位于多边形内部。我已经完成了以下操作:更新samplecol设置_geom=ST_GeomFromText('点('| | | | | |')','纬度| | |'),4326),所以我有经度第一和纬度第二。我想我没事吧?是这样吗?我还有一个问题。我修正了多边形,现在代码返回所有的“t”。我不明白我怎么能得到真正的坐标。你能提供一个解决方案吗?谢谢Q1)我建议您使用内置的postgis函数来创建点,例如:
选择ST_SetGrid(ST_MakePoint(-4.4427,36.7233),4326)(马拉加语中的同一点),因此您可以确保结果与其他函数所期望的完全相同。q2)如果函数返回
true
,则表示所有点都在给定多边形内。你能分享固定多边形让我看一下吗?如果我想在查询中也获取容器散列,我能在单个查询中实现吗?
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)