Re: [Talk-cz] Postgis tutoriál (bylo PointInfo JOSM plugin - zobrazení informací z RUIAN)

2014-02-04 Tema obsahu Marián Kyral

Super,
teď už to funguje správně. Taky mě ten order by mohl napadnout :-D

Marián

Dne 4.2.2014 21:26, Petr Vejsada napsal:

Ahoj,

Dne Út 4. února 2014 19:27:37, Marián Kyral napsal(a):


Ahoj,
tak jsem se dopracoval k tomuto selectu:

select u.kod, u.nazev, ST_asText(st_transform(u.definicni_cara,4326))
from ( select kod, nazev, definicni_cara
from ruian.rn_ulice
order by definicni_cara <->

st_transform(st_setsrid(st_makepoint(18.36564928953012,49.670527512403766),4
326),900913) LIMIT 100) as u
where st_distance( (st_transform(u.definicni_cara,4326))::geography,
(st_setsrid(st_makepoint(18.3657227215035,49.66980665513853),4326))::geograp
hy ) < 10
;

Jediná věc mne zarazila. Musel jsem u subselectu nastavit "LIMIT 100". 
S
nastavením "LIMIT 1" mi to vrátilo výsledek jen někdy. Klikal jsme 
podél

ulice, na jednom místě mi to ulici vypsalo a o kousek dál už zase ne.


Já tě tím nechtěl pro začátek zatěžovat, ale teď vidím, že jsem měl, 
no,

alespoň sis na to přišel sám.

V tom odkazu, co jsem posílal, je psáno, že třídění pomocí <-> je 
přibližné,
protože  geometrie (čára) se převede na bbox. Hledáš-li vzdálenost bodu 
od

bodu, pak bbox bodu je totéž jako bod samotný, ale bbox čáry je prostě
obdelník, takový, aby se do něho ta čára vešla.

Tak, jak jsi to vyřešil, to řeším i já, tedy podobně. Na konec toho 
druhého
selectu dávám order by st_distance(...) limit 1. st_distance už třídí 
exaktně,
sice pomalu, ale u 100 položek to zase nevadí. U 20M položek (parcely) 
je to

sakra znát.

Takže ten tvůj select by v mém podání vypadal:

 326),900913) LIMIT 100) as u
where st_distance( (st_transform(u.definicni_cara,4326))::geography,
(st_setsrid(st_makepoint(18.3657227215035,49.66980665513853),4326))::geography
) < 10 order by st_distance( 
(st_transform(u.definicni_cara,4326))::geography,

(st_setsrid(st_makepoint(18.3657227215035,49.66980665513853),4326))::geography
limit 1

to vrátí s vysokou pravděpodobností tu správnou ulici, ledaže by ani 
těch 100
řádku, nalezených aproximovaným výběrem z bboxů, neobsahovalo ten řádek 
se

skutečně nejbližší ulicí.

Teď to vypadá, že to funguje slušně. Jen na křižovatkách to někdy 
vrátí
vedlejší ulici. Ale to bych neviděl jako moc velký problém. 
Inteligentní

uživatel klikne kousek dál od křižovatky.


protože tam nemáš ten order_by st_distance. Vrátí ti to prostě první 
řádek,
který vyhovuje podmínce, že st_distance < 10 a to může být klidně i ta 
druhá

ulice.

--
Petr


___
Talk-cz mailing list
Talk-cz@openstreetmap.org
https://lists.openstreetmap.org/listinfo/talk-cz


___
Talk-cz mailing list
Talk-cz@openstreetmap.org
https://lists.openstreetmap.org/listinfo/talk-cz


Re: [Talk-cz] Postgis tutoriál (bylo PointInfo JOSM plugin - zobrazení informací z RUIAN)

2014-02-04 Tema obsahu Petr Vejsada
Ahoj,

Dne Út 4. února 2014 19:27:37, Marián Kyral napsal(a):

> Ahoj,
> tak jsem se dopracoval k tomuto selectu:
> 
> select u.kod, u.nazev, ST_asText(st_transform(u.definicni_cara,4326))
> from ( select kod, nazev, definicni_cara
> from ruian.rn_ulice
> order by definicni_cara <->
> 
> st_transform(st_setsrid(st_makepoint(18.36564928953012,49.670527512403766),4
> 326),900913) LIMIT 100) as u
> where st_distance( (st_transform(u.definicni_cara,4326))::geography,
> (st_setsrid(st_makepoint(18.3657227215035,49.66980665513853),4326))::geograp
> hy ) < 10
> ;
> 
> Jediná věc mne zarazila. Musel jsem u subselectu nastavit "LIMIT 100". S
> nastavením "LIMIT 1" mi to vrátilo výsledek jen někdy. Klikal jsme podél
> ulice, na jednom místě mi to ulici vypsalo a o kousek dál už zase ne.

Já tě tím nechtěl pro začátek zatěžovat, ale teď vidím, že jsem měl, no, 
alespoň sis na to přišel sám.

V tom odkazu, co jsem posílal, je psáno, že třídění pomocí <-> je přibližné, 
protože  geometrie (čára) se převede na bbox. Hledáš-li vzdálenost bodu od 
bodu, pak bbox bodu je totéž jako bod samotný, ale bbox čáry je prostě 
obdelník, takový, aby se do něho ta čára vešla. 

Tak, jak jsi to vyřešil, to řeším i já, tedy podobně. Na konec toho druhého 
selectu dávám order by st_distance(...) limit 1. st_distance už třídí exaktně, 
sice pomalu, ale u 100 položek to zase nevadí. U 20M položek (parcely) je to 
sakra znát.

Takže ten tvůj select by v mém podání vypadal:

 326),900913) LIMIT 100) as u
