Dnes: 16. ledna 2017    | Registrace | Hledáme | Redakce | Info | Testy | Školení | Ocenění | Nápověda | Čtenář: nepřihlášen

Rychlé odkazy
  • Hlavní stránka
  • Seznam rubrik
  • Ankety
  • Editoriály
  • TOP 15
  • KONFERENCE 2008
  • KONFERENCE 2007
  • KONFERENCE 2006
  • KONFERENCE 2005
  • KONFERENCE 2004
  • Sborník
  • Testy
  • Virtuální školení
  • Personalizace


  • Hledáte práci?
    Hledáme redaktora - pojďte s námi tvořit Databázový svět!

    Vyhledávání

    Hledej
    na Databázovém světě!



    Rozšířené vyhledávání

    Rubriky
    Aktuality
    Bezpečnost
    Business
    Česká scéna
    Datové sklady
    Dokumentace
    Dotazovací jazyky
    Hardware
    Historie
    Komentáře
    Literatura
    Metodologie
    Nondb
    Open Source
    Poradna
    Produkty
    Případové studie
    Redakce
    Rozhovory
    Standardy
    Technologie
    Tipy - triky
    Tiskové zprávy
    Vývoj
    Vývojové nástroje
    Zajímavosti

    Co je to?
    SŘBD
    (Systém řízení báze dat)

    Programový systém umožňující vytváření, údržbu a použití báze dat. Podle komplexnosti je možné SŘBD rozdělit na nižší (např. PC Fand), střední (FoxPro) a vyspělé (Oracle 9i).

    Akce
    Dynamická Datová Centra
    - na semináři se seznámíte s komplexním řešením a koncepcí Dynamických Datových Center od Fujitsu Siemens Computers se speciálním důrazem na řešení FlexFrame.

    Textová inzerce
    IBPhoenix - Vše o InterBase a Firebirdu.

    Smějete se rádi? - Pak je pro vás Vtipník to pravé!

    Prodejce reklamy - Hledáme schopného prodejce reklamního prostoru, možnost i externí spolupráce.

    Přihlášený čtenář
    Nepřihlášený čtenář

    O portálu
    Databázový svět
    ISSN: 1213-5933

    Web je optimalizován pro rozlišení 1024x768, nicméně kromě větších rozlišení podporujeme i 800x600. Podrobnosti najdete zde.

    Chcete-li mít kdykoliv možnost zkontrolovat obsah našeho portálu, můžete využít podporu rss. Podrobnosti najdete zde.
    MS SQL 2008 – prostorová data počtvrté


    [Technologie] - V předchozím díle jsme si představili několik základních metod pro práci s prostorovými daty. Dnes tyto poznatky zúročíme v podobě několika uložených procedur, které mohou oživit nejednu aplikaci.



    Velké množství aplikací dneška jsou aplikace webové – ať už klasické dynamicky generované (X)HTML stránky, nebo bohaté aplikace typu Silverlight nebo Flash. A protože možnost využívat Google mapy nebo Live mapy se přímo nabízí, zaměříme se na ně.

    První co jistě potřebujeme, je zobrazení našich objektů v definovaném obdélníku, tj. obdélníku, který je zrovna vidět. Ten bude identifikován levým horním a pravým dolním vrcholem. Potřebujeme tedy pomocnou funkci, která nám z těchto bodů vytvoří obdélník, polygon. A protože se většinou v těchto mapách pracuje v "LatLong" souřadnicích, budeme i my ctít toto předávání. Funkce by mohla vypadat například takto:

    create function GetBoundingRectangle
    (
      @TopLeftLat float,
      @TopLeftLong float,
      @BottomRightLat float,
      @BottomRightLong float
    )
    returns geography
    as
    begin
      declare @polygon varchar(max);
      set @polygon = 
        -- BR
        cast(@BottomRightLong as varchar(max)) + ' ' + cast(@BottomRightLat as varchar(max)) + ', ' +
        -- TR
        cast(@BottomRightLong as varchar(max)) + ' ' + cast(@TopLeftLat as varchar(max)) + ', ' +
        -- TL
        cast(@TopLeftLong as varchar(max)) + ' ' + cast(@TopLeftLat as varchar(max)) + ', ' +
        -- BL
        cast(@TopLeftLong as varchar(max)) + ' ' + cast(@BottomRightLat as varchar(max)) + ', ' +
        -- closing point
        cast(@BottomRightLong as varchar(max)) + ' ' + cast(@BottomRightLat as varchar(max));
      
      return geography::STGeomFromText('POLYGON((' + @polygon + '))', 4326);
    end
    

    Pokud chceme body v daném obdélníku, nejjednodušší je vzít jednotlivé body a vyzkoušet, zdali s ním mají průnik. Výsledná procedura:

    create procedure ObjectsInRectangle
    (
      @TopLeftLat float,
      @TopLeftLong float,
      @BottomRightLat float,
      @BottomRightLong float
    )
    as
    begin
      declare @rectangle geography;
      set @rectangle = dbo.GetBoundingRectangle(@TopLeftLat, @TopLeftLong, @BottomRightLat, @BottomRightLong);
    
      select o.*
      from Objects o
      where
        o.Location.STIntersects(@rectangle) =  1
      ;
    end
    
    p> Tímto nenáročným způsobem se nám podařilo velmi jednoduše vybrat odpovídající body, které mohou být následně aplikací zobrazeny na mapě.

    Druhým častým požadavkem je zobrazení všech objektů, které leží v určité vzdálenosti od vybraného. Např. vyhledání pneuservisu v okruhu 10 km. S poznatky z minulého dílu je tento úkol také otázka pár řádků:

    create procedure ObjectsInDistanceFromPoint
    (
      @Lat float,
      @Long float,
      @MaxDistance float
    )
    as
    begin
      declare @point geography;
      set @point = geography::STGeomFromText('POINT('+ 
                   cast(@Long as varchar(max)) +
                   ' '+ cast(@Lat as varchar(max)) +')', 4326);
    
      select o.*
      from Objects o
      where
        o.Location.STDistance(@point) < @MaxDistance    
      ;
    end
    

    Samozřejmě je možné použít i přístup podobný minulému – udělat kolem bodu kruh a následně průnik.

    Nakonec jedna komplexnější úloha. Představme si, že máme čáru(y) reprezentující cesty resp. silnice. Silnice nesmí procházet žádným pozemkem samozřejmě, a v okruhu 20 m od silnice nesmí být žádný pozemek bez domku resp. s domkem s plochou menší nebo rovnou jak 80 m2 a 50 m od silnice nesmí být žádný pozemek s domkem s plochou vetší jak 80 m2.

    create function TestRoad(@road geography)
    returns bit
    as
    begin
      declare @result bit;
    
      declare @roadWith20Area geography;
      declare @roadWith50Area geography;
      set @roadWith20Area = @road.STBuffer(20);
      set @roadWith50Area = @road.STBuffer(50);
      
      if 
      (
        exists(select 1 from Lands l left outer join Buildings b on (l.ID = b.ID_Land) 
                 where (b.ID_Land is null or b.Location.STArea() <= 80) 
                   and l.Location.STIntersects(@roadWith20Area) = 1)
                   or exists(select 1 
                               from Lands l 
                               inner join Buildings b on 
                               (l.ID = b.ID_Land) where b.Location.STArea() > 80 
                                and l.Location.STIntersects(@roadWith50Area) = 1)
      )
      begin
        set @result = 0;
      end
      else
      begin
        set @result = 1;
      end
      
      return @result;
    end
    

    Pozn.: Funkce je záměrně napsána trochu "neohrabaně", především pro lepší popisnost.

    Ačkoli OGC funkce (a nejen ty), které můžete využít, nabízí bohaté možnosti, pro složitější úkoly je vhodné umět si problém představit nebo nakreslit a vhodně aplikovat jednotlivé – z tohoto pohledu – transformace k dosažení kýženého výsledku.

    Související články:
    MS SQL 2008 – prostorová data potřetí (01.12.2009)
    MS SQL 2008 – prostorová data podruhé (21.10.2009)
    MS SQL 2008 – prostorová data poprvé (12.10.2009)

    ( Celý článek! | Autor: Jiří Činčura | Počet komentářů: 0 | Přidat komentář | Informační e-mailVytisknout článek )

    Vyhledávání
     

    Anketa
    Kolik ročně utratíte za dovolené?

    Nic 
     (943 hl.)
    Do 1 000,- Kč 
     (741 hl.)
    Do 10 000,- Kč 
     (705 hl.)
    Do 25 000,- Kč 
     (816 hl.)
    Do 50 000,- Kč 
     (735 hl.)
    Do 75 000,- Kč 
     (756 hl.)
    Více než 75 000,- Kč 
     (712 hl.)

    Celkem hlasovalo: 5408


    Poslední komentáře
    frontierd@126.com
    frontierd@126.com
    frontierd@126.com
    c
    http://www.coachoutl

    Newsletter
    Přihlaste si nezávazně - i bez registrace - odběr informačního newsletteru. Podrobné informace najdete zde.

    Emailová adresa:


    Kalendář
    <<  Leden  >>
    PoÚtStČtSoNe
           1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     

    Redakci připojuje


    Nejčtenější

    Databáze je prázdná!


    Nejvíce komentářů

    Databáze je prázdná!


    Reklama






    Nenechte si ujít články na dalších webech




    Na této stránce použité názvy programových produktů, firem apod. mohou být ochrannými známkami
    nebo registrovanými ochrannými známkami příslušných vlastníků.

    Databázový svět | dfKlub - digitální fotografie | Vtipník - vtipy přímo k Vám | Reminder - přestaňte zapomínat | Databázový svět

    Copyright (c) 2004 AVRE Publishing, spol. s r.o. Všechna práva vyhrazena