Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wzór na pole koła w mysql
Forum PHP.pl > Forum > Bazy danych > MySQL
m72
Jest sobie baza miejscowości. Chcę żeby mi zwróciła tylko te które wpisują się jakiś okrąg.
Powiedzcie mi czemu przy takim zapytaniu
  1. $pytanie=mysqli_query($polaczenie,"select miasto, dlugosc, szerokosc from miasta where (POW((dlugosc-19),2)+POW((szerokosc-51),2))<POW(($r*0.013994),2) ");

dostaję elipsę zamiast okręgu ? biggrin.gif



0.013994 to nieistotny współczynnik
19 - długość geograficzna środka okręgu
51 - szerokosc geograficzna środka okręgu
kartin
Pewnie dlatego, że Ziemia nie jest płaska i nie jest możliwe rozwinięcie powierzchni elipsoidy w płaszczyznę bez zniekształceń.
Jeśli punkty które pobierzesz z bazy umieścisz na obrazku zamiast na mapie to powinny ułożyć się w koło.
m72
Współrzędne to wspórzędne, traktuj je jak układ kartezjański płaski. Kula ziemska ma tak wielki promien ze na przestrzeni kilkudziesięciu km nie ma to najmniejszego znaczenia. Sprawdź sobie. A pozatym jeśli by się coś miało deformować to by się zdeformowało symetrycznie, przecież to kula !.
Podejrzewam ze coś ze wzorem nawaliłem itp. ale nie przychodzi mi nic do głowy. Równanie koła to przecież

Crozin
1. Ziemia nie jest kulą, przy czym faktycznie jest do niej na tyle podobna, że przy relatywnie małych odległościach nie ma to większego znaczenia.
2. Różne rodzaje map dają różnego rodzaju przekłamania i są one bardzo wyraźne, więc nie do końca można sobie pozwolić na kompletne olanie tego faktu.
3. Współrzędnych geograficznych nie można traktować jako układu kartezjańskiego na powierzchni płaskiej.
4. http://www.movable-type.co.uk/scripts/latlong-db.html
5. W pow. artykule zobaczysz też bardzo ważną rzecz, mianowicie najpierw powinieneś wybrać elementy o współrzędnych znajdujących się w obrębie kwadratu opisanego na Twoim kole, a dopiero później spośród nich wybrać te znajdujące się w okręgu.
m72
Tak, juz odsiewałem wstępnie dane za pomocą definiowania kwadratu a później w nim koła. To ma jedynie wpływ na szybkość zapytania ale dane dalej są błędne.

Dodam jeszcze ze współrzędne są przechowywane w polach typu numeric.
Crozin
Ale zauważyłeś że tam masz zupełnie inne wzory? Typ kolumny nie ma większego znaczenia, ważne jest to czy współrzędne są w zakresie od -180 do +180.
sazian
ja korzystam z takiej funkcji
  1. CREATE FUNCTION `distance`( lat1 decimal(10,6) ,lng1 decimal(10,6),lat2 decimal(10,6),lng2 decimal(10,6),unit char) RETURNS decimal(10,6)
  2. BEGIN
  3. RETURN (SELECT degrees(acos(sin(radians(lat1)) * sin(radians(lat2)) + cos(radians(lat1)) * cos(radians(lat2)) * cos(radians(lng1-lng2))))*69.09)*(IF(unit='K',1.609344,1));
  4. END


jako dwa pierwsze parametry podaj współrzędne koła, dwa kolejne to punk "do sprawdzenia" ,a ostatni parametr to jednostka odległości(K - kilometry, wszytko inne - mile)

czyli np.
  1. SELECT * FROM tabela WHERE (19,51,x,y,'K')<5
m72
Graficzne przedstawienie problemu smile.gif


załatwiłem problem współczynnikami "prostującymi" elipsę ("A" i "B").
$pytanie=mysqli_query($polaczenie,"select miasto, dlugosc, szerokosc from miasta where (POW(A*(dlugosc-19),2)+POW(B*(szerokosc-51),2))<POW(($r*0.013994),2) ");
Już prawie działa, problem jest w tym ze dla północy i południa Polski te współczynniki lekko się muszą zmieniać ale coś wykombinuję i jak się uda to tutaj zamieszczę rozwiązanie.

Koledzy dzięki za rady.
Próbowałem do tematu podejść w sposób ściśle matematynczy ale uznałem że to jest przerost formy nad treścią tzn, ze nie ma co zaprzęgać bazy do liczenia arkustangensów i innych sinusów tylko po to żeby mniej więcej trafić w miejscowość na mapie smile.gif. Celem jest ekstremalne uproszczenie zapytania mając na uwadze dokładność + - 2 do 3 km.



Ok, może rozwiązenie jest montypajtonowskie ale za to działa i jest b.proste ! smile.gif
  1. $pytanie=mysqli_query($polaczenie,"select miasto, dlugosc, szerokosc from miasta where (POW(((-0.02315*szerokosc)+2.158)*(dlugosc-$x),2)+POW(1.55*(szerokosc-$y),2))<POW(($r*0.013994),2) ");


Wprowadziłem współczynnik doświadczalny który się zmienia liniowo w funkcji szerokości geograficznej y=-0.02315*szerokosc+2.158

Poniżej zrzuty dla Rzeszowa i Gdańska





Dokładność w zupełności wystarczająca smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.