{"id":8723,"date":"2020-04-06T07:30:05","date_gmt":"2020-04-06T10:30:05","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=8723"},"modified":"2020-04-06T09:29:12","modified_gmt":"2020-04-06T12:29:12","slug":"postgis-3-extensao-raster","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2020\/04\/06\/postgis-3-extensao-raster\/","title":{"rendered":"PostGIS 3: Extens\u00e3o Raster"},"content":{"rendered":"<p>A funcionalidade Raster no PostGIS faz parte da extens\u00e3o principal desde que foi introduzida. Com o lan\u00e7amento do PostGIS 3, se voc\u00ea quiser a funcionalidade Raster, voc\u00ea precisar\u00e1 instalar a extens\u00e3o principal (postgis) e tamb\u00e9m a extens\u00e3o postgis_raster. Veja:<\/p>\n<pre>\r\nCREATE EXTENSION postgis;\r\nCREATE EXTENSION postgis_raster;\r\n<\/pre>\n<p>A separa\u00e7\u00e3o da funcionalidade Raster permite que se crie os pacotes do PostGIS de uma forma simplificada, sem a necessidade das depend\u00eancias da extens\u00e3o Raster, que incluem a biblioteca GDAL, um tanto quanto pesada. A funcionalidade Raster permanece intacta, no entanto, e voc\u00ea ainda pode fazer coisas bacanas com ela.<\/p>\n<p>Por exemplo, fa\u00e7a o download e importe um arquivo de &#8220;modelo de eleva\u00e7\u00e3o digital&#8221;. No meu caso, vou utilizar um arquivo da cidade de Vancouver.<\/p>\n<p><center><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem.jpg\" alt=\"\" width=\"1071\" height=\"717\" class=\"aligncenter size-full wp-image-8724\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem.jpg 1071w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem-300x201.jpg 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem-1024x686.jpg 1024w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem-768x514.jpg 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem-600x402.jpg 600w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem-945x633.jpg 945w\" sizes=\"auto, (max-width: 1071px) 100vw, 1071px\" \/><\/center><\/p>\n<p>Para baixar essa imagem eu fiz o seguinte:<\/p>\n<pre>\r\ncreatedb yvr_raster\r\npsql -c 'CREATE EXTENSION postgis' yvr_raster\r\npsql -c 'CREATE EXTENSION postgis_raster' yvr_raster\r\n<\/pre>\n<p>1. Criei uma base de dados e instalei nela as extens\u00f5es postgis e postgis_raster<\/p>\n<pre>\r\nwget https:\/\/pub.data.gov.bc.ca\/datasets\/175624\/92g\/092g06_e.dem.zip\r\nunzip 092g06_e.dem.zip\r\n<\/pre>\n<p>2. Baixei os dados de DEM no site https:\/\/pub.data.gov.bc.ca\/datasets\/175624\/<\/p>\n<pre>\r\nraster2pgsql -I -F -s 4269 -t 56x56 092g06_e.dem dem092g06e | psql yvr_raster\r\n<\/pre>\n<p>3. Carreguei os dados no banco.<\/p>\n<p>Ap\u00f3s o carregamento dos dados, temos uma tabela com o nome dem092g06e de eleva\u00e7\u00e3o de 56 por 56 pixels. Se voc\u00ea mapear a extens\u00e3o, eles se parecer\u00e3o com isso:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem_extents.jpg\" alt=\"\" width=\"1068\" height=\"707\" class=\"aligncenter size-full wp-image-8725\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem_extents.jpg 1068w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem_extents-300x199.jpg 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem_extents-1024x678.jpg 1024w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem_extents-768x508.jpg 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem_extents-600x397.jpg 600w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem_extents-945x626.jpg 945w\" sizes=\"auto, (max-width: 1068px) 100vw, 1068px\" \/><br \/>\n<\/center><\/p>\n<p>Imagine uma eleva\u00e7\u00e3o de 30 metros no n\u00edvel do solo (em um caso extremo, a Groenl\u00e2ndia e a Ant\u00e1rtica seriam 68 metros). Quanto de Vancouver ficaria debaixo d&#8217;\u00e1gua? \u00c9 principalmente um lugar montanhoso. Vamos descobrir:<\/p>\n<pre>\r\nCREATE TABLE poly_30 AS \r\n  SELECT (\r\n   ST_DumpAsPolygons(\r\n    ST_SetBandNoDataValue(\r\n     ST_Reclass(\r\n      ST_Union(rast), \r\n      '0-30:1-1, 31-5000:0-0', '2BUI'),\r\n     0))).*\r\nFROM dem092g06e d\r\n<\/pre>\n<p>Existem muitas fun\u00e7\u00f5es aninhadas, portanto, lendo de dentro para fora, n\u00f3s temos:<\/p>\n<p>1. Uni\u00e3o de todas os chips em uma grande imagem Raster<br \/>\n2. Reclassifica\u00e7\u00e3o de todos os valores de 0 a 30 para 1 e todos os valores mais altos para 0<br \/>\n3. Defini\u00e7\u00e3o do valor &#8220;nodata&#8221; como 0, n\u00e3o nos importamos com coisas que est\u00e3o acima do nosso limite<br \/>\n4. Cria\u00e7\u00e3o de um pol\u00edgono vetorial para cada valor no raster (existe apenas um valor: &#8220;1&#8221;)<\/p>\n<p>O resultado fica assim:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem_poly.jpg\" alt=\"\" width=\"1055\" height=\"708\" class=\"aligncenter size-full wp-image-8727\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem_poly.jpg 1055w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem_poly-300x201.jpg 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem_poly-1024x687.jpg 1024w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem_poly-768x515.jpg 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem_poly-600x403.jpg 600w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_dem_poly-945x634.jpg 945w\" sizes=\"auto, (max-width: 1055px) 100vw, 1055px\" \/><br \/>\n<\/center><\/p>\n<p>Podemos pegar os dados de constru\u00e7\u00e3o em Vancouver e verificar quantos edif\u00edcios ficar\u00e3o embaixo da \u00e1gua:<\/p>\n<pre>\r\nwget ftp:\/\/webftp.vancouver.ca\/OpenData\/shape\/building_footprints_2009_shp.zip\r\nunzip building_footprints_2009_shp.zip\r\nshp2pgsql -I -s 26910 -D building_footprints_2009 buildings | psql yvr_raster\r\n<\/pre>\n<p>Antes comparar os edif\u00edcios com a zona de inunda\u00e7\u00e3o, precisamos coloc\u00e1-los na mesma proje\u00e7\u00e3o que a zona de inunda\u00e7\u00e3o (SRID 4269).<\/p>\n<pre>\r\nALTER TABLE buildings\r\nALTER COLUMN geom \r\nTYPE geometry(MultiPolygonZ, 4269)\r\nUSING ST_Transform(geom, 4269)\r\n<\/pre>\n<p><center><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_buildings.jpg\" alt=\"\" width=\"1054\" height=\"703\" class=\"aligncenter size-full wp-image-8728\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_buildings.jpg 1054w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_buildings-300x200.jpg 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_buildings-1024x683.jpg 1024w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_buildings-768x512.jpg 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_buildings-600x400.jpg 600w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_buildings-945x630.jpg 945w\" sizes=\"auto, (max-width: 1054px) 100vw, 1054px\" \/><\/center><\/p>\n<p>Agora podemos encontrar edif\u00edcios inundados:<\/p>\n<pre>\r\nCREATE TABLE buildings_30_poly AS\r\n  SELECT b.* \r\n    FROM buildings b\r\n    JOIN poly_30 p\r\n      ON ST_Intersects(p.geom, b.geom)\r\n    WHERE ST_Intersects(p.geom, ST_Centroid(b.geom))\r\n<\/pre>\n<p>Existe outra maneira de encontrar edif\u00edcios abaixo de 30 metros, sem ter que construir um pol\u00edgono, assim:<\/p>\n<pre>\r\nCREATE TABLE buildings_30_rast AS\r\n  SELECT b.*\r\n    FROM buildings b\r\n    JOIN dem092g06e d\r\n      ON ST_Intersects(b.geom, d.rast)\r\n    WHERE ST_Value(d.rast, ST_Centroid(b.geom)) < 30;\r\n<\/pre>\n<p>Como a constru\u00e7\u00e3o de pol\u00edgonos a partir da Raster pode ser cara, unir as camadas raster e a vetorial \u00e9 geralmente a maneira que queremos realizar essa an\u00e1lise.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_buildings_flood.jpg\" alt=\"\" width=\"1067\" height=\"709\" class=\"aligncenter size-full wp-image-8729\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_buildings_flood.jpg 1067w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_buildings_flood-300x199.jpg 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_buildings_flood-1024x680.jpg 1024w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_buildings_flood-768x510.jpg 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_buildings_flood-600x399.jpg 600w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/yvr_buildings_flood-945x628.jpg 945w\" sizes=\"auto, (max-width: 1067px) 100vw, 1067px\" \/><br \/>\n<\/center><\/p>\n<p>Para trazer dados cont\u00ednuos (eleva\u00e7\u00f5es, temperaturas, resultados do modelo) para a an\u00e1lise GIS, a extens\u00e3o postgis_raster pode ser bastante \u00fatil.<\/p>\n<p>Fonte: <a href=\"http:\/\/blog.cleverelephant.ca\/2019\/08\/postgis-3-raster.html\" rel=\"noopener noreferrer\" target=\"_blank\">Clever Elephant Blog<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A funcionalidade Raster no PostGIS faz parte da extens\u00e3o principal desde que foi introduzida. Com o lan\u00e7amento do PostGIS 3, se voc\u00ea quiser a funcionalidade Raster, voc\u00ea precisar\u00e1 instalar a extens\u00e3o principal (postgis) e tamb\u00e9m a extens\u00e3o postgis_raster. Veja: CREATE&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2020\/04\/06\/postgis-3-extensao-raster\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":8731,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[212,187],"class_list":["post-8723","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-postgis","tag-raster"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8723","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=8723"}],"version-history":[{"count":3,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8723\/revisions"}],"predecessor-version":[{"id":8801,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8723\/revisions\/8801"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/8731"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=8723"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=8723"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=8723"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}