我有存储为结构对象的地方坐标和存储为双精度的建筑物坐标。
select geo.id, geo.object_id, geo.object_type, geo.date_created, t.x as longitude, t.y as latitude from geolocation geo, table(sdo_util.getvertices(geo.location)) t; --I can fetch places coordinates.
选择经度、建筑物纬度 -- 获取建筑物位置。
我必须找到这个地方位于哪个建筑(到附近建筑的最短距离(。 即
Place: longitude = 41.1111111, langitude = 42.2222222
Building 1: longitude = 41.1111112, langitude = 42.42.2222223
Building 2: longitude = 50.1111111, langitude = 50.2222222
Building 3: longitude = 60.1111111, langitude = 60.2222222
(我故意夸大了价值(
结果应该是:建筑物 1(这是附近的建筑物(。
如何使用SDO_GEOM。SDO_DISTANCE ?
对不起。我对SDO_GEOM一无所知。但是我可以展示一些数学,如果有帮助的话:
定义点 1 的矢量地心。定义另一个具有地心和另一个点的向量。两个向量的点积为您提供了这两个向量之间角度的余弦。
具有最大点积的点是离点 1 最近的点。
有关具有球面坐标的点积,请参阅这篇文章。
您可以采用所有向量具有相同r
的近似值。因为您对最大值(不是实际距离(感兴趣,所以可以使用r1 = r2 = 1
另外,在该帖子中φ = 90 - latitude
.记住 sin(a( = cos(90-a(。
进行两次更正,您需要的最终公式是
d = cosφ1 cosφ2 cos(θ1−θ2) + sinφ1 sinφ2
带φ
= 纬度,θ
= 经度