2010-05-28 14 views

Répondre

2

Je n'ai pas trouvé une source, mais Je jouais avec cette méthode et j'ai conclu que le résultat s donné dans la même unité utilisée dans le WKT.

Et la distance est calculée en coordonnées planaires. Le SRID n'est pas pris en compte.

+1

Je suis désolé je suis nouveau à cela, mais pouvons-nous convertir ce 0.00134536240471071 au résultat attendu 147 par question? –

3

1 degré (votre unité d'entrée) ~ = 69 miles. Donc, si vous multipliez vos résultats par 69 miles et ensuite convertir en mètres, vous obtenez environ 149 mètres. Pas exactement ce que vous attendiez mais assez proche. Bien sûr, je ne pense pas que cela reproduise fidèlement la nature sphérique du globe, mais peut-être que je me trompe.

+1

Non, il ne reproduit pas la nature sphérique du globe. Si vous convertissez des distances près des pôles avec cette méthode, vous obtiendrez des valeurs inacceptables. –

+0

c'est assez précis pour moi! http://geography.about.com/library/faq/blqzdistancedegree.htm – tinybyte

4

Je suppose que c'est environ 3 ans trop tard pour l'OP, mais je suis arrivé à travers cette question en recherchant un sujet similaire, alors voici ma valeur de tuppence. Selon www.movable-type.co.uk/scripts/latlong.html, il existe 3 façons de calculer la distance à travers la surface de la Terre, du plus facile au plus complexe (et donc du moins au plus précis): approximation équirectangulaire, loi sphérique des cosinus et la formule de Haversine. Le site fournit également JavaScript. Ceci est la fonction d'approximation équirectangulaire:


function _lineDistanceC(lat1, lon1, lat2, lon2) { 
    var R = 6371; // km 
    lat1 = lat1.toRad(); 
    lon1 = lon1.toRad(); 
    lat2 = lat2.toRad(); 
    lon2 = lon2.toRad(); 
    var x = (lon2-lon1) * Math.cos((lat1+lat2)/2); 
    var y = (lat2-lat1); 
    return Math.sqrt(x*x + y*y) * R; 
} 

Ceci est ma tentative d'un équivalent SQL:


drop function if exists lineDistanceC; 
delimiter // 
CREATE FUNCTION lineDistanceC (la1 DOUBLE, lo1 DOUBLE, la2 DOUBLE, lo2 DOUBLE) RETURNS DOUBLE 
BEGIN 
    SET @r = 6371; 
    SET @lat1 = RADIANS(la1); 
    SET @lon1 = RADIANS(lo1); 
    SET @lat2 = RADIANS(la2); 
    SET @lon2 = RADIANS(lo2); 
    SET @x = (@[email protected]) * COS((@[email protected])/2); 
    SET @y = (@lat2 - @lat1); 
    RETURN (SQRT((@x*@x) + (@y*@y)) * @r); 
END 
// 
delimiter ; 

Je ne sais pas la précision de cette formule est, mais le site semble très crédible et mérite une visite pour plus de détails. En utilisant les coordonnées de la question, les résultats (en kilomètres) du JavaScript et SQL ci-dessus sont 0.14834420231840376 et 0.1483442023182845, ce qui les rend identiques à une fraction de millimètre, mais pas, curieusement, les 147 mètres attendus par l'OP. Prendre plaisir.

+0

C'est la fonction SQL la plus précise que j'ai trouvée pour déterminer la distance entre les emplacements géographiques. J'utilise simplement le X (fieldname), Y (fieldname) sur mon champ de données POINT pour envoyer le lat/lon à la fonction. – DaveK

0

Dans un degré de latitude, il y a environ 69 miles. En regardant la longitude, il y a environ 49 miles par degré. Lorsque j'essaie de calculer la distance entre NYC et LONDON, le nombre correct est de 49.

Sélectionnez Round (GLength (GeomFromText ('LineString (40.756054 -73.986951,51.5001524 -0.1262362)'))) * 49;