{"id":838,"date":"2019-03-21T23:36:07","date_gmt":"2019-03-22T04:36:07","guid":{"rendered":"http:\/\/sunapi386.ca\/wordpress\/?p=838"},"modified":"2019-03-21T23:36:14","modified_gmt":"2019-03-22T04:36:14","slug":"merge-ept-entwine-point-tile-maps","status":"publish","type":"post","link":"https:\/\/sunapi386.ca\/wordpress\/merge-ept-entwine-point-tile-maps\/","title":{"rendered":"Merge EPT Entwine Point Tile Maps"},"content":{"rendered":"\n<p><a href=\"https:\/\/entwine.io\/entwine-point-tile.html\">EPT format<\/a> is a storage method for point clouds, base on an octree structure. The encoding of the point cloud is up to the user, whether las\/laz, binary, or whatever custom format. So let&#8217;s say you store it in laz. What EPT does is to generate the octree to manage how those laz files are stored.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Merging EPT<\/h2>\n\n\n\n<p>Given two geographically separated point clouds, it is possible to merge them into the same EPT structure, given they use the same frame of reference. Because <a href=\"http:\/\/potree.org\">Potree<\/a> doesn&#8217;t handle latitude and longitude rendering (as they are angles and not euclidean), you have to use euclidean systems, such as UTM coordinates.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1110\" height=\"629\" src=\"https:\/\/i2.wp.com\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/03\/image-1-1.png?fit=625%2C354\" alt=\"\" class=\"wp-image-839\" srcset=\"https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/03\/image-1-1.png 1110w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/03\/image-1-1-300x170.png 300w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/03\/image-1-1-768x435.png 768w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/03\/image-1-1-1024x580.png 1024w, https:\/\/sunapi386.ca\/wordpress\/wp-content\/uploads\/2019\/03\/image-1-1-624x354.png 624w\" sizes=\"auto, (max-width: 1110px) 100vw, 1110px\" \/><figcaption>Merging two point clouds together<\/figcaption><\/figure>\n\n\n\n<p>You must first specify a large bounds for the initial build, and add more files later like this:<\/p>\n\n\n\n<p><code>entwine build -i ~\/data\/xyz -o ~\/entwine\/xyz -b \"[100, 100, 0, 400, 400, 200]\"<\/code><br><code>entwine build -i ~\/data\/abc -o ~\/entwine\/xyz<\/code><\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/connormanning\/entwine\/issues\/109\">See Entwine issue 109<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Caveats<\/h2>\n\n\n\n<p>A caveat is that when you&#8217;re generating the first frame, you need to custom input the bounding cube <code>bounds<\/code>, because by EPT design the octree cannot be rebalanced (without recomputing for all points). <\/p>\n\n\n\n<p>Another caveat is that UTM zone is not encoded in the laz file, using UTM cannot be extended over geographical regions. Thus we may have to store xyz points in lat\/lng\/alt format.<\/p>\n\n\n\n<p>Yet another caveat is the source ID for these points are going to collide. E.g. in file1.laz you have frames ID 0-100 and file2.laz you have frames ID 0-10, then the 0-10 IDs would collide. A workaround would be to assign global unique IDs.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>EPT format is a storage method for point clouds, base on an octree structure. The encoding of the point cloud is up to the user, whether las\/laz, binary, or whatever custom format. So let&#8217;s say you store it in laz. What EPT does is to generate the octree to manage how those laz files are &hellip; <a href=\"https:\/\/sunapi386.ca\/wordpress\/merge-ept-entwine-point-tile-maps\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Merge EPT Entwine Point Tile Maps<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34],"tags":[],"class_list":["post-838","post","type-post","status-publish","format-standard","hentry","category-thoughts"],"_links":{"self":[{"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/posts\/838","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/comments?post=838"}],"version-history":[{"count":1,"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/posts\/838\/revisions"}],"predecessor-version":[{"id":840,"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/posts\/838\/revisions\/840"}],"wp:attachment":[{"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/media?parent=838"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/categories?post=838"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sunapi386.ca\/wordpress\/wp-json\/wp\/v2\/tags?post=838"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}