Geolokacja - jak pobrać współrzędne danego miasta?

Potrzebuję podczas rejestracji użytkownika zweryfikować podane przez niego miasto (globalnie) oraz pobrać współrzędne tego miasta.

Czy możecie polecić jakiś gem lub plugin do takich zadań geolokacyjnych, aby pobrać współrzędne podanego miasta? Jak obliczyć odległość pomiędzy jednym miastem, a drugim bazując na współrzędnych?

Co do pierwszego pytania: najprościej Ci będzie użyć google maps (czyli JS, po stronie klienta – jak klient poda adres, to od razu JS w tle wypełni longitude i latitude). Jeśli nie chcesz, to będziesz potrzebował bazy kodów pocztowych, nie wiem skąd można wyciągnąć taką bazę dla Polski.

Co do drugiego pytania: była spora wojna na forum, zasadniczo nie powineneś tego robić z twierdzenia pitagorasa :wink: (bo długość i szerokość geograficzna to kąty, a nie wymiary liniowe). Tutaj zacząłem kiedyś temat na blogu: http://tomash.wrug.eu/2009/10/18/rails-tricks-part-3a-distance-based-search.html.

Możesz też użyć google maps API, jeśli wyliczenie odległości możesz mieć client-side (tzn. nie musisz np. wyszukiwać punktów w odległości X kilometrów od danego)

Jedyne rozwiązanie o jakim wiem które potrafi liczyć poprawne odległości pomiędzy punktami na sferze to PostGIS rozszerzenie do PostgreSQL. Pytanie tylko czy zależy Ci na takiej dokładności. MySQL ma niby podobne rozszerzenie wbudowane ale nie jest na tyle dobre abym mógł je polecić. PostGIS z kolei to “pain in the ass” jeśli chodzi o konfigurację.

PostGIS działa rewelacyjnie (także jeśli chodzi o wydajność), ale tak jak Hubert napisał – konfiguracja i pożenienie go z railsami boli.

Sphinx też ma jakiś geo-searching, ale nie sprawdzałem.

Tego wbudowanego w mongo nie polecam, bo chłopaki polecieli jakby to były współrzędne kartezjańskie (czyli z twierdzenia Pitagorasa), dzięki czemu uzyskali świetną wydajność (trik z geohashingiem) ale dokładność nie-do-przyjęcia :stuck_out_tongue:

Ogólnie: da się, ale przygotuj się na niezły ride :wink:

(jeśli zamierzasz pójść w PostgreSQL/Postgis, to powiedz – zmuszę się żeby wreszcie napisać o tym notkę na bloga, w sensie 3b :wink: )

Dzięki za info! Udało mi się znaleźć coś takiego:

A Ruby gem & Rails plugin for easier map-based applications
Calculate distance, bearing and more between Latitude/Longitude points

[quote=bbmmog]Dzięki za info! Udało mi się znaleźć coś takiego:

A Ruby gem & Rails plugin for easier map-based applications[/quote]
Fajnie fajnie, ale patrzyłeś w kod?
http://github.com/andre/geokit-rails/blob/master/lib/geokit-rails/adapters/mysql.rb
Surowy wzór Haversine’a w SQLu. Równie dobrze mogłeś sobie zrobić w MySQL procedurę składowaną. Wydajność tego będzie niestety mocno taka-sobie (PostGIS ma te krytyczne w bibliotece napisanej w C i skompilowanej).

Ale na pewno dobry początek :slight_smile:

Ja używałem, sphinx radzi sobie z tym bardzo dobrze, jedyne co musisz zrobić to podać mu lat i lng w radianach. Z thinking sphinxem to jest banalnie proste: http://freelancing-god.github.com/ts/en/geosearching.html