where st_distance( (st_transform(u.definicni_cara,4326))::geography,
(st_setsrid(st_makepoint(18.3657227215035,49.66980665513853),4326))::geography 
) < 10 order by st_distance( (st_transform(u.definicni_cara,4326))::geography,
(st_setsrid(st_makepoint(18.3657227215035,49.66980665513853),4326))::geography 
limit 1

to vrátí s vysokou pravděpodobností tu správnou ulici, ledaže by ani těch 100 
řádku, nalezených aproximovaným výběrem z bboxů, neobsahovalo ten řádek se 
skutečně nejbližší ulicí.

> Teď to vypadá, že to funguje slušně. Jen na křižovatkách to někdy vrátí
> vedlejší ulici. Ale to bych neviděl jako moc velký problém. Inteligentní
> uživatel klikne kousek dál od křižovatky.

protože tam nemáš ten order_by st_distance. Vrátí ti to prostě první řádek, 
který vyhovuje podmínce, že st_distance < 10 a to může být klidně i ta druhá 
ulice.

--
Petr


___
Talk-cz mailing list
Talk-cz@openstreetmap.org
https://lists.openstreetmap.org/listinfo/talk-cz


Re: [Talk-cz] Postgis tutoriál (bylo PointInfo JOSM plugin - zobrazení informací z RUIAN)

2014-02-04 Tema obsahu Marián Kyral

Ahoj,
tak jsem se dopracoval k tomuto selectu:

select u.kod, u.nazev, ST_asText(st_transform(u.definicni_cara,4326))
from ( select kod, nazev, definicni_cara
   from ruian.rn_ulice
   order by definicni_cara <->
  
st_transform(st_setsrid(st_makepoint(18.36564928953012,49.670527512403766),4326),900913)

 LIMIT 100) as u
where st_distance( (st_transform(u.definicni_cara,4326))::geography, 
(st_setsrid(st_makepoint(18.3657227215035,49.66980665513853),4326))::geography 
) < 10

;

Jediná věc mne zarazila. Musel jsem u subselectu nastavit "LIMIT 100". S 
nastavením "LIMIT 1" mi to vrátilo výsledek jen někdy. Klikal jsme podél 
ulice, na jednom místě mi to ulici vypsalo a o kousek dál už zase ne.


Teď to vypadá, že to funguje slušně. Jen na křižovatkách to někdy vrátí 
vedlejší ulici. Ale to bych neviděl jako moc velký problém. Inteligentní 
uživatel klikne kousek dál od křižovatky.


Díky,
Marián

Dne 2.2.2014 20:23, Petr Vejsada napsal:

Ahoj,

Dne Ne 2. února 2014 19:28:12, Marián Kyral napsal(a):

definiční čára, mně blbne na klávesnici F, fakt, nedělám si srandu...

Geometry typ prostě obsahuje údaje o tvaru nějakého objektu. Zobrazení:

třeba
select st_astext(definicni_cara)

Geometrie může být bod, čára, polygon, multipolygon, oblouky a též směs 
všeho

uvedeného.

SRID = identifikace projekce, ve kreré je geometrie vyjádřena. 
Používáme v OSM

dvě - 900913 pro zobrazování a 4326, což jsou ty stupně, jak je známe z
běžného života.

RUIAN mám uložen v 900913, aby s tím Mapnik neměl tolik práce.

select st_srid(definicni_cara) from ruian.rn_ulice limit 1;

 st_srid
-
  900913
(1 řádka)

Když chceš najít nejbližší ulici k bodu, vyjádřenému v "občanských"
souřadnicích, tedy 4326, je potřeba to převést do 900913, protože takto 
jsou
uložena data (platí jen pro tu databázi, co mám na serveru; někdo jiný 
to mlže

mít jinak).

To se dělá transformací - select
st_transform(,)

Bod jakožto data typu geometrie vytvoříš třeba funkcí
st_makepoint(,). Tato funkce vrátí data typu geometry a je to 
point.


Není však jasné, v jakém souřadnicovém systému to vlastně je. Proto 
použijeme

st_setsrid(,)

Takže do PG zadáme bod třeba

select st_setsrid(st_makepoint(14,50),4326)


Lidsky čitelné totéž:

select st_astext(st_setsrid(st_makepoint(14,50),4326));
  st_astext
--
 POINT(14 50)
(1 řádka)


V jakém souřadnicovém systému to vlastně máme?

select st_srid(st_setsrid(st_makepoint(14,50),4326));
 st_srid
-
4326
(1 řádka)


Ten samý bod si zobrazíme v lidsky čitelné formě v souřadnicovém 
systému

900913:

select 
st_astext(st_transform(st_setsrid(st_makepoint(14,50),4326),900913));

st_astext
--
 POINT(1558472.87110583 6446275.84101716)
(1 řádka)

A konečně se dostáváme k cíli:

select nazev from ruian.rn_ulice order by definicni_cara <->
st_transform(st_setsrid(st_makepoint(14,50),4326),900913) limit 1;
  nazev
--
 Na Zámku
(1 řádka)


Jak je ta ulice daleko?

Funkce st_distance(geometry,geometry)

Ta ráda vrací vzdálenost v radiánech na zemském povrchu, osobně dávám 
přednost
metrům ;-). V metrech nám to řekne, když geometrie budou geografie. 
Geography

