{"id":6116,"date":"2016-07-25T07:30:51","date_gmt":"2016-07-25T10:30:51","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=6116"},"modified":"2016-08-12T14:48:57","modified_gmt":"2016-08-12T17:48:57","slug":"analise-e-visualizacao-de-dados-lidar-parte-5","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2016\/07\/25\/analise-e-visualizacao-de-dados-lidar-parte-5\/","title":{"rendered":"An\u00e1lise e visualiza\u00e7\u00e3o de dados LiDAR \u2013 Parte 5"},"content":{"rendered":"<p>Para o nosso exemplo de hoje vamos dar um zoom e encontrar um edif\u00edcio para analisar (se voc\u00ea aumenta o zoom, os edif\u00edcios se tornam clic\u00e1veis).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/building_81719.png\" alt=\"building_81719\" width=\"559\" height=\"449\" class=\"aligncenter size-full wp-image-6118\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/building_81719.png 559w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/building_81719-300x241.png 300w\" sizes=\"auto, (max-width: 559px) 100vw, 559px\" \/><\/p>\n<p>Podemos ver que o edif\u00edcio #81719 (identificador da chave prim\u00e1ria do banco de dados) tem um n\u00famero limitado de atributos, incluindo uma eleva\u00e7\u00e3o de 1.446,43! Nossos dados LIDAR variam cerca de 450 metros, de modo que a eleva\u00e7\u00e3o nos edif\u00edcios \u00e9 provavelmente medida em p\u00e9s.<\/p>\n<p>Como podemos calcular a eleva\u00e7\u00e3o para o edif\u00edcio #81719 utilizando a tabela LIDAR? Veja como a l\u00f3gica funciona visualmente:<\/p>\n<p>1. Comece com o edif\u00edcio.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/pc_analysis_1.png\" alt=\"pc_analysis_1\" width=\"540\" height=\"415\" class=\"aligncenter size-full wp-image-6120\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/pc_analysis_1.png 540w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/pc_analysis_1-300x231.png 300w\" sizes=\"auto, (max-width: 540px) 100vw, 540px\" \/><\/p>\n<p>2. Localize todos os patches que se cruzam naquele edif\u00edcio.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/pc_analysis_2.png\" alt=\"pc_analysis_2\" width=\"481\" height=\"405\" class=\"aligncenter size-full wp-image-6121\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/pc_analysis_2.png 481w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/pc_analysis_2-300x253.png 300w\" sizes=\"auto, (max-width: 481px) 100vw, 481px\" \/><\/p>\n<p>3. Transforme essas manchas em pontos individuais.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/pc_analysis_3.png\" alt=\"pc_analysis_3\" width=\"479\" height=\"406\" class=\"aligncenter size-full wp-image-6122\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/pc_analysis_3.png 479w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/pc_analysis_3-300x254.png 300w\" sizes=\"auto, (max-width: 479px) 100vw, 479px\" \/><\/p>\n<p>4. Filtre esses pontos usando o contorno do edif\u00edcio.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/pc_analysis_4.png\" alt=\"pc_analysis_4\" width=\"489\" height=\"404\" class=\"aligncenter size-full wp-image-6123\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/pc_analysis_4.png 489w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/pc_analysis_4-300x248.png 300w\" sizes=\"auto, (max-width: 489px) 100vw, 489px\" \/><\/p>\n<p>5. Finalmente a m\u00e9dia dos pontos de eleva\u00e7\u00f5es dar\u00e1 um valor para o edif\u00edcio.<\/p>\n<p>Veja o procedimento acima em SQL:<\/p>\n<pre>--&nbsp;We&nbsp;run&nbsp;a&nbsp;set&nbsp;of&nbsp;subqueries&nbsp;sequentially&nbsp;using\r\n--&nbsp;the&nbsp;\"with\"&nbsp;keyword\r\nWITH\r\n--&nbsp;Get&nbsp;the&nbsp;one&nbsp;building&nbsp;we&nbsp;are&nbsp;interested&nbsp;in\r\nbuilding&nbsp;AS&nbsp;(\r\n&nbsp;&nbsp;SELECT&nbsp;geom&nbsp;FROM&nbsp;buildings\r\n&nbsp;&nbsp;WHERE&nbsp;buildings.gid&nbsp;=&nbsp;81719\r\n),\r\n--&nbsp;All&nbsp;the&nbsp;patches&nbsp;that&nbsp;intersect&nbsp;that&nbsp;building\r\npatches&nbsp;AS&nbsp;(\r\n&nbsp;&nbsp;SELECT&nbsp;pa&nbsp;FROM&nbsp;medford\r\n&nbsp;&nbsp;JOIN&nbsp;building&nbsp;ON&nbsp;PC_Intersects(pa,&nbsp;geom)\r\n),\r\n--&nbsp;All&nbsp;the&nbsp;points&nbsp;in&nbsp;that&nbsp;patch\r\npa_pts&nbsp;AS&nbsp;(\r\n&nbsp;&nbsp;SELECT&nbsp;PC_Explode(pa)&nbsp;AS&nbsp;pts&nbsp;FROM&nbsp;patches\r\n),\r\n--&nbsp;All&nbsp;the&nbsp;points&nbsp;in&nbsp;our&nbsp;one&nbsp;building\r\nbuilding_pts&nbsp;AS&nbsp;(\r\n&nbsp;&nbsp;SELECT&nbsp;pts&nbsp;FROM&nbsp;pa_pts&nbsp;JOIN&nbsp;building\r\n&nbsp;&nbsp;ON&nbsp;ST_Intersects(geom,&nbsp;pts::geometry)\r\n)\r\n--&nbsp;Summarize&nbsp;those&nbsp;points&nbsp;by&nbsp;elevation\r\nSELECT\r\n&nbsp;&nbsp;Avg(PC_Get(pts,&nbsp;'z'))&nbsp;AS&nbsp;lidar_meters\r\nFROM&nbsp;building_pts;<\/pre>\n<p>O resultado do SQL \u00e9 441.075 metros, que em p\u00e9s \u00e9 1447.1, quase exatamente o mesmo valor do arquivo de edif\u00edcios, 1.446,43!<\/p>\n<p>Ok! Por\u00e9m podemos acrescentar a eleva\u00e7\u00e3o a partir da nossa imagem LIDAR para todos os nossos edif\u00edcios? Sim, mas vai demorar algum tempo de processamento. Primeiro vamos adicionar uma coluna para aceitar o valor, e ent\u00e3o executar uma atualiza\u00e7\u00e3o na nossa tabela do banco de dados.<\/p>\n<pre>--&nbsp;Add&nbsp;column&nbsp;for&nbsp;our&nbsp;calculate&nbsp;Z&nbsp;value\r\nALTER&nbsp;TABLE&nbsp;buildings&nbsp;ADD&nbsp;COLUMN&nbsp;z&nbsp;real;\r\n--&nbsp;Update&nbsp;into&nbsp;the&nbsp;column\r\nUPDATE&nbsp;buildings&nbsp;SET&nbsp;z&nbsp;=&nbsp;elevs.z\r\nFROM&nbsp;(\r\n&nbsp;&nbsp;--&nbsp;For&nbsp;every&nbsp;building,&nbsp;all&nbsp;intersecting&nbsp;patches\r\n&nbsp;&nbsp;WITH&nbsp;patches&nbsp;AS&nbsp;(\r\n&nbsp;&nbsp;&nbsp;&nbsp;SELECT\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buildings.gid&nbsp;AS&nbsp;buildings_gid,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;medford.id&nbsp;AS&nbsp;medford_id,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;medford.pa&nbsp;AS&nbsp;pa\r\n&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;medford\r\n&nbsp;&nbsp;&nbsp;&nbsp;JOIN&nbsp;buildings\r\n&nbsp;&nbsp;&nbsp;&nbsp;ON&nbsp;PC_Intersects(pa,&nbsp;geom)\r\n&nbsp;&nbsp;),\r\n&nbsp;&nbsp;--&nbsp;Explode&nbsp;those&nbsp;patches&nbsp;into&nbsp;points,&nbsp;remembering\r\n&nbsp;&nbsp;--&nbsp;which&nbsp;building&nbsp;they&nbsp;were&nbsp;associated&nbsp;with\r\n&nbsp;&nbsp;pa_pts&nbsp;AS&nbsp;(\r\n&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;buildings_gid,&nbsp;PC_Explode(pa)&nbsp;AS&nbsp;pts&nbsp;FROM&nbsp;patches\r\n&nbsp;&nbsp;)\r\n&nbsp;&nbsp;--&nbsp;Use&nbsp;the&nbsp;building&nbsp;associations&nbsp;to&nbsp;efficiently\r\n&nbsp;&nbsp;--&nbsp;spatially&nbsp;test&nbsp;the&nbsp;points&nbsp;against&nbsp;the&nbsp;building&nbsp;footprints\r\n&nbsp;&nbsp;--&nbsp;Summarize&nbsp;per&nbsp;building\r\n&nbsp;&nbsp;SELECT\r\n&nbsp;&nbsp;&nbsp;&nbsp;buildings_gid,\r\n&nbsp;&nbsp;&nbsp;&nbsp;Avg(PC_Get(pts,&nbsp;'z'))&nbsp;AS&nbsp;z\r\n&nbsp;&nbsp;FROM&nbsp;pa_pts\r\n&nbsp;&nbsp;JOIN&nbsp;buildings\r\n&nbsp;&nbsp;ON&nbsp;buildings.gid&nbsp;=&nbsp;buildings_gid\r\n&nbsp;&nbsp;WHERE&nbsp;ST_Intersects(buildings.geom,&nbsp;pts::geometry)\r\n&nbsp;&nbsp;GROUP&nbsp;BY&nbsp;buildings_gid\r\n)&nbsp;AS&nbsp;elevs\r\n--&nbsp;Join&nbsp;calculated&nbsp;elevations&nbsp;to&nbsp;original&nbsp;buildings&nbsp;table\r\nWHERE&nbsp;elevs.buildings_gid&nbsp;=&nbsp;gid;<\/pre>\n<p>Nossa tabela est\u00e1 atualizada! Confira as eleva\u00e7\u00f5es originais e calculadas (temos que converter a coluna z de metros para p\u00e9s para compar\u00e1-la com a coluna eleva\u00e7\u00e3o):<\/p>\n<pre>SELECT z AS z_m, z*3.28084 AS z_ft, elevation AS elevation_ft\r\nFROM buildings;<\/pre>\n<p>Os valores est\u00e3o bem pr\u00f3ximos, veja:<\/p>\n<pre>&nbsp;&nbsp;&nbsp;z_m&nbsp;|&nbsp;z_ft&nbsp;|&nbsp;elevation_ft&nbsp;\r\n---------&nbsp;+&nbsp;------------------&nbsp;+&nbsp;---------------&nbsp;\r\n&nbsp;438,128&nbsp;|&nbsp;1.437,42663560303&nbsp;|&nbsp;1434.43000000&nbsp;\r\n&nbsp;433,556&nbsp;|&nbsp;1.422,4291678418&nbsp;|&nbsp;1413.63200000&nbsp;\r\n&nbsp;435,489&nbsp;|&nbsp;1.428,76987573853&nbsp;|&nbsp;1406.25400000&nbsp;\r\n&nbsp;439,244&nbsp;|&nbsp;1.441,09014682129&nbsp;|&nbsp;1422.58200000&nbsp;\r\n&nbsp;433,738&nbsp;|&nbsp;1.423,02460105347&nbsp;|&nbsp;1416.93600000&nbsp;\r\n&nbsp;429,648&nbsp;|&nbsp;1.409,60687857788&nbsp;|&nbsp;1403.92400000&nbsp;\r\n&nbsp;437,264&nbsp;|&nbsp;1.434,59264585083&nbsp;|&nbsp;1425.84000000&nbsp;\r\n&nbsp;430,607&nbsp;|&nbsp;1.412,75115040894&nbsp;|&nbsp;1404.03675300<\/pre>\n<p>Vamos colocar a diferen\u00e7a de eleva\u00e7\u00e3o (em metros) na tabela, veja como:<\/p>\n<pre>--&nbsp;Add&nbsp;column&nbsp;for&nbsp;our&nbsp;calculated&nbsp;height\r\nALTER&nbsp;TABLE&nbsp;buildings&nbsp;ADD&nbsp;COLUMN&nbsp;height&nbsp;real;\r\n--&nbsp;Update&nbsp;the&nbsp;building&nbsp;heights&nbsp;by&nbsp;subtracting&nbsp;elevation&nbsp;of\r\n--&nbsp;the&nbsp;nearest&nbsp;street&nbsp;from&nbsp;the&nbsp;elevation&nbsp;of&nbsp;the&nbsp;building\r\nUPDATE&nbsp;buildings&nbsp;SET&nbsp;height&nbsp;=&nbsp;heights.height\r\nFROM&nbsp;(\r\n&nbsp;&nbsp;WITH&nbsp;candidates&nbsp;AS&nbsp;(\r\n&nbsp;&nbsp;&nbsp;&nbsp;SELECT\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.gid&nbsp;AS&nbsp;building_gid,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.gid&nbsp;AS&nbsp;street_gid,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.z&nbsp;AS&nbsp;streets_z,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.z&nbsp;as&nbsp;buildings_z\r\n&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;buildings&nbsp;b,&nbsp;streets&nbsp;s\r\n&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;ST_DWithin(b.geom,&nbsp;s.geom,&nbsp;0.001)\r\n&nbsp;&nbsp;&nbsp;&nbsp;ORDER&nbsp;BY\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;building_gid,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ST_Distance(b.geom,&nbsp;s.geom)\r\n&nbsp;&nbsp;)\r\n&nbsp;&nbsp;SELECT&nbsp;DISTINCT&nbsp;ON&nbsp;(building_gid)\r\n&nbsp;&nbsp;&nbsp;&nbsp;building_gid,&nbsp;street_gid,\r\n&nbsp;&nbsp;&nbsp;&nbsp;buildings_z&nbsp;-&nbsp;streets_z&nbsp;AS&nbsp;height\r\n&nbsp;&nbsp;FROM&nbsp;candidates\r\n)&nbsp;AS&nbsp;heights\r\nWHERE&nbsp;heights.building_gid&nbsp;=&nbsp;buildings.gid;<\/pre>\n<p>No pr\u00f3ximo post, finalizaremos nossa s\u00e9rie de posts sobre LiDAR, n\u00e3o perca!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para o nosso exemplo de hoje vamos dar um zoom e encontrar um edif\u00edcio para analisar (se voc\u00ea aumenta o zoom, os edif\u00edcios se tornam clic\u00e1veis). Podemos ver que o edif\u00edcio #81719 (identificador da chave prim\u00e1ria do banco de dados)&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2016\/07\/25\/analise-e-visualizacao-de-dados-lidar-parte-5\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":6134,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[268],"class_list":["post-6116","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-lidar"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/6116","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=6116"}],"version-history":[{"count":14,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/6116\/revisions"}],"predecessor-version":[{"id":6204,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/6116\/revisions\/6204"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/6134"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=6116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=6116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=6116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}