Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wzór na pole koła w mysql
m72
post 22.06.2014, 16:36:57
Post #1





Grupa: Zarejestrowani
Postów: 86
Pomógł: 0
Dołączył: 25.12.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
kartin
post 22.06.2014, 16:59:28
Post #2





Grupa: Zarejestrowani
Postów: 246
Pomógł: 79
Dołączył: 25.05.2010

Ostrzeżenie: (0%)
-----


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.


--------------------
Jeśli ten post pomógł to kliknij przycisk po lewej stronie.
Nie pomagam przez PW, GG, e-mail, faks, telegram, znaki dymne, ...
Go to the top of the page
+Quote Post
m72
post 22.06.2014, 18:22:31
Post #3





Grupa: Zarejestrowani
Postów: 86
Pomógł: 0
Dołączył: 25.12.2012

Ostrzeżenie: (0%)
-----


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ż

Go to the top of the page
+Quote Post
Crozin
post 22.06.2014, 18:38:39
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
m72
post 22.06.2014, 18:53:07
Post #5





Grupa: Zarejestrowani
Postów: 86
Pomógł: 0
Dołączył: 25.12.2012

Ostrzeżenie: (0%)
-----


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.

Ten post edytował m72 22.06.2014, 18:56:49
Go to the top of the page
+Quote Post
Crozin
post 22.06.2014, 19:35:35
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
sazian
post 22.06.2014, 20:55:39
Post #7





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
m72
post 22.06.2014, 21:49:19
Post #8





Grupa: Zarejestrowani
Postów: 86
Pomógł: 0
Dołączył: 25.12.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 01:41