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

时间:2016-02-25 19:22:33

标签: oracle geometry oracle-spatial

带有索引的表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函数的约束,让我不计算距离?

1 个答案:

答案 0 :(得分:0)

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

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运算符一起使用,其目标是将N个最接近的对象(此处为999最接近的邮政编码)返回给对象(邮政编码)。不是你想要的。

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