3

我正在尝试编写一个查询来选择包含某个建筑代码(bldg_code = 3)的质心的地块。

宗地列在“city.zoning”表中,并包含一个用于每个宗地的 PIN、几何和面积的列。表“buildings”包含 bldg_type 和 bldg_code 列,指示建筑物类型及其对应的代码。此查询感兴趣的建筑物类型的 bldg_code 为 3。

到目前为止,我已经开发了一个查询来显示与感兴趣的建筑物类型交互的地块:

select a.*
from city.zoning a, username.buildings b
where b.bldg_code = 3 and sdo_anyinteract(a.geom,b.geom) = 'TRUE';

有任何想法吗?

4

1 回答 1

2

您可以使用SDO_GEOM.SDO_CENTROID文档)找到几何的质心。

请注意,此函数提供的质心只是数学质心,可能并不总是位于几何图形,例如,如果您的多边形是 L 形的。SpatialDB Adviser 对此有一篇很好的文章,但这里有一个简单的说明:

位于其父几何体之外的质心

如果这对您来说不是问题并且您不需要那种级别的准确性,只需使用内置的,但如果您确实认为这是一个问题(就像我过去所做的那样),那么 SpatialDB Adviser 有一个独立的 PL/SQL 包,可以正确计算 centroids

根据您的性能需求,您可以即时计算质心并直接在查询中使用它们,或者,将质心列添加到表中并使用应用程序代码(最佳情况)或触发器计算和缓存值(最差的情况)。

您的查询将如下所示:

SELECT a.*
FROM city.zoning a
JOIN username.buildings b ON sdo_contains(a.geom, b.centroid) = 'TRUE'
WHERE b.bldg_code = 3  

请注意,这是SDO_CONTAINS基于a.geom被空间索引的列和b.centroid已添加和填充的新列(注意 - 未测试查询)。如果分区几何没有空间索引,那么您需要使用SDO_GEOM.RELATE或索引质心列并反转要使用的逻辑SDO_INSIDE

于 2013-02-26T09:18:36.957 回答