2013-02-05 8 views
5

Sto cercando di calcolare una distanza tra due punti in Oracle DB,Come utilizzare sdo_distance di Oracle

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

utilizzando questa istruzione 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; 

risultato è 12,7646185977151

Mentre lo fai usando l'API di CoreLocation di Apple:

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]; 

risultato è 46,0888946842423

propria implementazione

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.; 
} 

risultato è 46,120690774231

implementazione di Oracle è chiaramente fuori, ma non vedo il motivo. Qualsiasi aiuto sarebbe molto apprezzato.

risposta

5

provare a invertire l'ordine delle ordinate, come in:

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; 

ottengo 46,087817955912.

Con SDO_GEOMETRY, le ordinate sono elencate in ordine X, Y (longitudine, latitudine).

Problemi correlati