gpt4 book ai didi

oracle - 如何使用 Oracle 的 sdo_distance

转载 作者:行者123 更新时间:2023-12-04 18:45:49 25 4
gpt4 key购买 nike

我正在尝试计算 Oracle DB 中两点之间的距离,

Point A is 40.716715, -74.033907
Point B is 40.716300, -74.033900

使用这个 sql 语句:
SELECT   sdo_geom.sdo_distance( sdo_geom.sdo_geometry(2001 ,8307 ,sdo_geom.sdo_point_type(40.716715, -74.033907 , NULL) ,NULL ,NULL)
,sdo_geom.sdo_geometry(2001 ,8307 ,sdo_point_type(40.716300,-74.033901, NULL) ,NULL ,NULL) ,0.0001 ,'unit=M') distance_in_m
from DUAL;

结果是 12.7646185977151

使用 Apple 的 CoreLocation api 执行此操作时:
CLLocation* pa = [[CLLocation alloc] initWithLatitude:40.716715 longitude:-74.033907];
CLLocation* pa2 = [[CLLocation alloc] initWithLatitude:40.716300 longitude:-74.033900];
CLLocationDistance dist = [pa distanceFromLocation:pa2];

结果是 46.0888946842423

自己实现
double dinstance_m(double lat1, double long1, double lat2, double long2){
double dlong = (long2 - long1) * d2r;
double dlat = (lat2 - lat1) * d2r;
double a = pow(sin(dlat/2.0), 2) + cos(lat1*d2r) * cos(lat2*d2r) * pow(sin(dlong/2.0), 2);
double c = 2 * atan2(sqrt(a), sqrt(1-a));
double d = 6367 * c;

return d * 1000.;
}

结果是 46.120690774231

Oracle 的实现显然已关闭,但我不明白为什么。任何帮助将不胜感激。

最佳答案

尝试颠倒纵坐标的顺序,如下所示:

SELECT sdo_geom.sdo_distance(sdo_geom.sdo_geometry(2001, 8307, sdo_geom.sdo_point_type(-74.033907, 40.716715, NULL), NULL, NULL),
sdo_geom.sdo_geometry(2001, 8307, sdo_point_type(-74.033901, 40.716300, NULL), NULL, NULL), 0.0001, 'unit=M') distance_in_m
from DUAL;

我得到 46.087817955912。

使用 SDO_GEOMETRY,纵坐标按 X、Y(经度、纬度)顺序列出。

关于oracle - 如何使用 Oracle 的 sdo_distance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14719217/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com