sql - 显示包含建筑物质心的地 block 的空间 SQL 查询

标签 sql spatial-query parcel oracle-spatial centroid

我正在尝试编写一个查询,以选择包含特定建筑代码 (bldg_code = 3) 的质心 的地 block 。

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

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

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

有什么想法吗?

最佳答案

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

请注意,此函数提供的质心只是数学质心,可能并不总是位于几何体内部,例如,如果您的多边形为 L 形。 SpatialDB Adviser 有 a good article on this ,但这里有一个简单的例子:

Centroid laying outside its parent geometry

如果这对您来说不是问题并且您不需要那种级别的准确性,只需使用内置的,但如果您确实认为这是一个问题(就像我过去所做的那样),那么SpatialDB Adviser 有 a standalone PL/SQL package that corrrectly calculates centroids .

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

您的查询看起来像这样:

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

请注意,这是在空间索引的 a.geom 列和一个新列 b.centroid 的基础上使用 SDO_CONTAINS已添加并填充(注意 - 查询未测试)。如果分区几何未按空间索引,则您需要使用 SDO_GEOM.RELATE,或对质心列进行索引并反转逻辑以使用 SDO_INSIDE

关于sql - 显示包含建筑物质心的地 block 的空间 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15079142/

相关文章:

php - MySQL - 跨两个表的最佳实践

sql - 将点连接到一个点

java - Android Parcelable 占用更多内存

node.js - 无法调用位方法

android - 使用可打包对象时无法获取列表元素

java - 如何在Java中Parcelable类中打包Object类型

java - SQL 开发人员 ORA-29531

c# - ADO 异步查询超时

mysql - 使用现有行中的数据插入行

php - 无法使用 mysql 点类型查询检索所有点