Oracle Spatial:加拿大邮政编码的 sdo_nn_distance 问题

Oracle Spatial: Issue with sdo_nn_distance for Canadian postal codes

空间数据在 table st_country_postal_code 中可用,带索引。为了获得邮政编码之间的距离,我们使用了以下查询:

SELECT sdo_nn_distance (1) distance, z.*
FROM st_country_postal_code z
WHERE z.postal_code = UPPER ('V3G1M2')
    AND z.country_id = '124'
    AND 'TRUE' = sdo_nn (z.spatial_data, (SELECT spatial_data FROM st_country_postal_code WHERE country_id = '124' AND postal_code = UPPER ('V2R0N3')), 'sdo_num_res=999 unit=' || 'KM', 1 );

对于某些加拿大邮政编码,如 V2R0N3V3G1M2J8H2A7,对于上述查询,我​​没有返回任何行。 sdo_nn 函数是否有不让我计算距离的约束?

如果您只想计算两个邮政编码之间的距离,那么您的计算方式非常复杂。简单正确的方法是这样的:

select sdo_geom.sdo_distance (a.spatial_data, b.spatial_data, 0.05, 'unit=km')
from st_country_postal_code a, st_country_postal_code b
where a.country_id = '124'
and a.postal_code = UPPER ('V3G1M2')
and b.country_id = '124'
and b.postal_code = UPPER ('V2R0N3');

即只需获取两个形状并计算它们之间的距离。

SDO_NN_DISTANCE() 构造专门与 SDO_NN 运算符结合使用,其目标是 return N 个最近的对象(这里是 999 个最近的邮政编码)到一个对象(邮政编码)。不是你真正想要的。

事实上,您看不到所有邮政编码的可能原因恰恰是因为您有效地搜索了与某个特定邮政编码最接近的 999 个邮政编码。我假设你没有看到的那些不在那个集合中。