Eu tenho um grande conjunto de dados em um banco de dados PostGIS. Estou visualizando-o através de uma interface da web que carrega os dados como GeoJSON. Há muitos dados para fornecer ao cliente de uma só vez (10s de MBs no valor ...), então eu gostaria de obter uma área de dados dentro da caixa delimitadora formada pelas bordas da janela (a linha pontilhada na imagem abaixo ) Obter as coordenadas para os pontos f e g é fácil.
Pergunta 1: Essa é uma boa maneira de fazer as coisas? Devo pensar em colocá-los em cache como blocos ou esse método provavelmente será eficiente o suficiente?
Pergunta 2: Como recupero apenas os dados nessa caixa delimitadora?
Pergunta 3: Se uma forma se sobrepõe à borda da caixa delimitadora (por exemplo, forma A abaixo), existe uma maneira simples de cortá-la, como é consultada, como na segunda imagem?
Respostas:
basta alterar a ordem das perguntas e você tem um procedimento:
2) Selecione apenas o que cruza a bbox (
ST_Intersects
).3) Interseccione-o com a bbox para cortar os polígonos (
ST_Intersection
).1) Crie uma nova tabela com os resultados (
CREATE TABLE newtable AS SELECT...
).Os documentos ST_Intersection contêm um exemplo de código. Você precisará adaptá-lo e usar ST_PolygonFromText como bbox.
fonte
Eu acho que a maioria (todos) os clientes da web (e os gis de desktop também) estão fazendo isso. Você não pode enviar o conjunto de dados inteiro.
Se você deve configurar algum tipo de armazenamento em cache, depende se seus dados variam de forma estática ou se estão sendo alterados.
Para marcar esta caixa delimitadora, os dados serão muito rápidos (se você tiver um índice espacial), mas é claro que não é de graça. Você pagará com algum poder de CPU.
Como dito anteriormente: Para encontrar os polígonos dentro da sua extensão, você usa ST_Intersects.
Para obter apenas a parte dentro da sua extensão, use ST_Intersection, mas não faça isso. ST_Intersection é um processo caro. A menos que você tenha polígonos extremamente grandes, acho melhor enviar os polígonos inteiros.
Mas acho que você quer fazer isso rapidamente, em vez de colocá-lo em uma mesa
fonte