{"id":638,"date":"2017-06-23T20:00:00","date_gmt":"2017-06-23T20:00:00","guid":{"rendered":"https:\/\/geoadmin.com.br\/?p=638"},"modified":"2021-06-09T10:24:16","modified_gmt":"2021-06-09T13:24:16","slug":"3-ferramentas-do-postgis-que-sao-uma-mao-na-roda","status":"publish","type":"post","link":"https:\/\/geoadmin.com.br\/?p=638","title":{"rendered":"3 Ferramentas do PostGIS que s\u00e3o uma m\u00e3o na roda"},"content":{"rendered":"<p>N\u00e3o \u00e9 segredo algum, mas todos sabemos que o <a href=\"https:\/\/postgis.net\/\">PostGIS<\/a> \u00e9 a extens\u00e3o espacial mais produtiva do mundo. Ela n\u00e3o s\u00f3 possui mais funcionalidades do que as outras dispon\u00edveis no mercado, mas como \u00e9 open-source, com uma comunidade incr\u00edvel por tr\u00e1s.<\/p>\n<p>Hoje vou revelar alguns pequenos segredos escondidos nas funcionalidades do <a href=\"https:\/\/postgis.net\/\">PostGIS<\/a> para voc\u00eas. Estas fun\u00e7\u00f5es, com toda certeza, ir\u00e3o te tornar mais produtivo e efetivo no uso desta ferramenta t\u00e3o legal.<\/p>\n<h2>1. Escrita de Geometrias<\/h2>\n<p>Ler e escrever faz parte do b\u00e1sico do PostGIS. Existem v\u00e1rias fun\u00e7\u00f5es que permitem a leitura e a escrita de geometrias no formato que o PostGIS espera.<\/p>\n<p>Existem fun\u00e7\u00f5es para convers\u00e3o de texto para geometria, bytes para geometria e outros formatos. Mas a campe\u00e3 de flexibilidade para testes r\u00e1pidos e verifica\u00e7\u00f5es \u00e9 a <code>ST_GeomFromText<\/code>.<\/p>\n<p>Veja abaixo um exemplo de como us\u00e1-la:<\/p>\n<pre><code class=\"sql\">SELECT * FROM ST_GeomFromText('POINT(0 0)', 4326);\n<\/code><\/pre>\n<p>Veja a sa\u00edda do <a href=\"https:\/\/postgis.net\/\">PostGIS<\/a>, no formato interno.<\/p>\n<pre><code>0101000020E610000000000000000000000000000000000000\n<\/code><\/pre>\n<p>Lembro, que esta funcionalidade n\u00e3o \u00e9 somente \u00fatil para a convers\u00e3o para o formato esperado, mas tamb\u00e9m para usar seu resultado como entrada para outras fun\u00e7\u00f5es, como no exemplo:<\/p>\n<pre><code>-- o pol\u00edgono interseciona o ponto?\nSELECT * FROM ST_Intersects(\n    ST_GeomFromText('POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))', 4326),\n    ST_GeomFromText('POINT(0 0)', 4326)\n);\n<\/code><\/pre>\n<p>Retornando um resultado positivo:<\/p>\n<pre><code>t\n<\/code><\/pre>\n<p>A assinatura desta fun\u00e7\u00e3o \u00e9 bem simples. Ela espera como primeiro par\u00e2metro uma string e opcionalmente um inteiro, representando o SRID (Spatial Reference ID). Nos exemplos foi usado WGS-84 como SRID.<\/p>\n<p>Refer\u00eancia: <a href=\"http:\/\/postgis.net\/docs\/ST_GeomCollFromText.html\">ST_GeomFromText<\/a><\/p>\n<h2>2. Validade de Geometrias<\/h2>\n<p>A validade das geometrias \u00e9 uma quest\u00e3o important\u00edssima para qualquer tipo de uso em pacotes de geoprocessamento.<\/p>\n<blockquote><p>\n  \u00c9 bom lembrar que o \u00fanico tipo de geometria (definido na [SFS] (Simple Feature Specification) que possui validade s\u00e3o os tipos poligonais (<code>Polygon<\/code> e <code>MultiPolygon<\/code>). Os outros tipos podem ser testados para sua validade, mas ela \u00e9 sempre verdadeira.\n<\/p><\/blockquote>\n<p>Geometrias inv\u00e1lidas n\u00e3o podem ser corretamente renderizadas e ir\u00e3o &#8220;mentir&#8221; quando investigadas sob diversos aspectos &#8211; notavelmente, <strong>c\u00e1lculos de \u00e1rea e testes de interse\u00e7\u00e3o podem falhar com geometrias inv\u00e1lidas<\/strong>.<\/p>\n<p>No PostGIS, existem algumas formas de se verificar a validade de geometrias. S\u00e3o tr\u00eas fun\u00e7\u00f5es simples que podem te ajudar a identificar culpados. As fun\u00e7\u00f5es s\u00e3o:<\/p>\n<ul>\n<li><a href=\"http:\/\/postgis.net\/docs\/ST_IsValid.html\">ST_IsValid<\/a> &#8211; Verifica a validade de uma geometria e retorna <code>verdadeiro<\/code> ou <code>falso<\/code>.<\/li>\n<li><a href=\"http:\/\/postgis.net\/docs\/ST_IsValidReason.html\">ST_IsValidReason<\/a> &#8211; Verifica a validade de uma geometria e retorna a raz\u00e3o pela qual a mesma \u00e9 inv\u00e1lida, exemplo: <code>auto intersec\u00e7\u00e3o<\/code>.<\/li>\n<li><a href=\"http:\/\/postgis.net\/docs\/ST_IsValidDetail.html\">ST_IsValidDetail<\/a> &#8211; Verifica a validade de uma geometria e retorna o motivo e a localiza\u00e7\u00e3o do problema, exemplo: <\/li>\n<\/ul>\n<pre><code class=\"sql\">SELECT * FROM\n    ST_IsValidDetail(\n        ST_GeomFromText('POLYGON((0 0, 0 -1, 0 1, 1 1, 1 0, 0 0))', 4326)\n    );\n<\/code><\/pre>\n<p>O resultado, neste caso, \u00e9 uma tupla com tr\u00eas elementos: <code>valid<\/code>, <code>reason<\/code> e <code>location<\/code>:<\/p>\n<pre><code>f;\"Self-intersection\";\"01010000000000000000000000000000000000F0BF\"\n<\/code><\/pre>\n<h2>3. Transforma\u00e7\u00e3o de Refer\u00eancia Espacial<\/h2>\n<p>O <a href=\"https:\/\/postgis.net\/\">PostGIS<\/a> suporta m\u00fatliplas refer\u00eancias espaciais. Tradicionalmente, isto \u00e9 conhecido por um c\u00f3digo <code>EPSG<\/code> , o <code>SRID<\/code>.<\/p>\n<blockquote><p>\n  SRID \u00e9 a abrevia\u00e7\u00e3o para Spatial Reference System Identifier, definido originalmente pelo EPSG. \u00c9 um c\u00f3digo \u00fanico que identifica um sistema de refer\u00eancia espacial, com todos as suas varia\u00e7\u00f5es de datum, proje\u00e7\u00e3o e sistema de coordenadas.<\/p>\n<p>  EPSG \u00e9 a abrevia\u00e7\u00e3o para Euroupean Petroleum Survey Group &#8211; que n\u00e3o existe mais, foi absorvido pelo <a href=\"https:\/\/en.wikipedia.org\/wiki\/International_Association_of_Oil_%26_Gas_Producers\">IOGP<\/a> (International Association of Oil and Gas Producers).\n<\/p><\/blockquote>\n<p>Geralmente, cada tabela no PostGIS, possui apenas uma coluna geom\u00e9trica, com um <code>SRID<\/code>definido. Apesar disso, o PostGIS suporta m\u00faltiplas colunas geom\u00e9tricas em uma mesma tabela e at\u00e9 mesmo colunas geom\u00e9tricas com refer\u00eancias espaciais nulas.<\/p>\n<p>A multiplicidade de dados geogr\u00e1ficos faz necess\u00e1ria a convers\u00e3o entre diferentes <code>SRIDs<\/code>. Lembramos tamb\u00e9m que <strong>compara\u00e7\u00f5es e testes de relacionamento entre geometrias (como se uma geometria interseciona outra)<\/strong> devem ser feitos apenas se ambas geometrias possuem <strong>o mesmo sistema de refer\u00eancia espacial<\/strong>.<\/p>\n<p>Um exemplo simples, \u00e9 a convers\u00e3o de uma coordenada UTM, na zona 22 Sul em SIRGAS 2000 para SIRGAS 2000 geogr\u00e1fico:<\/p>\n<pre><code>SELECT * FROM \n    ST_AsText(\n        ST_Transform(\n            ST_GeomFromText(\n                'POINT(789071 7905599)', 31982),\n                4674\n            )\n        )\n<\/code><\/pre>\n<blockquote><p>\n  Note que na chamada acima, usamos <code>ST_GeomFromText<\/code> para &#8220;instanciar&#8221; as geometrias em mem\u00f3ria, de coordenadas geogr\u00e1ficas, transformamos as mesmas com <code>ST_Transform<\/code> e pedimos sua representa\u00e7\u00e3o textual com <code>ST_AsText<\/code>.\n<\/p><\/blockquote>\n<p>Para refer\u00eancias de c\u00f3digos EPSG e SRIDs, use o site <a href=\"http:\/\/epsg.io\/\">epsg.io<\/a>. Abaixo est\u00e3o as duas URLs as refer\u00eancias espaciais usadas no comando acima:<\/p>\n<ul>\n<li><a href=\"http:\/\/epsg.io\/31982\">31982<\/a> &#8211; SIRGAS 2000 UTM 22S;<\/li>\n<li><a href=\"http:\/\/epsg.io\/4674\">4674<\/a> &#8211; SIRGAS 2000 &#8211; Geogr\u00e1fico;<\/li>\n<\/ul>\n<h2>Conclus\u00e3o<\/h2>\n<p>Apesar de discutirmos neste artigo, fun\u00e7\u00f5es b\u00e1sicas do <a href=\"https:\/\/postgis.net\/\">PostGIS<\/a>, elas s\u00e3o muito \u00fateis em todos os cen\u00e1rios, seja no desenvolvimento de sistemas com o PostGIS ou utilizando o PostGIS como motor de an\u00e1lise espacial.<\/p>\n<p>Este \u00e9 um dos primeiros artigos sobre PostGIS. Fique ligado aqui no blog que logo logo teremos mais.<\/p>\n<p>Abra\u00e7os<\/p>\n","protected":false},"excerpt":{"rendered":"<p>N\u00e3o \u00e9 segredo algum, mas todos sabemos que o PostGIS \u00e9 a extens\u00e3o espacial mais produtiva do mundo. Ela n\u00e3o s\u00f3 possui mais funcionalidades do que as outras dispon\u00edveis no mercado, mas como \u00e9 open-source, com uma comunidade incr\u00edvel por tr\u00e1s. Hoje vou revelar alguns pequenos segredos escondidos nas funcionalidades do PostGIS para voc\u00eas. Estas &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/geoadmin.com.br\/?p=638\" class=\"more-link\">Leia mais<span class=\"screen-reader-text\"> &#8220;3 Ferramentas do PostGIS que s\u00e3o uma m\u00e3o na roda&#8221;<\/span><\/a><\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[67,64,29,38,66,68],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/posts\/638"}],"collection":[{"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=638"}],"version-history":[{"count":1,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/posts\/638\/revisions"}],"predecessor-version":[{"id":1307,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/posts\/638\/revisions\/1307"}],"wp:attachment":[{"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=638"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}