2017-02-24 54 views
5

Obecnie tworzę aplikację, aby pokazać wszystkie geotagowane drzewa w określonym mieście. Główne kolumny używam do pobierania danych z tabeli są następującePobierz wszystkie punkty z bazy danych wewnątrz obwiedni współrzędnych północno-wschodniej i południowo-zachodniej w MySQL

+-----------------+-------------+------+-----+---------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+-----------------+-------------+------+-----+---------+-------+ 
| tree_geotags_id | int(11)  | NO | PRI | None |  | 
| lattitude_dl | double(9,7) | YES |  | NULL |  | 
| longitude_dl | double(9,7) | YES |  | NULL |  | 
+-----------------+-------------+------+-----+---------+-------+ 

tabela ma ponad 158 tysięcy wierszy.

Obecnie używam następujące kwerendy, aby moje wyjście,

SELECT gt.tree_geotags_id, gt.latitude_dl, gt.longitude_dl, 
    SQRT(
     POW(69.1 * (gt.latitude_dl - [ center_lat ]), 2) + 
     POW(69.1 * ([ center_lon ] - gt.longitude_dl) * COS(gt.latitude_dl/57.3), 2) 
    ) AS distance 
    FROM tree_geotags_t gt 
    HAVING distance < 0.4 ORDER BY distance 

co to jest, to pobiera wszystkie rekordy w promieniu 0,4. Używam wywołania ajax, aby pobrać dane, za każdym razem, gdy zmienia się środkowa współrzędna mapy (na panoramach lub powiększeniach mapy), konwertuj pobrane dane do formatu geojsona, a następnie załaduj je na mapę jako warstwę. Kwestia, którą mam z tym, jest w miejscach, gdzie występuje bardzo duża gęstość drzew, zajmuje dużo czasu, aby mapa umieściła wszystkie punkty, a ponieważ pobiera ją w promieniu, ładuje punkty nawet poza rzutnia.

Potrzebuję kwerendy, aby załadować dane tylko we współrzędnych wewnątrz rzutni, przy użyciu współrzędnych północno-wschodniej i południowo-zachodniej jako granice. Szukałem tu dość długo, ale nie mogłem znaleźć niczego, co odpowiadałoby moim wymaganiom. Proszę pomóż mi. Z góry dziękuję..!!

+0

Dodać klauzulę WHERE, która wyklucza wpisy o wartościach lat/long niższych/wyższych niż wartości docelowe ...? – CBroe

Odpowiedz

0

Jesteś bardzo blisko. Twoja (inaczej rażąco niepoprawna) formuła określająca odległość zawiera ziarno sprawdzania pola granicznego.

Spróbuj

SET @distance_unit := 69.0; /* for miles, use 111.045 for km. */ 
SET @radius := 1.0;   /* for radius */ 
SET @center_lat := target_latitude_in_degrees; 
SET @center_lon := target_longitude_in_degrees; 

SELECT gt.tree_geotags_id, gt.latitude_dl, gt.longitude_dl 
    FROM tree_geotags_t gt 
WHERE gt.latitude_dl 
    BETWEEN @center_lat - (@radius/@distance_unit) /*east boundary*/ 
     AND @center_lat + (@radius/@distance_unit) /*west*/ 
    AND gt.longitude_dl 
    BETWEEN @center_lon - (@radius/(@distance_unit * COS(RADIANS(@center_lat)))) /*south*/ 
     AND @center_lon + (@radius/(@distance_unit * COS(RADIANS(@center_lat)))) /*north*/ 

Załóżmy, że wiemy na wschód, zachód, północ i południe granice swojego obwiedni zamiast jego centrum. To łatwa adaptacja powyższego kodu.

SELECT gt.tree_geotags_id, gt.latitude_dl, gt.longitude_dl 
    FROM tree_geotags_t gt 
WHERE gt.latitude_dl BETWEEN @east AND @west 
    AND gt.longitude_dl BETWEEN @south AND @north 

Kwestia, jak wyprowadzić boki ramki ograniczającej z jej narożników, jest banalna, o ile współrzędne prostokąta są w stopniach. Jeśli są podane w niektórych jednostkach projekcji (takich jak transverse UTM coordinate s), nie ma możliwości, aby odpowiedź pasowała do postu przepełnienia stosu.

To zapytanie może być wykonane szybko przez indeks złożony na (latitude_dl, longitude_dl, tree_geotags_id) Wyszukiwanie szerokości geograficznej będzie używać skanowania w zakresie indeksu, a długość i identyfikator mogą być następnie pobierane bezpośrednio z indeksu.

Co jest nie tak z formułą odległości? Jest kartezjański, ale potrzebujesz kulistej formuły prawa cosinusu, ponieważ masz do czynienia ze współrzędnymi sferycznymi.

To nie zadziała w pobliżu bieguna północnego lub południowego (ponieważ cos (szerokość geograficzna) zmierza w kierunku zera), ale to jest w porządku; masz do czynienia z drzewami i jeszcze tam nie rosną.

Oto obszerny zapis na ten temat. http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/

+0

Dzięki za poprawki, ale tak naprawdę szukam zapytania, które pomoże mi uzyskać wszystkie punkty w oknie roboczym. Dostaję współrzędne dla wszystkich 4 zakrętów, północnego wschodu, północnego zachodu, południowego wschodu i południowego zachodu. Jednak nie jestem w stanie zbudować zapytania przy użyciu tych wartości, aby uzyskać wszystkie drzewa pomiędzy tymi współrzędnymi. –

+0

Dzieje się tak, ponieważ po powiększeniu nadal ładuje się punkty poza rzutnią. Jeśli można tego uniknąć, wydajność może być znacznie szybsza. –

+0

Śmiem twierdzić, że nadwerężyłeś problem. –