5

Oracle DB で 2 点間の距離を計算しようとしていますが、

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 の実装は明らかに間違っていますが、その理由はわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

6

次のように、縦座標の順序を逆にしてみてください。

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 (経度、緯度) の順に表示されます。

于 2013-02-06T02:37:16.490 に答える