1

Temat: Zapytanie SQL wyszukujące punkty z polygonu

Witam wszystkich,
Potrzebuję stworzyć zapytanie wyszukujące punkty, które występują w danym polygonie/prostokącie
Mam Baze punktów- Points:
-- LAT- (szerokosc Geogr- rownolezniki)
-- LON (dlugosc Geogr- poludniki)
int ID |bigint osmid |  double LAT  | double LON | degree
np. 1 | 1678695440 | 50.029162 | 19.948975 | 3

Mam takich punktów 800 000 i potrzebuje (by zoptymalizować pracę programu) wybrać tyko część punktów z polygonu o punktach: (koordynaty testowe...)
A ( 50.028... , 19.94... )
B ( 50.029... , 19.94...)
C ( 50.029... , 19.94... )
D ( 50.029... , 19.94... )

Wymyśliłem na kartce takie zależności :
Mając prostokąt:
A (Ax, Ay) - lewy górny róg
B (Bx, By) - prawy górny róg
C (Cx, Cy) - lewy dolny róg
D (Dx, Dy) - prawy dolny róg
to:
punkt X (nasz punkt który sprawdzamy czy należy do poligonu) musi spełniać warunki:
X >= Ax  i  X<= Bx
X <= Ay i   X>= Cy
Pomożecie mi opakować to w zapytanie sqlowe ?
Z gory dziękuję i pozdrawam

2

Odp: Zapytanie SQL wyszukujące punkty z polygonu

zerknij na poniższy przykład
with obszary (id, koordynaty_box) as (values
(1,box '((0,0),(1,1))'),
(2,box '((1,1),(2,3))')),
punkty (id,koordynaty_punkt) as (values
(1,point '(-1,-1)'),
(2,point '(0,0)'),
(3,point '(1,1)'),
(4,point '(2,2)'),
(5,point '(0.5,1)'))
select o.id as obszar_od , o.koordynaty_box as obszar_koordynaty
      ,p.id as punkt_id  , p.koordynaty_punkt as punkty_zawarte_w_obszarze
from obszary o
join punkty p on o.koordynaty_box && box(p.koordynaty_punkt,p.koordynaty_punkt)

3

Odp: Zapytanie SQL wyszukujące punkty z polygonu

Działami przykład i pokazuje o co mi chodziło, mógłbyś mi wytłumaczyć co tam się dzieje? , mam tabele Points a tam nie rozumiem co zawarte jest w krauzuli WITH ?
Spróbuję podpiąć moja tabele do zapytania (od miejsca select) i jakos to poustawiać- o to chodzi tak ?
Sorry ale z SQLa znam tylko z podstaw.
Dziękuję Ci Michał bardzo smile

4

Odp: Zapytanie SQL wyszukujące punkty z polygonu

5

Odp: Zapytanie SQL wyszukujące punkty z polygonu

Wysłałem Ci wiadomość na privie,

6

Odp: Zapytanie SQL wyszukujące punkty z polygonu

odpowiedziałem na priv

7

Odp: Zapytanie SQL wyszukujące punkty z polygonu

Chodzi o to że mam dwa punkty:
A - punkt startu
B - punkt mety

A (1,1) i B (10,10)
i chcę wszystkie punkty pośrednie ( które są pomiędzy tymi punktami) zdobyć z pośród całej mapy. Dodatkowo chcę jeszcze dodać dodatkowy offset żeby pobierać np. od (-1,-1) do (12,12) . Program wyszukuje drogi i czasem może zdarzyć się sytuacja że lepsza droga nie pójdzie bezpośrednio w stronę punktu B ale cofnie się (dlatego offset)
napisałem zapytanie które działa pod warunkiem że punkt A jest poniżej punktu B i A jest po lewej stronie:
oto one:
SELECT * FROM Points WHERE "longitude" >= '19.624540' AND "latitude" >= '50.275550'
AND "longitude" <= '19.859450' AND "latitude" <= '50.162140'
sorry za znaczki ale zapytanie jest robione w programie QuantumGis smile

Programu brakuje dwóch przypadków:
1) Punkt A jest powyzej punktu B
2) Punkt A jest po prawej stronie a punkt B po lewej (kierunek jazdy inny)
i pewnie jeszcze kilka..
Ma ktoś jakiś pomysł?? w Javie pewnie ratował bym się ifami a jak to zrobic e SQL ?

8

Odp: Zapytanie SQL wyszukujące punkty z polygonu

zerknij na to
select *
from points p
where box (point(19.624540,50.275550),point(19.859450,50.162140)) && box(point(longitude,latitude)-point(1,1),point(longitude,latitude)+point(1,1))

9

Odp: Zapytanie SQL wyszukujące punkty z polygonu

Michal, działa zwraca nawet dużo rekordów więc wydaje się OK mógłbyś napisać co tam się dzieje??
Rozumiem że podajesz punkt startu i mety i te -1... to offset?

Ostatnio edytowany przez hetmanJIIIS (2014-03-13 12:14:28)

10

Odp: Zapytanie SQL wyszukujące punkty z polygonu

kwalifikator && oznacza wykrywanie nakładających się obszarów więc możesz szukać punktu wewnątrz obszaru odniesienia tak jak w przykładzie, który przesłałem Ci na priv lub sprawdzić czy jeśli punkt zamienisz na kwadrat o boku zgodnie z założonym przez ciebie warunkiem. Właśnie to dokładnie robi  ten select

poniższy przykład to pokazuje
with p (koordynaty) as (values (point (0,0))
                              ,(point (1,1))
                              ,(point (0.5,0.5))
                              ,(point (1.5,1.5))
                              ,(point (3,3))
                              ,(point (2,2))
                              ,(point (-1,-1))
                              ,(point (2.1,2.1))
                              ,(point (-1.1,-1.1))
                        )
select p.koordynaty as punkt, box (koordynaty-point(1,1),koordynaty+point(1,1)) as kwadrat
     , box(point(0,0),point(1,1)) && box (koordynaty,koordynaty) as czy_punkt_wewnatrz_obszaru
     , box(point(0,0),point(1,1)) && box (koordynaty-point(1,1),koordynaty+point(1,1)) as czy_kwadrat_naklada_sie_na_obszaru
from p

Ostatnio edytowany przez c_michal (2014-03-13 13:27:41)