2017-10-09 8 views
1

j'ai une requête comme ceci:Essayer de calculer la distance entre deux points lat-lng dans PostgreSQL - quelle est l'unité de la valeur de retour de PostgreSQL earth_box (ll_to_earth)?

SELECT * FROM chat_rooms 
WHERE earth_box(ll_to_earth(5, 5), 111000) @> ll_to_earth(lat, lng); 

Essentiellement, je lat = lng = 5 dans la requête, et dans ma table chat_rooms j'ai deux entrées, l'une avec lat=lng=5, l'autre avec lat=lng=4. À l'aide d'une calculatrice en ligne, la distance entre ces deux entrées est de 157 miles = 252,667 km (l'entrée lat=lng=4 doit être renvoyée si rayon> = 157 miles.) Cependant, la requête renvoie uniquement l'entrée lat=lng=4 lorsque le rayon est spécifié comme ~ 111,000 + . Ma question est, quelle unité est le rayon dans, et que je mène cette requête correctement?

Répondre

0

Comme par the doc, par défaut, le rayon est exprimé en mètres.

la faille la plus importante est que la distance entre 4; 4 et 5; 5 est 157 km, pas miles. Même si, 111 000 m est pas le même que 157 000 m, mais le document earth_box dit

Certains points dans cette zone sont plus éloignés que le grand cercle spécifié distance de l'emplacement, donc une deuxième vérification en utilisant earth_distance doit être incluse dans la requête.

de sorte que votre requête doit être similaire à

SELECT * FROM chat_rooms 
WHERE earth_box(ll_to_earth(5, 5), 111000) @> ll_to_earth(lat, lng) 
AND earth_distance(ll_to_earth(5,5), ll_to_earth(lat, lng)) <= 111000 

dans lequel l'entrée à 5 cas, 5 ne sera pas retourné, mais sera si vous utilisez 158000 à la place.