2011-01-08 8 views
5

Chciałbym przechowywać tysiące punktów szerokości/długości geograficznej w bazie danych MySQL. Udało mi się skonfigurować tabele i dodać dane za pomocą rozszerzeń geoprzestrzennych, w których kolumna "coord" jest punktem (łac., Lng).Jak korzystać z rozszerzeń geoprzestrzennych MySQL o geometrii sferycznej

Problem:

chcę szybko znaleźć najbliższy wpisy 'n' do szerokości i długości geograficznej stopni 'x' stopni 'Y'. Ponieważ funkcja Distance() nie została jeszcze zaimplementowana, użyłem funkcji GLength() do obliczenia odległości między (X, Y) i każdym z wpisów, sortowania w rosnącej odległości i ograniczenia do wyników "N". Problem polega na tym, że nie oblicza się najkrótszej odległości z geometrią sferyczną. Co oznacza, że ​​jeśli Y = 179,9 stopni, lista najbliższych pozycji będzie zawierać tylko długości zaczynające się od 179,9 i malejące, nawet jeśli istnieją bliższe wpisy o długościach wzrastających od -179,9.

Jak zwykle obsługuje się nieciągłość w długości geograficznej podczas pracy z geometriami sferycznymi w bazach danych? Musi to być łatwe rozwiązanie, ale muszę po prostu szukać niewłaściwej rzeczy, ponieważ nie znalazłem nic przydatnego.

Czy powinienem po prostu zapomnieć o funkcji GLength() i utworzyć własną funkcję do obliczania separacji kątowej? Jeśli to zrobię, czy nadal będzie szybki i wykorzysta rozszerzenia geoprzestrzenne?

Dzięki!

Josh


UPDATE:

This jest dokładnie to, co ja opisuję powyżej. Jednak jest to tylko dla SQL Server. Najwyraźniej SQL Server ma Geometry i Geografia typów danych. Geografia robi dokładnie to, czego potrzebuję. Czy jest coś podobnego w MySQL?

Odpowiedz

4

Jak zwykle obsługuje się nieciągłość w długości geograficznej podczas pracy z geometriami sferycznymi w bazach danych?

Niewiele osób używa do tego MySQL, ponieważ rozszerzenia geoprzestrzenne nie są tak naprawdę przeznaczone na tabakę.

Od docs: "All calculations are done assuming Euclidean (planar) geometry."

Rozwiązaniem jest zwykle do roll your own.

Możesz też podrobić - jeśli odległości są mniejsze niż 500 mil lub mniej, możesz traktować swoją szerokość i długość geograficzną jako współrzędne prostokątne i po prostu użyć wzoru odległości euklidesowej (sqrt(a^2 + b^2)).

+0

Dzięki za odpowiedź. Co zwykle używają do tego ludzie? Widziałem stronę, którą połączyłeś jakiś czas temu, ale wydaje się, że rozwiązuje ona tylko problem znajdowania punktów najbliżej podanej szerokości/długości geograficznej. Nie rozwiązuje problemu żądania wszystkich punktów w regionie. Korzystanie z rolki własnej metody nie pozwoli Ci zażądać wszystkich punktów od 178 lon do -178 lon i od 30 lat do 35 lat (region prostokątny). – Joshua

+0

Używam [PostGIS] (http://postgis.refractions.net/). Istnieje również kilka bibliotek open source, z których można korzystać - sprawdź [osgeo] (http://www.osgeo.org/).To może być przesada, jeśli wszystko, co robisz, to względne obliczenia odległości. – Seth