{"id":8746,"date":"2020-04-14T07:30:04","date_gmt":"2020-04-14T10:30:04","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=8746"},"modified":"2020-04-14T09:10:59","modified_gmt":"2020-04-14T12:10:59","slug":"como-usar-o-st_subdivide-do-postgis","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2020\/04\/14\/como-usar-o-st_subdivide-do-postgis\/","title":{"rendered":"Como usar o ST_Subdivide do PostGIS"},"content":{"rendered":"<p>Uma das coisas que torna desafiador o gerenciamento de dados geoespaciais \u00e9 a enorme variedade de escalas que os dados geoespaciais cobrem: \u00e1reas t\u00e3o grandes quanto um continente ou t\u00e3o pequenas quanto um buraco feito pelo homem.<\/p>\n<p>Os dados no banco de dados tamb\u00e9m abrangem uma ampla variedade, de pontos \u00fanicos, a pol\u00edgonos com milhares de v\u00e9rtices. E o tamanho importa! Um objeto grande leva mais tempo para recuper\u00e1-lo e mais tempo para executar c\u00e1lculos.<\/p>\n<p>O arquivo de pa\u00edses da <a href=\"http:\/\/www.naturalearthdata.com\/http\/\/www.naturalearthdata.com\/download\/10m\/cultural\/ne_10m_admin_0_countries.zip\" rel=\"noopener noreferrer\" target=\"_blank\">Natural Earth<\/a> \u00e9 um bom exemplo dessa varia\u00e7\u00e3o. Carregue os dados no PostGIS e inspecione os tamanhos dos objetos usando SQL:<\/p>\n<pre>\r\nSELECT admin, ST_NPoints(the_geom), ST_MemSize(the_geom) \r\nFROM ne_10m_admin_0_countries \r\nORDER BY ST_NPoints;\r\n<\/pre>\n<ul>\n<li>As Ilhas do Mar de Coral s\u00e3o representadas com um pol\u00edgono de 4 pontos, apenas 112 bytes.<\/li>\n<li>O Canad\u00e1 \u00e9 representado com um multi-pol\u00edgono de 68159 pontos, 1 megabytes de tamanho!<\/li>\n<\/ul>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/countries.png\" alt=\"\" width=\"1008\" height=\"601\" class=\"aligncenter size-full wp-image-8786\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/countries.png 1008w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/countries-300x179.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/countries-768x458.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/countries-600x358.png 600w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/countries-945x563.png 945w\" sizes=\"auto, (max-width: 1008px) 100vw, 1008px\" \/><br \/>\n<\/center><\/p>\n<p>Mais da metade (149) dos pa\u00edses da tabela \u00e9 maior que o tamanho da p\u00e1gina do banco de dados (8Kb), o que significa que eles levar\u00e3o mais tempo para serem recuperados.<\/p>\n<pre>\r\nSELECT Count(*) \r\nFROM ne_10m_admin_0_countries \r\nWHERE ST_MemSize(the_geom) > 8192;\r\n<\/pre>\n<p>Podemos ver a sobrecarga envolvida no trabalho com grandes dados, for\u00e7ando uma grande recupera\u00e7\u00e3o e poder computacional.<\/p>\n<p>Carregue tamb\u00e9m a <a href=\"http:\/\/www.naturalearthdata.com\/http\/\/www.naturalearthdata.com\/download\/10m\/cultural\/ne_10m_populated_places_simple.zip\" rel=\"noopener noreferrer\" target=\"_blank\">camada de locais populados do Natural Earth<\/a> no PostGIS e execute uma jun\u00e7\u00e3o espacial completa entre as duas tabelas:<\/p>\n<pre>\r\nSELECT Count(*)\r\nFROM ne_10m_admin_0_countries countries \r\nJOIN ne_10m_populated_places_simple places \r\nON ST_Contains(countries.the_geom, places.the_geom)\r\n<\/pre>\n<p>Embora a tabela de locais(7322) e a tabela de pa\u00edses(255) sejam muito pequenas, o c\u00e1lculo ainda leva alguns segundos (que vai depender de computador pra computador).<\/p>\n<p>Os objetos grandes causam v\u00e1rias inefici\u00eancias:<\/p>\n<ul>\n<li>\u00c1reas geograficamente grandes (como Canad\u00e1 ou R\u00fassia) t\u00eam grandes BBOXs, fazendo com que os \u00edndices n\u00e3o funcionem com a mesma efici\u00eancia na busca de pontos que n\u00e3o se enquadram nos pa\u00edses.<\/li>\n<li>Objetos fisicamente grandes t\u00eam grandes listas de v\u00e9rtices, que levam muito tempo para passar pelo c\u00e1lculo da fun\u00e7\u00e3o ST_Contains.<\/li>\n<\/ul>\n<p>Como podemos acelerar o processo? Reduzindo os objetos grandes usando a <a href=\"http:\/\/postgis.net\/docs\/ST_Subdivide.html\" rel=\"noopener noreferrer\" target=\"_blank\">fun\u00e7\u00e3o ST_Subdivide()<\/a>!<\/p>\n<p>Primeiro, \u00e9 necess\u00e1rio gerar uma nova tabela de pa\u00edses subdivididos:<\/p>\n<pre>\r\nCREATE TABLE ne_10m_admin_0_countries_subdivided AS\r\nSELECT ST_SubDivide(the_geom) AS the_geom, admin \r\nFROM ne_10m_admin_0_countries;\r\n<\/pre>\n<p>Agora temos os mesmos dados, mas nenhum objeto tem mais de 255 v\u00e9rtices (cerca de 4Kb) de tamanho!<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/countries_subdivided.png\" alt=\"\" width=\"1002\" height=\"596\" class=\"aligncenter size-full wp-image-8784\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/countries_subdivided.png 1002w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/countries_subdivided-300x178.png 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/countries_subdivided-768x457.png 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/countries_subdivided-600x357.png 600w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/countries_subdivided-945x562.png 945w\" sizes=\"auto, (max-width: 1002px) 100vw, 1002px\" \/><br \/>\n<\/center><\/p>\n<p>Execute a uni\u00e3o espacial novamente e veja a mudan\u00e7a:<\/p>\n<pre>\r\nSELECT Count(*)\r\nFROM ne_10m_admin_0_countries_subdivided countries \r\nJOIN ne_10m_populated_places_simple places \r\nON ST_Contains(countries.the_geom, places.the_geom)\r\n<\/pre>\n<p>No meu computador que foi executado o tempo de retorno foi de 0,5 segundos (60 vezes mais r\u00e1pido), mesmo que a tabela de pa\u00edses agora tenha 8633 linhas. A subdivis\u00e3o realizou duas coisas:<\/p>\n<ul>\n<li>Agora, cada pol\u00edgono cobre uma \u00e1rea menor; portanto, \u00e9 menos prov\u00e1vel que as pesquisas de \u00edndice obtenham pontos que n\u00e3o est\u00e3o dentro do pol\u00edgono.<\/li>\n<li>Agora, cada pol\u00edgono est\u00e1 abaixo do tamanho da p\u00e1gina; portanto, a recupera\u00e7\u00e3o do disco ser\u00e1 muito mais r\u00e1pida.<\/li>\n<\/ul>\n<p>Subdividir grandes coisas tamb\u00e9m pode tornar o desenho do mapa mais r\u00e1pido, mas cuidado: depois que seus pol\u00edgonos forem subdivididos, voc\u00ea ter\u00e1 que desativar os contornos do pol\u00edgono para evitar mostrar os limites quadrados no mapa renderizado.<\/p>\n<p><em>Esta post foi publicado originalmente no <a href=\"https:\/\/carto.com\/blog\/subdivide-all-things\/\" rel=\"noopener noreferrer\" target=\"_blank\">blog da CARTO<\/a>.<\/em><\/p>\n<p>Fonte: <a href=\"http:\/\/blog.cleverelephant.ca\/2019\/11\/subdivide.html\" rel=\"noopener noreferrer\" target=\"_blank\">Clever Elephant Blog<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma das coisas que torna desafiador o gerenciamento de dados geoespaciais \u00e9 a enorme variedade de escalas que os dados geoespaciais cobrem: \u00e1reas t\u00e3o grandes quanto um continente ou t\u00e3o pequenas quanto um buraco feito pelo homem. Os dados no&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2020\/04\/14\/como-usar-o-st_subdivide-do-postgis\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":8789,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[212],"class_list":["post-8746","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-postgis"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8746","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/users\/275"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/comments?post=8746"}],"version-history":[{"count":6,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8746\/revisions"}],"predecessor-version":[{"id":8805,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8746\/revisions\/8805"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/8789"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=8746"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=8746"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=8746"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}