【问题标题】:Spatial SQL query showing parcels containing centroid of building显示包含建筑物质心的地块的空间 SQL 查询
【发布时间】:2013-02-11 07:33:52
【问题描述】:

我正在尝试编写一个查询来选择包含某个建筑代码(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';

有什么想法吗?

【问题讨论】:

    标签: sql spatial-query parcel oracle-spatial centroid


    【解决方案1】:

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

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

    如果这对您来说不是问题并且您不需要该级别的准确度,只需使用内置的,但如果您确实认为这是一个问题(就像我过去所做的那样),那么SpatialDB 顾问有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

    【讨论】:

    • 这回答了我的问题。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    相关资源
    最近更新 更多