{"id":427,"date":"2008-02-06T00:56:12","date_gmt":"2008-02-05T23:56:12","guid":{"rendered":"http:\/\/soci.hu\/blog\/index.php\/2008\/02\/06\/sql-server-2008-ujdonsagok-18-terbeli-adattipusok-5\/"},"modified":"2008-02-13T11:46:03","modified_gmt":"2008-02-13T10:46:03","slug":"sql-server-2008-ujdonsagok-18-terbeli-adattipusok-5","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2008\/02\/06\/sql-server-2008-ujdonsagok-18-terbeli-adattipusok-5\/","title":{"rendered":"SQL Server 2008 \u00fajdons\u00e1gok 19. &#8211; t\u00e9rbeli adatt\u00edpusok 6."},"content":{"rendered":"<p>Kisebb elhavaz\u00f3s kihagy\u00e1s ut\u00e1n, sz\u00e9pen alszanak a gyerekek (n\u00e9melyik), folytassuk h\u00e1t a spatial adatokkal m\u00e9g egy kicsit. \u00cdg\u00e9rtem, hogy val\u00f3s adatokkal fogunk dolgozni. Ilyen adatokat hatalmas mennyis\u00e9gben lehet tal\u00e1lni a weben, csak persze nem Magyarorsz\u00e1gr\u00f3l. :)<\/p>\n<p>Term\u00e9szetesen USA-hoz van a legt\u00f6bb. L\u00e1ssunk p\u00e1rat:<br \/>\n<a href=\"http:\/\/www.census.gov\/geo\/www\/cob\/bg2000.html\">Az \u00e1llamok hat\u00e1rai<\/a> \u00e9s azon bel\u00fcli ter\u00fcleti bont\u00e1s.<br \/>\n<a href=\"http:\/\/www.census.gov\/geo\/www\/cob\/se2000.html\">\u00c1ltal\u00e1nos iskol\u00e1k<\/a>.<br \/>\nSzavaz\u00f3k\u00f6r\u00f6k, stb. sok egy\u00e9b adat m\u00e9g.<\/p>\n<p>Magyarorsz\u00e1ghoz \u00e9s a k\u00f6rnyezet\u00e9hez <a href=\"http:\/\/arcdata.esri.com\/data_downloader\/DataDownloader?part=10200\">innen<\/a> nyertem ki adatokat. A t\u00e9rk\u00e9pen ki kell jel\u00f6lni, mely ter\u00fcletr\u0151l kell inf\u00f3, Next, Next, mely objektumok \u00e9rdekelnek (orsz\u00e1g k\u00f6rvonalak, foly\u00f3k, v\u00e1rosok, stb.), majd Generate File. A kimenet egy \u00fan. ShapeFile, amelyet beimport\u00e1lhatunk az SQL Serverbe. Hogyan?<\/p>\n<p>B\u00e1trabbak neki\u00e1llhatnak egy SSIS csomagot \u00edrni, lust\u00e1bbak, mint \u00e9n google-\u00f6znek, \u00e9s <a href=\"http:\/\/sharpgis.net\/post\/2007\/12\/22\/Shapefile-to-SqlServer-2008-to-WPF.aspx\">tal\u00e1lnak<\/a>. Ez a kis j\u00f3sz\u00e1g, Shape2SQL.exe ShapeFile-okat tud begy\u00farni SQL t\u00e1bl\u00e1kba. <\/p>\n<p><a href='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/02\/shape2sql.png' title='ShapeFile import adatb\u00e1zisba'><img src='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/02\/shape2sql.png' alt='ShapeFile import adatb\u00e1zisba' \/><\/a><\/p>\n<p>Az adatokat geography t\u00edpusk\u00e9nt \u00e9rdemes beimport\u00e1lni, mert sz\u00e9less\u00e9g-hossz\u00fas\u00e1g adatokat t\u00f6lt\u00f6tt\u00fcnk le, \u00e9s a 4326-os SRID is j\u00f3, mert abban vannak az adatok.<br \/>\nA k\u00f6vetkez\u0151 t\u00e1bl\u00e1kkal fogunk dolgozni:<br \/>\n-Contry: orsz\u00e1ghat\u00e1rok<br \/>\n-City: f\u0151bb v\u00e1rosok<br \/>\n-River: foly\u00f3k<br \/>\n-WaterBody: \u00e1ll\u00f3vizek, \u00e9rtsd Balaton. :)<br \/>\n-Road: utak.<\/p>\n<p>Fontos tudni, hogy az ingyenesen let\u00f6lthet\u0151 adatok sz\u00e1nd\u00e9kosan nagyon durva adatokat tartalmaznak, tess\u00e9k fizetni a r\u00e9szletes t\u00e9rk\u00e9pek\u00e9rt. Ezt csak az\u00e9rt mondom, mert ez alapvet\u0151en befoly\u00e1solni fogja a kimenetek hiteless\u00e9g\u00e9t.<\/p>\n<p>No, k\u00e9rdezz\u00fcnk le. V\u00e1logassuk le a magyar v\u00e1rosokat. Az adataimban nem csak Magyarorsz\u00e1g van benne, hanem a k\u00f6rnyez\u0151 orsz\u00e1gokb\u00f3l is ez+az, \u00edgy a lek\u00e9rdez\u00e9s jogos. M\u00e1r k\u00e9rd\u00e9s, csak \u00e9n vagyok ilyen idi\u00f3ta, hogy a f\u00f6ldrajzi adatokb\u00f3l akarok ezt a list\u00e1t el\u0151\u00e1ll\u00edtani. :)<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nselect CITY_NAME\r\nfrom City\r\nwhere geom.STIntersects(\r\n(select geom\r\nfrom Country\r\nwhere CNTRY_NAME = N&#039;Hungary&#039;)) = 1\r\n<\/pre>\n<p>A Country t\u00e1bl\u00e1b\u00f3l kiv\u00e1lasztjuk Mo. k\u00f6rvonal\u00e1t, ez \u00e9s a v\u00e1rosok k\u00f6z\u00fcl azokat v\u00e1logatjuk ki, amelyek metszik az orsz\u00e1got. A v\u00e1rosok egy\u00e9bk\u00e9nt ebben az adatb\u00e1zisban pontk\u00e9nt vannak reprezent\u00e1lva.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nCITY_NAME\r\n------------------------------\r\nSalgotarjan\r\nMiskolc\r\nNyiregyhaza\r\nEger\r\nGyor\r\nTatabanya\r\nDebrecen\r\nBudapest\r\nSzombathely\r\nSzekesfehervar\r\nSzolnok\r\nVeszprem\r\nKecskemet\r\nZalaegerszeg\r\nBekescsaba\r\nKaposvar\r\nSzekszard\r\nSzeged\r\nPecs\r\nArad\r\nPozsony\r\n<\/pre>\n<p>Az utols\u00f3 k\u00e9t bejegyz\u00e9s csak vicc. :)<\/p>\n<p>Mely v\u00e1rosok vannak a Duna 10km-es k\u00f6rzet\u00e9ben?<\/p>\n<p>declare @danube geography = geography::STPointFromText(&#8216;POINT(0 0)&#8217;, 4326);<\/p>\n<p>select<br \/>\n&#8211;geom.ToString()<br \/>\n&#8211;,*<br \/>\n@danube = @danube.STUnion(geom)<br \/>\nfrom River<br \/>\nwhere NAME = N&#8217;Danube&#8217;<\/p>\n<p>select @danube.ToString()<\/p>\n<p>select CITY_NAME,<br \/>\ngeom.ToString() &#8216;A v\u00e1ros eredeti adata&#8217;,<br \/>\ngeom.STStartPoint().ToString() &#8216;A v\u00e1ros mint pont&#8217;,<br \/>\ngeom.STStartPoint().STDistance(@danube) &#8216;T\u00e1vols\u00e1g a foly\u00f3t\u00f3l&#8217;<br \/>\nfrom City<br \/>\nwhere geom.STStartPoint().STDistance(@danube) < 10000\n[\/source]\n\n[source='c']\nCITY_NAME                                A v\u00e1ros eredeti adata                    A v\u00e1ros mint pont                        T\u00e1vols\u00e1g a foly\u00f3t\u00f3l\n---------------------------------------- ---------------------------------------- ---------------------------------------- ----------------------\nBratislava                               MULTIPOINT ((48.15000118311 17.129999448 POINT (48.15000118311 17.129999448299998 1691.81121899415\nBudapest                                 MULTIPOINT ((47.51499918311 19.093999448 POINT (47.51499918311 19.093999448299996 1167.59360136753\nBelgrade                                 MULTIPOINT ((44.79968218311 20.412555448 POINT (44.79968218311 20.412555448299997 5289.83252090268\nDrobeta- Turmu Sererin                   MULTIPOINT ((44.63800018311 22.656000448 POINT (44.63800018311 22.656000448300006 2010.83235902907\nVienna                                   MULTIPOINT ((48.202118183109995 16.32098 POINT (48.202118183109995 16.32098544830 9002.0262024942\n[\/source]\n\nKicsit hekkel\u0151s lett a megold\u00e1s. A foly\u00f3k sok darabban vannak let\u00e1rolva a River t\u00e1bl\u00e1ban, ez\u00e9rt az STUnion-nal \u00f6ssze kell \u0151ket rakni. Igen \u00e1m, de az skal\u00e1ris f\u00fcggv\u00e9ny, nek\u00fcnk meg aggreg\u00e1lni kellene. Mivel nincs STUnionAggregate (majd \u00edrok egyet valamelyik nap), az\u00e9rt marad a select hekk, vagy cursor. A 0,0-ra inicializ\u00e1l\u00e1s az\u00e9rt kell, mert NULL.STUnion(ak\u00e1rmi) az NULL. Ha pont az egyenl\u00edt\u0151n \u00e9s 0 sz\u00e9less\u00e9gn\u00e9l lenne adatunk, akkor cumi, mert a mesters\u00e9ges adat oda esik. Kell majd ide egy rendes CLR aggreg\u00e1l\u00f3 fv.\n\nAz STStartPoint az\u00e9rt kell, mert az STDistance megk\u00f6veteli, hogy az egyik szerepl\u0151 pont legyen. A City t\u00e1bl\u00e1ban a v\u00e1rosok multipontk\u00e9nt vannak felv\u00e9ve, de csak 1 pontot tartalmaznak. Ezzel gyakorlatilag multipont->pont konverzi\u00f3t csin\u00e1ltam. Az STDistance a minin\u00e1lis t\u00e1vols\u00e1got adja meg egy pont \u00e9s egy alakzat k\u00f6z\u00f6tt, \u00edgy annak haszn\u00e1lata \u00e9rthet\u0151.<\/p>\n<p>Magyar v\u00e1rosok egym\u00e1st\u00f3l val\u00f3 t\u00e1vols\u00e1g-m\u00e1trixa (r\u00e9gi \u00fatik\u00f6nyvekben volt ilyen, de persze nem l\u00e9gvonalban, mint n\u00e1lam):<\/p>\n<p>select<br \/>\nc1.CITY_NAME &#8216;Kiindul\u00f3 v\u00e1ros&#8217;,<br \/>\nc2.CITY_NAME &#8216;C\u00e9l v\u00e1ros&#8217;,<br \/>\ncast(c1.geom.STStartPoint().STDistance(c2.geom) as int) &#8216;T\u00e1vols\u00e1g [m]&#8217;<br \/>\nfrom City c1<br \/>\ncross join<br \/>\nCity c2<br \/>\nwhere c1.CNTRY_NAME = &#8216;Hungary&#8217;<br \/>\nand c2.CNTRY_NAME = &#8216;Hungary&#8217;<br \/>\nand c1.ID < c2.ID\norder by c1.CITY_NAME, c2.CNTRY_NAME\n[\/source]\n\n[source='c']\nKiindul\u00f3 v\u00e1ros                 C\u00e9l v\u00e1ros                      T\u00e1vols\u00e1g [m]\n------------------------------ ------------------------------ -------------\nBekescsaba                     Kaposvar                       256101\nBekescsaba                     Szekszard                      186865\nBekescsaba                     Szeged                         86001\nBekescsaba                     Pecs                           231001\nBudapest                       Szombathely                    189239\nBudapest                       Szekesfehervar                 62993\nBudapest                       Szolnok                        91135\nBudapest                       Veszprem                       101121\nBudapest                       Kecskemet                      81505\nBudapest                       Zalaegerszeg                   186420\nBudapest                       Bekescsaba                     178882\nBudapest                       Kaposvar                       162033\nBudapest                       Szekszard                      133373\nBudapest                       Szeged                         161716\nBudapest                       Pecs                           173280\nDebrecen                       Budapest                       191815\nDebrecen                       Szombathely                    380340\nDebrecen                       Szekesfehervar                 246982\n...\n[\/source]\n\nMilyen messze van egym\u00e1st\u00f3l a 10 legt\u00e1volabbi telep\u00fcl\u00e9sp\u00e1r?\n\n[source='sql']\nselect top 10 with ties\nc1.CITY_NAME 'Kiindul\u00f3 v\u00e1ros',\nc2.CITY_NAME 'C\u00e9l v\u00e1ros',\ncast(c1.geom.STStartPoint().STDistance(c2.geom) as int) 'T\u00e1vols\u00e1g [m]'\nfrom City c1 \ncross join\nCity c2\nwhere c1.CNTRY_NAME = 'Hungary'\nand c2.CNTRY_NAME = 'Hungary'\nand c1.ID < c2.ID\norder by 3 desc\n[\/source]\n\n[source='c']\nKiindul\u00f3 v\u00e1ros                 C\u00e9l v\u00e1ros                      T\u00e1vols\u00e1g [m]\n------------------------------ ------------------------------ -------------\nNyiregyhaza                    Szombathely                    391756\nNyiregyhaza                    Zalaegerszeg                   388659\nDebrecen                       Szombathely                    380340\nDebrecen                       Zalaegerszeg                   371748\nNyiregyhaza                    Kaposvar                       346639\nSzombathely                    Bekescsaba                     346612\nNyiregyhaza                    Pecs                           338276\nMiskolc                        Zalaegerszeg                   329734\nMiskolc                        Szombathely                    328254\nZalaegerszeg                   Bekescsaba                     326055\n[\/source]\n\nSzemmel l\u00e1that\u00f3an Ny\u00edregyh\u00e1za a vil\u00e1g v\u00e9ge.\n\nMost n\u00e9mi alv\u00e1s k\u00f6vetkezik, azt\u00e1n folytatjuk. :)\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kisebb elhavaz\u00f3s kihagy\u00e1s ut\u00e1n, sz\u00e9pen alszanak a gyerekek (n\u00e9melyik), folytassuk h\u00e1t a spatial adatokkal m\u00e9g egy kicsit. \u00cdg\u00e9rtem, hogy val\u00f3s adatokkal fogunk&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,4,58],"tags":[],"class_list":["post-427","post","type-post","status-publish","format-standard","hentry","category-adatbazisok","category-szakmai-elet","category-sql-server-2008"],"_links":{"self":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/427","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=427"}],"version-history":[{"count":0,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/427\/revisions"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=427"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=427"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}