{"id":421,"date":"2008-01-28T12:59:11","date_gmt":"2008-01-28T11:59:11","guid":{"rendered":"http:\/\/soci.hu\/blog\/index.php\/2008\/01\/28\/sql-server-2008-ujdonsagok-17-terbeli-adattipusok-4\/"},"modified":"2008-02-13T11:45:43","modified_gmt":"2008-02-13T10:45:43","slug":"sql-server-2008-ujdonsagok-17-terbeli-adattipusok-4","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2008\/01\/28\/sql-server-2008-ujdonsagok-17-terbeli-adattipusok-4\/","title":{"rendered":"SQL Server 2008 \u00fajdons\u00e1gok 18. &#8211; t\u00e9rbeli adatt\u00edpusok 5."},"content":{"rendered":"<p>P\u00e1r met\u00f3dus m\u00e9g a geometry t\u00edpushoz, azt\u00e1n t\u00e9nyleg j\u00f6nnek a val\u00f3di adatok \u00e9s sz\u00e1m\u00edt\u00e1sok.<\/p>\n<p>A p\u00e9ld\u00e1im eddig a geometry t\u00edpusra \u00e9p\u00edtettek, azt k\u00f6nnyebb kezelni, de a met\u00f3dusok jelent\u0151s r\u00e9sze \u00e9rtelmezhet\u0151 lesz a geograpy t\u00edpuson is. Ha nem ebben a CTP-ben, majd a k\u00f6vetkez\u0151ben (CTP6 pre-t m\u00e1r le tudn\u00e9k t\u00f6lteni mint MVP, de v\u00e1rok p\u00e1r napot a v\u00e9gleges CTP-re, ne kelljen \u00e1lland\u00f3an telep\u00edteni). Nem mindent lehet viszont egy g\u00f6mb\u00f6n \u00e9rtelmezni, ez\u00e9rt nem teljesen azonos a k\u00e9t t\u00edpus met\u00f3dusk\u00e9szlete, de err\u0151l majd k\u00e9s\u0151bb.<\/p>\n<p>Csak \u00edzel\u00edt\u0151\u00fcl, s\u00edk tartom\u00e1ny eset\u00e9n (geometry) trivi\u00e1lis \u00e9rtelmezni a k\u00edv\u00fcl \u00e9s a bel\u00fcl fogalm\u00e1t, amelyik tartom\u00e1ny v\u00e9ges, az van bel\u00fcl. \u00c9s egy g\u00f6mb\u00f6n? Ott mindk\u00e9t tartom\u00e1ny v\u00e9ges. Akkor, most mi n\u00e9zz\u00fck a majmokat az \u00e1llatkertben, vagy \u0151k n\u00e9znek minket? Ezt a k\u00e9rd\u00e9st is elrendezz\u00fck majd. Ezeket csak az\u00e9rt mondom, hogy ne cs\u00fcggedjen senki a sok met\u00f3dus l\u00e1tt\u00e1n, kellenek majd ezek.<\/p>\n<p>T\u00e1vols\u00e1g meghat\u00e1roz\u00e1s: <strong>STDistance<\/strong>. Ez egy pont \u00e9s egy tesz\u0151leges alakzat k\u00f6z\u00f6tt keresi meg a legr\u00f6videbb utat. Geometryn\u00e9l ennek nincs m\u00e9rt\u00e9kegys\u00e9ge, geograpy eset\u00e9n pedig az SRID-t\u0151l f\u00fcgg, mi lesz ez, sok esetben p\u00e9ld\u00e1ul fokban kapjuk meg a t\u00e1vols\u00e1got (hisz a geograpy sz\u00e9less\u00e9g-hossz\u00fas\u00e1ggal dolgozik).<br \/>\nA p\u00e9ld\u00e1ban m\u00e9g l\u00e1that\u00f3 a <strong>STLength<\/strong>, az az alakzat k\u00f6rvonal\u00e1nak hossz\u00e1t adja vissza (pl. egy orsz\u00e1g ker\u00fclete).<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nDECLARE @g geometry;\r\nDECLARE @h geometry;\r\nDECLARE @i geometry;\r\nSET @g = geometry::STGeomFromText(&#039;POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))&#039;, 0);\r\nSET @h = geometry::STGeomFromText(&#039;POINT(10 10)&#039;, 0);\r\nSET @i = geometry::STGeomFromText(&#039;LINESTRING(2 2,10 10)&#039;, 0);\r\nSELECT @g, @g.STDistance(@h), 0.1 as &#x5B;Thickness], &#039;Green&#039; as &#x5B;Color]\r\nUNION ALL\r\nSELECT @i, @i.STLength(), 0.1 as &#x5B;Thickness], &#039;Gray&#039; as &#x5B;Color] -- demonstration line\r\nUNION ALL \r\nSELECT @h, null, 0.3 as &#x5B;Thickness], &#039;Red&#039; as &#x5B;Color];\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nPOLYGON ((0 0, 2 0, 2 2, 0 2,  11.3137084989848       0.1                            Green\r\nLINESTRING (2 2, 10 10)        11.3137084989848       0.1                            Gray\r\nPOINT (10 10)                  NULL                   0.3                            Red\r\n<\/pre>\n<p><a target='_blank' href='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/01\/stlengthstdistance.png' title='stlengthstdistance.png'><img src='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/01\/stlengthstdistance.png' alt='stlengthstdistance.png' \/><\/a><\/p>\n<p>Befoglal\u00f3 t\u00e9glalap meghat\u00e1roz\u00e1sa: <strong>STEnvelope<\/strong>. Ezt k\u00f6nny\u0171 elk\u00e9pzelni, nem mell\u00e9kelek k\u00e9pet, csak a kimenetet:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nDECLARE @g geometry;\r\nSET @g = geometry::STGeomFromText(&#039;LINESTRING(0 0, 2 3)&#039;, 0);\r\nSELECT @g, @g.STEnvelope(), 0.1 as &#x5B;Thickness];\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nLINESTRING (0 0, 2 3)                    POLYGON ((0 0, 2 0, 2 3, 0 3, 0 0))\r\n<\/pre>\n<p>Egyenl\u0151-e k\u00e9t alakzat? <strong>STEquals<\/strong>. Azt gondoln\u00e1nk ez egyszer\u0171, de lehet, hogy m\u00e1sk\u00e9nt vannak \u00f6sszerakva. Pl. egy soksz\u00f6get \u00f6ssze lehet rakni multi-linek\u00e9nt, aminek az els\u0151 \u00e9s utols\u00f3 pontja ugyanaz \u00e9s polygonk\u00e9nt is. A f\u00fcggv\u00e9ny \u00e9szreveszi az ilyen csib\u00e9szs\u00e9geket.<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nDECLARE @g geometry\r\nDECLARE @h geometry;\r\nSET @g = geometry::STGeomFromText(&#039;LINESTRING(0 2, 2 0, 4 2)&#039;, 0);\r\nSET @h = geometry::STGeomFromText(&#039;MULTILINESTRING((4 2, 2 0), (0 2, 2 0))&#039;, 0);\r\nSELECT @h, @h.STEquals(@g), &#039;Blue&#039; as &#x5B;Color], 0.2 as &#x5B;Thickness]\r\nUNION ALL\r\nSELECT @g, @g.STEquals(@h), &#039;Orange&#039; as &#x5B;Color], 0.1 as &#x5B;Thickness];\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nMULTILINESTRING ((4 2, 2 0), (0 2, 2 0)) 1\r\nLINESTRING (0 2, 2 0, 4 2)               1\r\n<\/pre>\n<p>A p\u00e9ld\u00e1b\u00f3l l\u00e1tszik, hogy a m\u0171velet kommutat\u00edv (m\u00e9g sz\u00e9p).<\/p>\n<p><a target='_blank' href='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/01\/stequals.png' title='stequals.png'><img src='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/01\/stequals.png' alt='stequals.png' \/><\/a><\/p>\n<p>K\u00fcls\u0151 k\u00f6rvonal meghat\u00e1roz\u00e1sa: <strong>STExteriorRing<\/strong>. A kor\u00e1bbi lukas n\u00e9gyzetes p\u00e9ld\u00e1ban a k\u00fcls\u0151 n\u00e9gyzetet adja vissza. Ha egy \u00e9p\u00fcletegy\u00fcttes van p\u00e9ld\u00e1ul poligonok kollekci\u00f3jak\u00e9nt le\u00edrva, akkor ezzel k\u00f6nny\u0171 meghat\u00e1rozni az egy\u00fcttes k\u00f6rvonalukat. Az <strong>STInteriorRingN(n)<\/strong> k\u00edv\u00fclr\u0151l befel\u00e9 haladva az n. bels\u0151 k\u00f6rvonalat adja vissza. <\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nDECLARE @g geometry;\r\nSET @g = geometry::STGeomFromText(&#039;POLYGON((0 0, 3 0, 3 3, 0 3, 0 0),(2 2, 2 1, 1 1, 1 2, 2 2))&#039;, 0);\r\nSELECT @g, 0.3 as &#x5B;Thickness], &#039;Red&#039; as Color\r\nUNION ALL\r\nSELECT @g.STExteriorRing() AS &#x5B;ExteriorRing], 0.1 as &#x5B;Thickness], &#039;Yellow&#039; as Color\r\nUNION ALL\r\nSELECT @g.STInteriorRingN(1) AS &#x5B;FirstInteriorRing], 0.1 as &#x5B;Thickness], &#039;Green&#039; as Color;\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nPOLYGON ((0 0, 3 0, 3 3, 0 3, 0 0), (2 2, 2 1, 1 1, 1 2, 2 2))         0.3                            Red\r\nLINESTRING (0 0, 3 0, 3 3, 0 3, 0 0)                                   0.1                            Yellow\r\nLINESTRING (2 2, 2 1, 1 1, 1 2, 2 2)                                   0.1                            Green\r\n<\/pre>\n<p><a target='_blank' href='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/01\/stinteriorringnstexteriorring.png' title='stinteriorringnstexteriorring.png'><img src='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/01\/stinteriorringnstexteriorring.png' alt='stinteriorringnstexteriorring.png' \/><\/a><\/p>\n<p><strong>STIsEmpty<\/strong>: ez olyan, mint a NULL. Itt egy alakzat lehetne, de nincs. Azaz olyan, mint az ISNULL, csak geo iz\u00e9kre.<\/p>\n<p><strong>STIsClosed<\/strong>: z\u00e1rt-e az alakzat. Ha a kezd\u0151 \u00e9s a v\u00e9gpont ugyanaz, akkor z\u00e1rt. <\/p>\n<p><strong>STIsSimple<\/strong>: ha az alakzat nem metszi saj\u00e1t mag\u00e1t. Pl. a 8-as, az X vagy az A nem egyszer\u0171 alakzat. Az O vagy a D igen.<\/p>\n<p><strong>STIsRing<\/strong>: akkor gy\u0171r\u0171 valami, ha z\u00e1rt \u00e9s egyszer\u0171. Az O pl. gy\u0171r\u0171, de a D is, az A nem, mert nem z\u00e1rt (kil\u00f3g a k\u00e9t l\u00e1ba) \u00e9s nem is egyszer\u0171 (a v\u00edzszintes bele\u00e9r a k\u00e9t l\u00e1b\u00e1ba).<\/p>\n<p><strong>STOverlaps<\/strong>: \u00e1tfedi-e egym\u00e1st k\u00e9t alakzat, el\u00e9g egyszer\u0171 \u00e9rtelmezni. Mozg\u00f3 alakzatokn\u00e1l \u00fctk\u00f6z\u00e9st \u00e9rz\u00e9kelni is j\u00f3. (Doom for SQL Server) :)<\/p>\n<p><strong>STPointOnSurface<\/strong>: visszaad egy tetsz\u0151leges pontot egy fel\u00fclet belsej\u00e9ben. Nem igaz\u00e1n tudom m\u00e9g mire lehet j\u00f3, de tal\u00e1n arra, hogy ha pl. egy \u00e9p\u00fclethez k\u00e9pest kell m\u00e9rni valami, de nem tudjuk hol vannak az ajt\u00f3k, akkor kiv\u00e1lasztunk a belsej\u00e9ben egy tetsz\u0151leges pontot a f\u00fcggv\u00e9nnyel, \u00e9s onnan m\u00e9r\u00fcnk. Ha valaki ismeri a pontos c\u00e9lj\u00e1t, \u00edrja meg.<\/p>\n<p>Update.<\/p>\n<p>Megk\u00e9rdeztem az MVP newsgroupban, az egyik SQL Server fejleszt\u0151 koll\u00e9ga (Isaac Kunen) azt mondta, arra j\u00f3, hogy ha az alakzathoz egy c\u00edmk\u00e9t szeretn\u00e9nk rajzolni, akkor egy ahhoz haszn\u00e1lhat\u00f3 poz\u00edci\u00f3t ad vissza a met\u00f3dus. Hmm.<\/p>\n<p>\u00c9s v\u00e9g\u00fcl (t\u00e9nyleg elfogyak a met\u00f3dusok?) egy nem szabv\u00e1nyos kieg\u00e9sz\u00edt\u00e9s: <strong>Reduce<\/strong>.<br \/>\nEzzel le lehet egyszer\u0171s\u00edteni alakzatokat, hogy egyszer\u0171en fogalmazva durv\u00e1bb legyen a felbont\u00e1suk.<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nDECLARE @g geometry;\r\nSET @g = geometry::STGeomFromText(&#039;LINESTRING(0 0, 0 1, 1 0, 2 1, 3 0, 4 1)&#039;, 0);\r\nSELECT @g, &#039;Original&#039; as &#x5B;Display], &#039;Blue&#039; AS &#x5B;Color], 0.2 AS &#x5B;Thickness]\r\nUNION ALL\r\nSELECT @g.Reduce(.75), &#039;Reduced&#039; as &#x5B;Display], &#039;Red&#039; AS &#x5B;Color], 0.1 AS &#x5B;Thickness]\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nLINESTRING (0 0, 0 1, 1 0, 2 1, 3 0, 4 1)                              Original Blue  0.2\r\nLINESTRING (0 0, 0 1, 3 0, 4 1)                                        Reduced  Red   0.1\r\n<\/pre>\n<p><a target='_blank' href='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/01\/reduce.png' title='reduce.png'><img src='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/01\/reduce.png' alt='reduce.png' \/><\/a><\/p>\n<p>A doksi szerint \u0151 a Douglas-Peucker algoritmussal k\u00f6zel\u00edti meg az eredeti alakzatot, a megadott param\u00e9ternek megfelel\u0151 agresszivit\u00e1ssal. Gondolom akkor j\u00f6n j\u00f3l, ha egy sz\u00e1m\u00edt\u00e1s lass\u00fa lenne a finom felbont\u00e1s mellett (pl. egy poligon 1500 darabk\u00e1b\u00f3l), \u00e9s ilyenkor a pontoss\u00e1g rov\u00e1s\u00e1ra, de egy mondjuk tized\u00e9re cs\u00f6kkentett oldalsz\u00e1mra egyszer\u0171s\u00edtett alakzattal sz\u00e1molunk. \u00c9rdemes megn\u00e9zni, mit csin\u00e1l egy k\u00f6rrel:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nDECLARE @g geometry;\r\nSET @g = geometry::STGeomFromText(&#039;POINT(0 0)&#039;, 0).STBuffer(10);\r\nSELECT @g, &#039;Original&#039; as &#x5B;Display], &#039;Blue&#039; AS &#x5B;Color], 1 AS &#x5B;Thickness]\r\nUNION ALL\r\nSELECT @g.Reduce(.75), &#039;Reduced1&#039; as &#x5B;Display], &#039;Red&#039; AS &#x5B;Color], 0.2 AS &#x5B;Thickness]\r\nUNION ALL\r\nSELECT @g.Reduce(2), &#039;Reduced2&#039; as &#x5B;Display], &#039;Yellow&#039; AS &#x5B;Color], 0.2 AS &#x5B;Thickness]\r\nUNION ALL\r\nSELECT @g.Reduce(5), &#039;Reduced3&#039; as &#x5B;Display], &#039;Green&#039; AS &#x5B;Color], 0.2 AS &#x5B;Thickness]\r\n<\/pre>\n<p><a target='_blank' href='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/01\/reduceacircle.png' title='reduceacircle.png'><img src='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/01\/reduceacircle.png' alt='reduceacircle.png' \/><\/a><\/p>\n<p>Ez volt a k\u00f6r n\u00e9gysz\u00f6ges\u00edt\u00e9se projekt.<\/p>\n<p>No, m\u00e9g mindig nem \u00e9rintett\u00fcnk minden met\u00f3dust, de a legfontosabbakat m\u00e1r l\u00e1ttuk. A k\u00f6vetkez\u0151 r\u00e9szben let\u00f6lt\u00fcnk adatokat az orsz\u00e1gr\u00f3l \u00e9s a k\u00f6rny\u00e9k\u00e9r\u0151l, \u00e9s elkezd\u00fcnk m\u00e9ricsk\u00e9lni rajta. \u00cdzel\u00edt\u0151\u00fcl megmutatom a k\u00f6rnyez\u0151 orsz\u00e1gok ker\u00fclet\u00e9nek \u00e9s ter\u00fclet\u00e9nek kisz\u00e1m\u00edt\u00e1s\u00e1t (Addig lehet ellen\u0151rizni, j\u00f3k-e az adatok? Rom\u00e1nia ter\u00fclete nem gyan\u00fasan nagy? ;)<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nselect\r\nCNTRY_NAME as &#039;Orsz\u00e1g&#039;,\r\ncast(&#x5B;geom].STArea() \/1000 \/1000 as int) as &#039;Ter\u00fclet &#x5B;km2]&#039;,\r\ncast(&#x5B;geom].STLength() \/1000 as int) as &#039;Ker\u00fclet &#x5B;km]&#039;\r\nfrom Country\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nOrsz\u00e1g                         Ter\u00fclet &#x5B;km2] Ker\u00fclet &#x5B;km]\r\n------------------------------ ------------- ------------\r\nByelarus                       1024          162\r\nPoland                         139576        2068\r\nCzech Republic                 54465         1303\r\nUkraine                        43739         1240\r\nGermany                        3585          285\r\nSlovakia                       48926         1207\r\nHungary                        92995         1562\r\nAustria                        42468         966\r\nSlovenia                       14000         651\r\nSerbia                         76621         1614\r\nRomania                        105365        1613\r\nBosnia and Herzegovina         51005         1173\r\nCroatia                        52209         3009\r\nBulgaria                       19237         724\r\nMontenegro                     7780          450\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>P\u00e1r met\u00f3dus m\u00e9g a geometry t\u00edpushoz, azt\u00e1n t\u00e9nyleg j\u00f6nnek a val\u00f3di adatok \u00e9s sz\u00e1m\u00edt\u00e1sok. A p\u00e9ld\u00e1im eddig a geometry t\u00edpusra \u00e9p\u00edtettek, azt&#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-421","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\/421","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=421"}],"version-history":[{"count":0,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/421\/revisions"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=421"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=421"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=421"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}