{"id":6132,"date":"2016-07-26T09:37:55","date_gmt":"2016-07-26T12:37:55","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=6132"},"modified":"2016-08-12T14:47:16","modified_gmt":"2016-08-12T17:47:16","slug":"analise-e-visualizacao-de-dados-lidar-parte-6","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2016\/07\/26\/analise-e-visualizacao-de-dados-lidar-parte-6\/","title":{"rendered":"An\u00e1lise e visualiza\u00e7\u00e3o de dados LiDAR \u2013 Parte 6"},"content":{"rendered":"<p>Agora que temos dados de eleva\u00e7\u00e3o e altura em nossos edif\u00edcios podemos fazer um indicador ainda mais atraente visualmente.<\/p>\n<p>1. Na guia &#8220;Dados&#8221;, clique no bot\u00e3o &#8220;Atualizar tipo de recurso&#8221;, para que GeoServer esteja ciente dos novos atributos z e z_diff.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/gs_reloadft.jpg\" alt=\"gs_reloadft\" width=\"218\" height=\"171\" class=\"aligncenter size-full wp-image-6139\" \/><\/p>\n<p>2. Dentro do diret\u00f3rio de dados, localize a pasta <i>workspaces\/opengeo\/lidar\/buildings<\/i><\/p>\n<p>3. Criar um arquivo de texto com o nome <em>height.ftl<\/em> no diret\u00f3rio mencionado acima com o conte\u00fado: ${height.value}<\/p>\n<p>4. \u00c9 isso a\u00ed! Agora abra a camada KML no Google Earth e d\u00ea zoom at\u00e9 se aproximar dos edif\u00edcios para ver o resultado.<\/p>\n<p>5. <a href=\"http:\/\/localhost:8080\/geoserver\/wms\/kml?layers=opengeo:buildings&#038;mode=refresh&#038;kmscore=50&#038;format_options=lookatbbox:bbox=-122.8808,42.3311,-122.8806,42.3313\" target=\"_blank\">http:\/\/localhost:8080\/geoserver\/wms\/kml?layers=opengeo:buildings&#038;mode=refresh&#038;kmscore=50&#038;format_options=lookatbbox:bbox=-122.8808,42.3311,-122.8806,42.3313<\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/ge_buildings.jpg\" alt=\"ge_buildings\" width=\"1020\" height=\"428\" class=\"aligncenter size-full wp-image-6140\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/ge_buildings.jpg 1020w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/ge_buildings-300x126.jpg 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/ge_buildings-768x322.jpg 768w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/ge_buildings-945x397.jpg 945w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/ge_buildings-600x252.jpg 600w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/p>\n<p>Se voc\u00ea explorar a visualiza\u00e7\u00e3o em 3D dos edif\u00edcios por um tempo, voc\u00ea pode se deparar com alguns bairros \u00edmpares, como este.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/ge_buildings_trees1.jpg\" alt=\"ge_buildings_trees1\" width=\"639\" height=\"434\" class=\"aligncenter size-full wp-image-6142\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/ge_buildings_trees1.jpg 639w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/ge_buildings_trees1-300x204.jpg 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/ge_buildings_trees1-600x408.jpg 600w\" sizes=\"auto, (max-width: 639px) 100vw, 639px\" \/><\/p>\n<p>Se voc\u00ea perceber na imagem acima 3 edif\u00edcios parecem um pouco fora do lugar nesta \u00e1rea residencial, e a torre no quintal? Algo est\u00e1 errado.<\/p>\n<p>O que estamos vendo \u00e9 o efeito das \u00e1rvores nos dados LIDAR. Os pulsos de laser est\u00e3o refletindo em volta das \u00e1rvores, bem como nas casas fazendo com que a altitude m\u00e9dia de pontos dentro dos pol\u00edgonos das edifica\u00e7\u00f5es sejam artificialmente infladas.<\/p>\n<p>Como podemos corrigir isso?<\/p>\n<p>Os dados LIDAR refletidos das \u00e1rvores ir\u00e1 gerar mais de uma reflex\u00e3o de retorno para cada pulso de sa\u00edda, e quanto mais longe a reflex\u00e3o, maior o tempo de retorno da luz. Ao inv\u00e9s de gerar nossas alturas dos edif\u00edcios como a m\u00e9dia de todos os pontos LIDAR, queremos a m\u00e9dia apenas os \u00faltimos retornos para cada pulso; os retornos que s\u00e3o os mais profundos.<\/p>\n<p>Uma solu\u00e7\u00e3o simples \u00e9 dar peso aos retornos, de modo que em \u00e1reas de tipos de retorno mistos os retornos mais profundas t\u00eam mais peso. Podemos fazer isso ser substituindo a nossa fun\u00e7\u00e3o AVG no c\u00e1lculo LIDAR com uma m\u00e9dia ponderada:<\/p>\n<pre>-- numerator\r\nSum(CASE WHEN PC_Get(pts,'ReturnNumber') = 1\r\n     THEN PC_Get(pts, 'z')\r\n     WHEN PC_Get(pts,'ReturnNumber') = 2\r\n     THEN 10*PC_Get(pts, 'z')\r\n     ELSE 100*PC_Get(pts, 'z') END) \/\r\n-- denominator\r\nSum(CASE WHEN PC_Get(pts,'ReturnNumber') = 1\r\n    THEN 1\r\n    WHEN PC_Get(pts,'ReturnNumber') = 2\r\n    THEN 10\r\n    ELSE 100 END) AS z<\/pre>\n<p>Agora estamos prontos para voltar a executar o nosso c\u00e1lculo de eleva\u00e7\u00e3o e nosso c\u00e1lculo de altura para ver o efeito sobre a sa\u00edda do final KML.<\/p>\n<pre>-- Update into the buildings Z column\r\nUPDATE buildings SET z = elevs.z\r\nFROM (\r\n  -- For every building, all intersecting patches\r\n  WITH patches AS (\r\n    SELECT\r\n      buildings.gid AS buildings_gid,\r\n      medford.id AS medford_id,\r\n      medford.pa AS pa\r\n    FROM medford\r\n    JOIN buildings\r\n    ON PC_Intersects(pa, geom)\r\n  ),\r\n  -- Explode those patches into points, remembering\r\n  -- which building they were associated with\r\n  pa_pts AS (\r\n    SELECT buildings_gid, PC_Explode(pa) AS pts FROM patches\r\n  )\r\n  -- Use the building associations to efficiently\r\n  -- spatially test the points against the building footprints\r\n  -- Summarize per building\r\n  SELECT\r\n    buildings_gid,\r\n    -- Use a weighted average that heavily favors\r\n    -- multi-return pulses\r\n    Sum(CASE WHEN PC_Get(pts,'ReturnNumber') = 1\r\n         THEN PC_Get(pts, 'z')\r\n         WHEN PC_Get(pts,'ReturnNumber') = 2\r\n         THEN 10*PC_Get(pts, 'z')\r\n         ELSE 100*PC_Get(pts, 'z') END) \/\r\n    Sum(CASE WHEN PC_Get(pts,'ReturnNumber') = 1\r\n        THEN 1\r\n        WHEN PC_Get(pts,'ReturnNumber') = 2\r\n        THEN 10\r\n        ELSE 100 END) AS z\r\n  FROM pa_pts\r\n  JOIN buildings\r\n  ON buildings.gid = buildings_gid\r\n  WHERE ST_Intersects(buildings.geom, pts::geometry)\r\n  -- Only use the last returns in this calculation\r\n  AND PC_Get(pts,'ReturnNumber') = PC_Get(pts,'NumberOfReturns')\r\n  GROUP BY buildings_gid\r\n) AS elevs\r\n-- Join calculated elevations to original buildings table\r\nWHERE elevs.buildings_gid = gid;\r\n\r\n-- Update the building heights by subtracting elevation of\r\n-- the nearest street from the elevation of the building\r\nUPDATE buildings SET height = heights.height\r\nFROM (\r\n  WITH candidates AS (\r\n    SELECT\r\n      b.gid AS building_gid,\r\n      s.gid AS street_gid,\r\n      s.z AS streets_z,\r\n      b.z as buildings_z\r\n    FROM buildings b, streets s\r\n    WHERE ST_DWithin(b.geom, s.geom, 0.001)\r\n    ORDER BY\r\n      building_gid,\r\n      ST_Distance(b.geom, s.geom)\r\n  )\r\n  SELECT DISTINCT ON (building_gid)\r\n    building_gid, street_gid,\r\n    buildings_z - streets_z AS height\r\n  FROM candidates\r\n) AS heights\r\nWHERE heights.building_gid = buildings.gid;<\/pre>\n<p>Agora temos uma nova visualiza\u00e7\u00e3o para os edif\u00edcios em 3D. Voc\u00ea pode verificar que a torre est\u00e1 a metade do tamanho, e as edifica\u00e7\u00f5es foram reduzidas em muitos andares.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/ge_buildings_trees2.jpg\" alt=\"ge_buildings_trees2\" width=\"625\" height=\"380\" class=\"aligncenter size-full wp-image-6145\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/ge_buildings_trees2.jpg 625w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/ge_buildings_trees2-300x182.jpg 300w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2016\/07\/ge_buildings_trees2-600x365.jpg 600w\" sizes=\"auto, (max-width: 625px) 100vw, 625px\" \/><\/p>\n<p>Este tutorial \u00e9 uma tradu\u00e7\u00e3o e adapta\u00e7\u00e3o livre do artigo \u201cAnalyzing and Visualizing LIDAR\u201d publicado no site da Boundless.<\/p>\n<p>Fonte: <a href=\"http:\/\/workshops.boundlessgeo.com\/tutorial-lidar\/\" target=\"_blank\">Boundless<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Agora que temos dados de eleva\u00e7\u00e3o e altura em nossos edif\u00edcios podemos fazer um indicador ainda mais atraente visualmente. 1. Na guia &#8220;Dados&#8221;, clique no bot\u00e3o &#8220;Atualizar tipo de recurso&#8221;, para que GeoServer esteja ciente dos novos atributos z e&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2016\/07\/26\/analise-e-visualizacao-de-dados-lidar-parte-6\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":6137,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[280,268],"class_list":["post-6132","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gis","tag-kml","tag-lidar"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/6132","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=6132"}],"version-history":[{"count":14,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/6132\/revisions"}],"predecessor-version":[{"id":6202,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/6132\/revisions\/6202"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/6137"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=6132"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=6132"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=6132"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}