{"id":397,"date":"2008-01-21T09:59:38","date_gmt":"2008-01-21T08:59:38","guid":{"rendered":"http:\/\/soci.hu\/blog\/index.php\/2008\/01\/21\/sql-server-2008-ujdonsagok-14-terbeli-adattipusok-1\/"},"modified":"2008-01-25T10:25:14","modified_gmt":"2008-01-25T09:25:14","slug":"sql-server-2008-ujdonsagok-14-terbeli-adattipusok-1","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2008\/01\/21\/sql-server-2008-ujdonsagok-14-terbeli-adattipusok-1\/","title":{"rendered":"SQL Server 2008 \u00fajdons\u00e1gok 15. &#8211; t\u00e9rbeli adatt\u00edpusok 1."},"content":{"rendered":"<p>Az \u00faj adatt\u00edpusok t\u00e1rgyal\u00e1s\u00e1nak z\u00e1r\u00f3 f\u00e1zis\u00e1hoz \u00e9rkezt\u00fcnk, m\u00e1r csak a k\u00e9t t\u00e9rbeli (spatial) t\u00edpus maradt h\u00e1tra: a geometry \u00e9s a geography.<br \/>\nA geometry hagyom\u00e1nyos, euklid\u00e9szi, der\u00e9ksz\u00f6g\u0171, s\u00edk koordin\u00e1tarendszerben dolgozik, m\u00edg a geograpy elliptikus, a F\u00f6ld\u00f6n elhelyezked\u0151, f\u00f6ldrajzi koordin\u00e1t\u00e1kat modellez\u0151 t\u00edpus (sz\u00e9less\u00e9g, hossz\u00fas\u00e1g, stb.).<br \/>\nKoordin\u00e1t\u00e1kkal dolgoz\u00f3 emberk\u00e9k most \u00f6r\u00fclhetnek, v\u00e9gre nat\u00edvan lehet a dolgaikat t\u00e1rolni, \u00e9s rengeteg m\u0171veletet (\u00e1tfedik-e egym\u00e1st alakzatok, milyen k\u00f6zel van, stb.) haszn\u00e1lhatnak rajtuk.<\/p>\n<p>A t\u00edpusok meg\u00e9rt\u00e9s\u00e9t el\u00e9gg\u00e9 megnehez\u00edti, hogy a legt\u00f6bb \u00e1tlagember sz\u00e1m\u00e1ra ismeretlen szabv\u00e1nyokra \u00e9p\u00fclnek. N\u00e9h\u00e1ny fontosabbat felsorolok itt az elej\u00e9n. <a href=\"http:\/\/www.opengeospatial.org\/\">Open Geospatial Consortium<\/a> (OGC)<br \/>\n<a href=\"http:\/\/en.wikipedia.org\/wiki\/Well-known_text\">Well-known text<\/a>, WKT. Ez tulajdonk\u00e9ppen arr\u00f3l sz\u00f3l, hogyan lehet stringk\u00e9nt le\u00edrni geometriai objektumokat.<br \/>\nEnnek p\u00e1rja a bin\u00e1ris le\u00edr\u00e1s, <a href=\"http:\/\/edndoc.esri.com\/arcsde\/9.1\/general_topics\/wkb_representation.htm\">Well-known binary<\/a>, WKB. (\u00c9rdekes, a &#8220;j\u00f3l ismert&#8221; fogalom mennyire relat\u00edv. :)<br \/>\nP\u00e1r WKT p\u00e9lda a kor\u00e1bbi wikis cikkb\u0151l:<\/p>\n<p> POINT(6 10)<br \/>\n LINESTRING(3 4,10 50,20 25)<br \/>\n POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2, 3 2, 3 3, 2 3,2 2))<br \/>\n MULTIPOINT(3.5 5.6,4.8 10.5)<br \/>\n MULTILINESTRING((3 4,10 50,20 25),(-5 -8,-10 -8,-15 -4))<br \/>\n MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2, 3 2, 3 3, 2 3,2 2)),((3 3,6 2,6 4,3 3)))<br \/>\n GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))<br \/>\n POINT ZM (1 1 5 60)<br \/>\n POINT M (1 1 80)<\/p>\n<p>A legt\u00f6bb alakzat persze k\u00f6nnyen kital\u00e1lhat\u00f3 a neve alapj\u00e1n, de a param\u00e9terk\u00e9nt megadott sz\u00e1mok \u00e9rtelmez\u00e9se nem trivi\u00e1lis. Egyr\u00e9szt k\u00e9rd\u00e9s az, hogy milyen m\u00e9rt\u00e9kegys\u00e9gben dolgoznak (pl. m\u00e9ter), m\u00e1sr\u00e9szt, hogy milyen vonatkoztat\u00e1si ponthoz k\u00e9pest \u00e9rtelmezz\u00fck azokat. Nekem k\u00e9zenfekv\u0151 lett volna Greenwich mint egyik koordin\u00e1ta nullpont, m\u00e1sik ir\u00e1nyb\u00f3l az egyenl\u00edt\u0151, harmadikk\u00e9nt pedig a tengerszint, de persze az \u00e9let sokkal sz\u00ednesebb enn\u00e9l, hisz mindenki szereti az otthon\u00e1ban l\u00e1tni a nullpontot, n\u00e1la legyen a vil\u00e1g k\u00f6zepe. Legyen <a href=\"http:\/\/www.falvak.hu\/pusztavacs\">pusztavacsi<\/a> a koordin\u00e1ta rendszer. :)<\/p>\n<p>No, a t\u00edpusokn\u00e1l olyan vonatkoztat\u00e1si pontokat, referenciapontokat, spatial reference identifier-t, SRID-t haszn\u00e1lnak, amelyeket a European Petroleum Survey Group (EPSG) <a href=\"http:\/\/www.epsg.org\/\">standard<\/a> defini\u00e1l. Eur\u00f3pa egy amerikai term\u00e9kben? Nofene.<\/p>\n<p>Hogy ne l\u00f3gjon a leveg\u0151ben ez az inf\u00f3, meg legyen m\u00e1r egy kis SQL is, mindj\u00e1rt n\u00e9zz\u00fck is meg, milyen vonatkoztat\u00e1si rendszereket ismer a szerver:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nselect * from sys.spatial_reference_systems\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nspatial_reference_id authority_name authorized_spatial_reference_id well_known_text                                                                                                                                                                                                               unit_conversion_factor\r\n-------------------- -------------- ------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------- ----------------------\r\n4120                 EPSG           4120                            GEOGCS&#x5B;&quot;Greek&quot;, DATUM&#x5B;&quot;Greek&quot;, ELLIPSOID&#x5B;&quot;Bessel 1841&quot;, 6377397.155, 299.1528128]], PRIMEM&#x5B;&quot;Greenwich&quot;, 0], UNIT&#x5B;&quot;Degree&quot;, 0.0174532925199433]]                                                          metre                1\r\n4121                 EPSG           4121                            GEOGCS&#x5B;&quot;GGRS87&quot;, DATUM&#x5B;&quot;Greek Geodetic Reference System 1987&quot;, ELLIPSOID&#x5B;&quot;GRS 1980&quot;, 6378137, 298.257222101]], PRIMEM&#x5B;&quot;Greenwich&quot;, 0], UNIT&#x5B;&quot;Degree&quot;, 0.0174532925199433]]                               metre                1\r\n4122                 EPSG           4122                            GEOGCS&#x5B;&quot;ATS77&quot;, DATUM&#x5B;&quot;Average Terrestrial System 1977&quot;, ELLIPSOID&#x5B;&quot;Average Terrestrial System 1977&quot;, 6378135, 298.257]], PRIMEM&#x5B;&quot;Greenwich&quot;, 0], UNIT&#x5B;&quot;Degree&quot;, 0.0174532925199433]]                    metre                1\r\n4123                 EPSG           4123                            GEOGCS&#x5B;&quot;KKJ&quot;, DATUM&#x5B;&quot;Kartastokoordinaattijarjestelma (1966)&quot;, ELLIPSOID&#x5B;&quot;International 1924&quot;, 6378388, 297]], PRIMEM&#x5B;&quot;Greenwich&quot;, 0], UNIT&#x5B;&quot;Degree&quot;, 0.0174532925199433]]                                metre                1\r\n4124                 EPSG           4124                            GEOGCS&#x5B;&quot;RT90&quot;, DATUM&#x5B;&quot;Rikets koordinatsystem 1990&quot;, ELLIPSOID&#x5B;&quot;Bessel 1841&quot;, 6377397.155, 299.1528128]], PRIMEM&#x5B;&quot;Greenwich&quot;, 0], UNIT&#x5B;&quot;Degree&quot;, 0.0174532925199433]]                                     metre                1\r\n...\r\n4326                 EPSG           4326                            GEOGCS&#x5B;&quot;WGS 84&quot;, DATUM&#x5B;&quot;World Geodetic System 1984&quot;, ELLIPSOID&#x5B;&quot;WGS 84&quot;, 6378137, 298.257223563]], PRIMEM&#x5B;&quot;Greenwich&quot;, 0], UNIT&#x5B;&quot;Degree&quot;, 0.0174532925199433]]                                           metre                1\r\n...\r\n4237                 EPSG           4237                            GEOGCS&#x5B;&quot;HD72&quot;, DATUM&#x5B;&quot;Hungarian Datum 1972&quot;, ELLIPSOID&#x5B;&quot;GRS 1967&quot;, 6378160, 298.247167427]], PRIMEM&#x5B;&quot;Greenwich&quot;, 0], UNIT&#x5B;&quot;Degree&quot;, 0.0174532925199433]]                                                 metre                1\r\n...\r\n<\/pre>\n<p>Az SQL Server 2008 alap\u00e9rtelmezett m\u00f3don a 4326-os  SRID-t haszn\u00e1lja, ami Greenwich-i kez\u0151pont\u00fa, m\u00e9terben \u00e9s fokban dolgozik, \u00e9s ez \u00edgy van j\u00f3l, szimpatikus v\u00e1laszt\u00e1s. Laikusoknak WGS 84. (Megvan a po\u00e9n a Dumb \u00e9s Dumberb\u0151l? Canis- laikusoknak kutya. :)<\/p>\n<p>\u00c9s egy utols\u00f3 szabv\u00e1nyhivatkoz\u00e1s, azt\u00e1n programolunk. A geometry t\u00edpust az Open Geospatial Consortium (OGC) <a href=\"http:\/\/www.opengeospatial.org\/standards\/sfs\">Simple Features for SQL Specification version 1.1.0<\/a>-nak megfelel\u0151en implement\u00e1lt\u00e1k, a standardot megn\u00e9zve l\u00e1tszik, hogy a met\u00f3dusok neve, stb. sz\u00e9pen illeszkedik a szabv\u00e1nyhoz.<\/p>\n<p>Ebben a r\u00e9szben kezdj\u00fcnk az egyszer\u0171bbel, a geometry t\u00edpussal, m\u00e9giscsak egyszer\u0171bb der\u00e9ksz\u00f6g\u0171 rendszerben gondolkodni, mint egy elliptikus iz\u00e9n.<\/p>\n<p>Hozzunk l\u00e9tre egy pontot reprezent\u00e1l\u00f3 v\u00e1ltoz\u00f3t:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nDECLARE @g geometry;\r\nSET @g = geometry::STGeomFromText(&#039;POINT (3 4)&#039;, 0);\r\nselect @g.ToString()\r\n<\/pre>\n<p>Kimenet:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nPOINT (3 4)\r\n<\/pre>\n<p><strong>STGeomFromText<\/strong> a m\u00e1r hivatkozott WKT sz\u00f6vegb\u0151l parsolja ki az alakzatot. Az SRID 0, azaz nem defini\u00e1lt lesz, geometryn\u00e9l ez ok, geographyn\u00e1l viszont ez k\u00f6telez\u0151, csak kell egy kiindul\u00f3pont, ha valami f\u00f6ldi alakzatatot akarunk bel\u0151ni. Haszn\u00e1lhattuk volna a specializ\u00e1ltabb <strong>STPointFromText<\/strong> met\u00f3dust is.<\/p>\n<p>J\u00e1tszunk kicsit a pontokkal, rakjuk \u00f6ssze \u0151ket egy csapatba (<strong>STUnion<\/strong>):<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\ndeclare @a geometry = geometry::STGeomFromText(&#039;POINT(0 0)&#039;, 0);\r\ndeclare @b geometry = geometry::STGeomFromText(&#039;POINT(4 4)&#039;, 0);\r\n\r\nselect @a.STUnion(@b).ToString();\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nMULTIPOINT ((4 4), (0 0))\r\n<\/pre>\n<p>Csin\u00e1ljunk bel\u0151le vonalat:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nselect @a.STUnion(@b).STConvexHull().ToString();\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nLINESTRING (4 4, 0 0)\r\n<\/pre>\n<p>Mi az a Convex Hull, azaz <a href=\"http:\/\/e-oktat.pmmf.hu\/kepeshang_10_fejezet\">konvex test<\/a>?<br \/>\n&#8220;Az A halmazt konvexnek nevezz\u00fck, ha b\u00e1rmely k\u00e9t pontj\u00e1t \u00f6sszek\u00f6tve az egyenes pontjai az halmazon bel\u00fcl maradnak.&#8221;<\/p>\n<p>Sz\u00f3val ez a met\u00f3dus konvex testeket tud \u00f6sszerakni, ami most csak egy vonal lett, mivel 2 pontot adtunk meg. Adjunk meg 3-at, mit csin\u00e1l bel\u0151le?<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\ndeclare @c geometry = geometry::STGeomFromText(&#039;POINT(0 4)&#039;, 0);\r\nselect @a.STUnion(@b).STUnion(@c).STConvexHull().ToString();\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nPOLYGON ((4 4, 0 4, 0 0, 4 4))\r\n<\/pre>\n<p>Ezt m\u00e9g el\u00e9g k\u00f6nny\u0171 elk\u00e9pzelni, ez egy cs\u00facs\u00e1n \u00e1ll\u00f3, der\u00e9ksz\u00f6g\u0171 h\u00e1romsz\u00f6g. Nem n\u00e9gysz\u00f6g, mert az els\u0151 \u00e9s utols\u00f3 pontja is  4, 4.<\/p>\n<p>Vizu\u00e1lisok kedv\u00e9\u00e9rt a vonalunk \u00e9s a h\u00e1romsz\u00f6g\u00fcnk:<\/p>\n<p><a href='\/blog\/wp-content\/uploads\/2008\/01\/geoquery.png' title='Geometry lek\u00e9rdez\u00e9s kimenete vizualiz\u00e1lva' target=\"_blank\"><img src='http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/01\/geoquery.png' alt='Geometry lek\u00e9rdez\u00e9s kimenete vizualiz\u00e1lva' \/><\/a><\/p>\n<p>Folyt. k\u00f6v.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Az \u00faj adatt\u00edpusok t\u00e1rgyal\u00e1s\u00e1nak z\u00e1r\u00f3 f\u00e1zis\u00e1hoz \u00e9rkezt\u00fcnk, m\u00e1r csak a k\u00e9t t\u00e9rbeli (spatial) t\u00edpus maradt h\u00e1tra: a geometry \u00e9s a geography. A&#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-397","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\/397","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=397"}],"version-history":[{"count":0,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/397\/revisions"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=397"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=397"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=397"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}