{"id":8732,"date":"2020-04-07T07:30:04","date_gmt":"2020-04-07T10:30:04","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/?p=8732"},"modified":"2020-03-25T16:36:49","modified_gmt":"2020-03-25T19:36:49","slug":"postgis-3-funcao-st_tileenvelope","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2020\/04\/07\/postgis-3-funcao-st_tileenvelope\/","title":{"rendered":"PostGIS 3: Fun\u00e7\u00e3o ST_TileEnvelope"},"content":{"rendered":"<p>Com a disponibiliza\u00e7\u00e3o do <a href=\"https:\/\/docs.mapbox.com\/vector-tiles\/specification\/\" rel=\"noopener noreferrer\" target=\"_blank\">formato MVT<\/a> no PostGIS via <a href=\"https:\/\/postgis.net\/docs\/ST_AsMVT.html\" rel=\"noopener noreferrer\" target=\"_blank\">fun\u00e7\u00e3o ST_AsMVT()<\/a>, mais e mais pessoas est\u00e3o gerando seus tiles diretamente do banco de dados. Isso geralmente envolve algumas etapas comuns:<\/p>\n<ul>\n<li>Expor os tiles a partir de uma <a href=\"https:\/\/en.wikipedia.org\/wiki\/Tiled_web_map\" rel=\"noopener noreferrer\" target=\"_blank\">API web<\/a> sobre o HTTP<\/li>\n<li>Convers\u00e3o de coordenadas dos tiles para impulsionar a gera\u00e7\u00e3o do tile<\/li>\n<\/ul>\n<p>As coordenadas do tile consistem em tr\u00eas valores:<\/p>\n<ul>\n<li>zoom , o n\u00edvel da &#8220;pir\u00e2mide&#8221; de tiles<\/li>\n<li>x , a coordenada do tile nesse zoom, contando a partir da esquerda, come\u00e7ando em zero<\/li>\n<li>y , a coordenada do tile nesse zoom, contando a partir do topo, come\u00e7ando em zero<\/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\/tileIsValid.png\" alt=\"\" width=\"537\" height=\"318\" class=\"aligncenter size-full wp-image-8733\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/tileIsValid.png 537w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/tileIsValid-300x178.png 300w\" sizes=\"auto, (max-width: 537px) 100vw, 537px\" \/><br \/>\n<\/center><\/p>\n<p>A maioria das coordenadas de refer\u00eancia dos tiles s\u00e3o constru\u00eddas na proje\u00e7\u00e3o \u201c<a href=\"http:\/\/epsg.io\/3857\" rel=\"noopener noreferrer\" target=\"_blank\">spherical mercator<\/a>\u201d, que \u00e9 uma proje\u00e7\u00e3o plana que cobre a maior parte do planeta, embora com<a href=\"https:\/\/en.wikipedia.org\/wiki\/Mercator_projection#Distortion_of_sizes\" rel=\"noopener noreferrer\" target=\"_blank\"> distor\u00e7\u00f5es substanciais de dist\u00e2ncia<\/a> quanto mais ao norte voc\u00ea for.<\/p>\n<p>Conhecendo o n\u00edvel de zoom e as coordenadas do tile, a matem\u00e1tica para encontrar os limites da proje\u00e7\u00e3o mercator \u00e9 bastante direta. Veja:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/tileToEnv.png\" alt=\"\" width=\"539\" height=\"349\" class=\"aligncenter size-full wp-image-8734\" srcset=\"https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/tileToEnv.png 539w, https:\/\/www.fernandoquadro.com.br\/html\/wp-content\/uploads\/2020\/03\/tileToEnv-300x194.png 300w\" sizes=\"auto, (max-width: 539px) 100vw, 539px\" \/><br \/>\n<\/center><\/p>\n<p>A maioria das pessoas que geram tiles a partir do banco de dados escreve seu pr\u00f3prio &#8220;wrapper&#8221; para convers\u00e3o da coordenada do tile em mercator.<\/p>\n<p>Parece complicado fazer isso, por isso foi adicionado a fun\u00e7\u00e3o <a href=\"https:\/\/postgis.net\/docs\/manual-dev\/ST_TileEnvelope.html\" rel=\"noopener noreferrer\" target=\"_blank\">ST_TileEnvelope() <\/a>ao PostGIS. Por padr\u00e3o, a fun\u00e7\u00e3o ST_TileEnvelope obt\u00e9m o zoom, as coordenadas x e y e gera os limites na proje\u00e7\u00e3o Spherical Mercator.<\/p>\n<pre>\r\nSELECT ST_AsText(ST_TileEnvelope(3, 4, 2));\r\n\r\n\r\n                    st_astext                                       \r\n----------------------------------------------------\r\n POLYGON((0 5009377.5,0 10018755,5009377.5 10018755,\r\n          5009377.5 5009377.5,0 5009377.5))\r\n<\/pre>\n<p>Se voc\u00ea precisar gerar tiles em outro sistema de coordenadas &#8211; um caso de uso raro, mas n\u00e3o imposs\u00edvel -, voc\u00ea poder\u00e1 trocar o sistema de refer\u00eancia espacial e definir limites diferentes do conjunto de tiles por meio do par\u00e2metro bounds, que pode codificar os limites do plano e o sistema de refer\u00eancia espacial em uma geometria:<\/p>\n<pre>\r\nSELECT ST_AsText(ST_TileEnvelope(\r\n    3, 4, 2, \r\n    bounds => ST_MakeEnvelope(0, 0, 1000000, 1000000, 3005)\r\n    ));\r\n<\/pre>\n<p>Observe que as mesmas coordenadas do tile geram limites diferentes &#8211; porque os limites do tile no n\u00edvel base s\u00e3o diferentes.<\/p>\n<pre>\r\n                      st_astext                                     \r\n--------------------------------------------------------\r\n POLYGON((500000 625000,500000 750000,625000 750000,\r\n          625000 625000,500000 625000))\r\n<\/pre>\n<p>A fun\u00e7\u00e3o ST_TileEnvelope tamb\u00e9m pode gerar tiles n\u00e3o quadrados, basta voc\u00ea fornecer limites n\u00e3o quadrados.<\/p>\n<p>Fonte: <a href=\"http:\/\/blog.cleverelephant.ca\/2019\/08\/postgis-3-tile.html\" rel=\"noopener noreferrer\" target=\"_blank\">Clever Elephant Blog<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Com a disponibiliza\u00e7\u00e3o do formato MVT no PostGIS via fun\u00e7\u00e3o ST_AsMVT(), mais e mais pessoas est\u00e3o gerando seus tiles diretamente do banco de dados. Isso geralmente envolve algumas etapas comuns: Expor os tiles a partir de uma API web sobre&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2020\/04\/07\/postgis-3-funcao-st_tileenvelope\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":8738,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[212],"class_list":["post-8732","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\/8732","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=8732"}],"version-history":[{"count":3,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8732\/revisions"}],"predecessor-version":[{"id":8739,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/8732\/revisions\/8739"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media\/8738"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=8732"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=8732"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=8732"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}