je podobný datový typ, vyjadřuje se v souřadnicovém systému 4326.

Toho se docílí přetypováním na typ geography.

Celý select pak vypadá:

select nazev,st_distance( 
(st_transform(definicni_cara,4326))::geography,
(st_setsrid(st_makepoint(14,50),4326))::geography ) from ruian.rn_ulice 
order
by definicni_cara <-> 
st_transform(st_setsrid(st_makepoint(14,50),4326),900913)

limit 1;

  nazev   | st_distance
--+--
 Na Zámku | 26.405619556
(1 řádka)

Nejbližší bod ulice Na Zámku je od nás vzdálen 26 metrů a 40 
centimetrů.


Cvičení:

Jak si zobrazíme lidsky čitelné souřadnice adresního bodu z RUIAN?

A:
select st_astext(st_transform(definicni_bod,4326)) from 
ruian.rn_adresni_misto

where kod=21411409;

st_astext
--
 POINT(13.6752996130858 49.2886006596294)
(1 řádka)


Učebnice Postgisu:

http://workshops.boundlessgeo.com/postgis-intro/

je IMO super, ale nedá se to za 10 minut

--
Petr


___
Talk-cz mailing list
Talk-cz@openstreetmap.org
https://lists.openstreetmap.org/listinfo/talk-cz


___
Talk-cz mailing list
Talk-cz@openstreetmap.org
https://lists.openstreetmap.org/listinfo/talk-cz


Re: [Talk-cz] Postgis tutoriál (bylo PointInfo JOSM plugin - zobrazení informací z RUIAN)

2014-02-02 Tema obsahu Marián Kyral

