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(<geometrie_v_lidských_souřadnicích>,<do jakého systému>)

Bod jakožto data typu geometrie vytvoříš třeba funkcí
st_makepoint(<lon>,<lat>). 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(<geometry>,<srid>)

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

Odpovedet emailem