如何使用ST_Intersection?


15

以下是我要执行的操作的简要摘要:Postgres中有3个表,“ a”和“ b”,每个表都有一个Polygon列,而“ c”有一个Point列。我在这里要做的是获取“ a”,“ b”和“ c”之间的几何形状相交,并在OpenLayers矢量层上显示此类几何形状。

我已经知道如何在OpenLayers中显示字符串中的任何几何形状,但是我在使用PostGIS的ST_Intersection函数时遇到了麻烦,我正在这样做:

SELECT ST_Intersection(a.geom, b.geom) as inter from a, b;

其中a.geom和b.geom都是几何列,并且我收到此错误消息:

NOTICE:  TopologyException: found non-noded intersection between 515172 2.14408e+06, 497067 2.13373e+06 and 501321 2.13546e+06, 471202 2.14843e+06 500621 2.13576e+06 
ERROR:  GEOS Intersection() threw an error!

我也尝试使用ST_AsText将生成的几何图形表示为文本,如下所示:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as inter from a, b;

但它向我发送此错误消息:

HINT: No function matches the given name and argument types. You might need to add explicit type casts.

我不知道自己在做什么错,我只想让Polygons的WKT在OpenLayers上显示它,这就是我从WKT显示几何的方法:

                    var in_options = {
                        'internalProjection': new OpenLayers.Projection("EPSG:4326"),
                        'externalProjection': new OpenLayers.Projection("EPSG:4326")
                    }; 

                    var fea= new OpenLayers.Format.WKT(in_options).read(data); //data is the string with the WKT
                    vectorLayer.addFeatures([fea]); //this piece of code works great
                    map.zoomToExtent(bounds);

更新:我尝试下一个:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab FROM a INNER JOIN b ON 
ST_Intersection(a,b) WHERE ST_Overlaps(a.geom, b.geom) 
AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

但我收到下一条错误消息:

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

我添加了isvalid来验证是否仅评估了有效的多边形,但是这表明错误在ST_Intersection(a,b)中,a,b和c都具有相同的SRID,所以我真的很困惑,如果我问得太多,但我对PostGIS还是很陌生,所以我希望我不会打扰您。谢谢。


1
什么SELECT PostGIS_Full_Version();回报?
Mike T

POSTGIS =“ 1.4.0” GEOS =“ 3.1.0-CAPI-1.5.0” PROJ =“ Rel。4.7.1,2009年9月23日” USE_STATS
Uriel

Answers:


8

我的猜测是,如果交集返回NULL,它将失败。因此,在尝试创建WKT之前,应添加一个where子句以检查是否确实存在交集。


我试过这个:从ST_Intersection(a,b)上的内部连接b中选择ST_Intersection(a.geom,b.geom)作为intersect_ab,在哪里ST_Overlaps(a.geom,b.geom)和ST_isvalid(a.geom)='t 'AND ST_isvalid(b.geom)='t'; 但它返回了相同的错误:**错误:函数st_intersection(a,b)不存在。提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。**我真的很坚持这一点,如果您能帮助我,我将非常感谢。
Uriel

尝试使用summary(a.geom)和summary(b.geom)研究值。
昏暗

摘要-------------------------- 1环0环的多边形[BS]有4点1环0环的多边形[BS]有4点带有1个环的环的点[BS]环0带10点
Uriel

是的,应该是ST_Intersection(a.geom,b.geom)而不是ST_Intersection(a,b)
较暗

6

线索是

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

如错误消息所述,您不能以这种方式使用st_intersection。总结其他答案,您应该使用如下所示的内容:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab 
FROM a INNER JOIN b ON ST_Intersects(a.geom,b.geom)
WHERE ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

AFAIK没有意义在同一句子中使用st_overlapsst_intersects,因为它们非常相似


4

我在多边形的不同层之间进行测试,如果其中一层中至少存在无效的几何图形,则测试失败。您是否使用ST_isvalid(the_geom)检查了多边形的有效性?这可能是关键。


我试过这个:从ST_Intersection(a,b)上的内部连接b中选择ST_Intersection(a.geom,b.geom)作为intersect_ab,在哪里ST_Overlaps(a.geom,b.geom)和ST_isvalid(a.geom)='t 'AND ST_isvalid(b.geom)='t'; 但它返回了相同的错误:**错误:函数st_intersection(a,b)不存在。提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。**我真的迷失了为什么它不起作用
Uriel

2

尝试这样的事情:

SELECT  ST_Intersection(a.geom, b.geom) As intersect_ab
    FROM a INNER JOIN b ON ST_Intersection(a,b)
    WHERE ST_Overlaps(a.geom, b.geom)
    ;

资源


我也尝试过,但是它返回相同的错误消息:提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
Uriel

如果使用“在ST_Intersection(a.geom,b.geom)上的INNER JOIN b”,该怎么办?
CaptDragon 2011年

它表明:错误:JOIN / ON的参数必须为布尔类型,而不是几何类型。
Uriel

shizer ...数据一定有问题,或者因为这种查询对我有用。
CaptDragon 2011年

我添加了AND ST_isvalid(a.geom)='t'和ST_isvalid(b.geom)='t'; 最后只评估有效的几何图形,但这是告诉我错误在于st_intersection(a,b)
Uriel

1

我试图排除无效的几何图形,但是它不起作用,所以最后我不得不删除每个无效的几何图形,然后使用此方法:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as intersect_ab FROM a,b 
WHERE ST_Overlaps(a.geom, b.geom) AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

如您所见,我省略了ST_Intersection(a,b)部分,而且效果很好,我有点可悲,因为我无法找到一种方法来从我的选择中排除任何无效的几何图形,无论如何都要感谢所有人的帮助在这里。


0

我曾经有这个问题。

<pre>NOTICE:  TopologyException: found non-noded intersection between xxx, xxxx and xxx, xxx  ERROR:  GEOS Intersection() threw an error!</pre>

我能够使用此方法解决此错误。
-使用QGIS-
从数据库中添加矢量层
-从错误消息中
   找出要点,然后在QGIS中搜索“ QuickWKT”(可使用插件)来查找它
-然后您将看到问题线串
-开启编辑模式
-选择“节点工具”以显示绿色节点(节点问题)
-将节点移离重叠节点
-保存更改

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.