Moc díky. Myslím, že pro začátek mi to stačí.

Marián

Dne 2.2.2014 20:23, Petr Vejsada napsal(a):

Ahoj,

Dne Ne 2. února 2014 19:28:12, Marián Kyral napsal(a):

definiční čára, mně blbne na klávesnici F, fakt, nedělám si srandu...

Geometry typ prostě obsahuje údaje o tvaru nějakého objektu. Zobrazení:

třeba
select st_astext(definicni_cara)

Geometrie může být bod, čára, polygon, multipolygon, oblouky a též směs všeho
uvedeného.

SRID = identifikace projekce, ve kreré je geometrie vyjádřena. Používáme v OSM
dvě - 900913 pro zobrazování a 4326, což jsou ty stupně, jak je známe z
běžného života.

RUIAN mám uložen v 900913, aby s tím Mapnik neměl tolik práce.

select st_srid(definicni_cara) from ruian.rn_ulice limit 1;

  st_srid
-
   900913
(1 řádka)

Když chceš najít nejbližší ulici k bodu, vyjádřenému v "občanských"
souřadnicích, tedy 4326, je potřeba to převést do 900913, protože takto jsou
uložena data (platí jen pro tu databázi, co mám na serveru; někdo jiný to mlže
mít jinak).

To se dělá transformací - select
st_transform(,)

Bod jakožto data typu geometrie vytvoříš třeba funkcí
st_makepoint(,). Tato funkce vrátí data typu geometry a je to point.

Není však jasné, v jakém souřadnicovém systému to vlastně je. Proto použijeme
st_setsrid(,)

Takže do PG zadáme bod třeba

select st_setsrid(st_makepoint(14,50),4326)


Lidsky čitelné totéž:

select st_astext(st_setsrid(st_makepoint(14,50),4326));
   st_astext
--
  POINT(14 50)
(1 řádka)


V jakém souřadnicovém systému to vlastně máme?

select st_srid(st_setsrid(st_makepoint(14,50),4326));
  st_srid
-
 4326
(1 řádka)


Ten samý bod si zobrazíme v lidsky čitelné formě v souřadnicovém systému
900913:

select st_astext(st_transform(st_setsrid(st_makepoint(14,50),4326),900913));
 st_astext
--
  POINT(1558472.87110583 6446275.84101716)
(1 řádka)

A konečně se dostáváme k cíli:

select nazev from ruian.rn_ulice order by definicni_cara <->
st_transform(st_setsrid(st_makepoint(14,50),4326),900913) limit 1;
   nazev
--
  Na Zámku
(1 řádka)


Jak je ta ulice daleko?

Funkce st_distance(geometry,geometry)

Ta ráda vrací vzdálenost v radiánech na zemském povrchu, osobně dávám přednost
metrům ;-). V metrech nám to řekne, když geometrie budou geografie. Geography
je podobný datový typ, vyjadřuje se v souřadnicovém systému 4326.

Toho se docílí přetypováním na typ geography.

Celý select pak vypadá:

select nazev,st_distance( (st_transform(definicni_cara,4326))::geography,
(st_setsrid(st_makepoint(14,50),4326))::geography ) from ruian.rn_ulice order
by definicni_cara <-> st_transform(st_setsrid(st_makepoint(14,50),4326),900913)
limit 1;

   nazev   | st_distance
--+--
  Na Zámku | 26.405619556
(1 řádka)

Nejbližší bod ulice Na Zámku je od nás vzdálen 26 metrů a 40 centimetrů.

Cvičení:

Jak si zobrazíme lidsky čitelné souřadnice adresního bodu z RUIAN?

A:
select st_astext(st_transform(definicni_bod,4326)) from ruian.rn_adresni_misto
where kod=21411409;

 st_astext
--
  POINT(13.6752996130858 49.2886006596294)
(1 řádka)


Učebnice Postgisu:

http://workshops.boundlessgeo.com/postgis-intro/

je IMO super, ale nedá se to za 10 minut

--
Petr


___
Talk-cz mailing list
Talk-cz@openstreetmap.org
https://lists.openstreetmap.org/listinfo/talk-cz




___
Talk-cz mailing list
Talk-cz@openstreetmap.org
https://lists.openstreetmap.org/listinfo/talk-cz