[Gastosabertos] Organização dos dados geoespaciais
Luiz Armesto
luiz.armesto em gmail.com
Quarta Julho 15 06:05:09 UTC 2015
2015-07-14 23:15 GMT-03:00 Andres MRM <andres em inventati.org>:
>
> Criei a coluna extra para marcar o que já se tentou localizar, e os métodos
> que você falou para pegar pontos/regiões (mais ainda não testei esses
> últimos,
> provavelmente estão errados...) [0].
>
> Sobre esse SRID, erm... Como uso isso?
>
SRID é o identificador do sistema de referência que o PostGIS vai usar
internamente. É importante usar o mesmo sistema nas diversas colunas e
saber em qual sistema estão os dados que serão importados e fazer a
conversão se necessário.
>
> Há um tempo atrás tínhamos conversado sobre como mandar os pontos para
> serem
> colocados no mapa, de forma a não ser um pacote de dados muito grande.
> Esse endpoint "minlist" [1] busca fazer isso mandando todos os pontos
> mapeados
> de um ano. Porém, apenas a lat, lon e o UID deles. Assim é o mínimo para o
> mapa conseguir desenhar todos eles e poder pedir mais informações quando
> clicados. Aparentemente funciona, mas é um bom jeito de fazer mesmo?
> (Sei que você tinha dito para dar preferência ao GeoJSON, mas nesse caso
> achei
> melhor otimizar e mandar as lat,log direto... Ou será que deveria montar um
> GeoJSON com todos os pontos dentro antes de enviar?)
>
A vantagem de mandar GeoJSON é que é um formato já estabelecido e que tanto
o PostGIS quanto o leaflet possuem suporte.
O grande problema na versão anterior era que era mandada praticamente a
base de dados inteira de uma vez só. Para minimizar o tamanho da
transferência inicial de dados e, assim, tornar o carregamento mais rápido
tem duas coisas a se tomar cuidado. Uma é transferir apenas o conjunto de
dados necessários e a outra é, para cada dado, transmitir apenas os campos
necessários.
Do modo que você fez você está cumprindo o segundo ponto, transmitindo só
os campos necessários, e ainda está economizando bytes mandando apenas o
estritamente necessário. Mas em contrapartida está adicionando a
complexidade de usar um formato próprio e não algo padronizado que já
possui suporte na biblioteca javascript usada no cliente.
O GeoJSON é mesmo mais verborrágico do que o modo que você fez, mas a
estrutura a mais que ele utiliza é repetida várias e várias vezes na lista
de dados, o que o torna um ótimo candidato a compactação. Então antes de
querer otimizar na mão, por que não tentamos fazer a API aceitar o
cabeçalho "Accept-Encoding: gzip" e mandar o conteúdo campactado?
Veja uma simulação que fiz no console do python:
Criei uma lista de 100 "pontos" aleatórios como uma lista de tuplas de 3
elementos, o primeiro é uma string uuid, o segundo e o terceiro são floats
com poucas casas decimais
[(u'2afb3d8d-4ac1-41f9-9eb1-8dffde3335e8', 75.375, 54.0), ...]
Criei então uma lista de dicionários no formato do GeoJSON com os mesmos
valores
[{'geometry': {'coordinates': [75.375, 54.0], 'type': 'Point'},
'properties': {'uid': u'2afb3d8d-4ac1-41f9-9eb1-8dffde3335e8'},
'type': 'Feature'}, ...]
bem mais verboso, certo?
Transformei cada uma das duas coleções em json e vi o tamanho de cada uma,
lembrando que ambas representam os mesmo 100 "pontos" só com formatação
diferente.
lista simples: 5882
geojson: 14882
O geojson ficou com 2.53 vezes o tamanho do formato simples. Diferença
significativa. Mas agora vamos compactar os dois com zlib e avaliar
novamente a diferença
lista simples compactada: 3020
geojson compactado: 3282
Agora o geojson ficou com 1.09 vezes o tamanho do formato simples. Uma
diferença desprezível para uma vantagem enorme de se usar um formato
estabelecido ;)
>
> [0]:
> https://github.com/andresmrm/gastos_abertos/blob/master/gastosabertos/execucao/models.py
> [1]:
> https://github.com/andresmrm/gastos_abertos/blob/master/gastosabertos/execucao/views.py#L46-L59
>
>
>
> Quoting Luiz Armesto (2015-07-14 13:05:25)
> > Se são poucas regiões e poucos pontos, então a principio acho que
> podemos usar
> > queries espaciais mesmo.
> >
> > Então eu faria assim:
> >
> > Primeiro criaria um método ou uma property no model de região que
> devolveria o
> > resultado da query dos pontos que estão naquela região.
> > Faria o mesmo no model de ponto para retornar a região. (devolva o
> resultado da
> > query e não diretamente os pontos/regiões, para que seja possível fazer
> novas
> > filtragens a partir do resultado devolvido)
> >
> > Sempre que precisar dos pontos de uma região ou das regiões de um ponto
> eu
> > usaria esses métodos. Desse modo se mais pra frente tiver outras
> necessidades,
> > ou percebermos problema de performance, e a modelagem for alterada, é só
> mudar
> > a implementação desses dois métodos.
> >
> >
> > PS.: Não esquece de definir explicitamente o srid das colunas
> geometricas.
> >
> > 2015-07-14 12:40 GMT-03:00 Andres MRM <andres em inventati.org>:
> >
> >
> > Entendo. A ideia que tenho é usar as subprefeituras como regiões
> fixas. E
> > colocar em que subprefeitura cada despesa está.
> > Ou seja, seriam 32 (?) regiões e ~10K pontos distribuídos nelas.
> > Mas isso é para dar as funcionalidades básicas que comentei
> anteriormente,
> > não
> > sei se vamos além disso...
> >
> >
> > Quoting Luiz Armesto (2015-07-14 12:04:17)
> > > As regiões são fixas ou com o tempo serão incluidas regiões novas?
> São
> > apenas
> > > as regiões oficiais ou terá regiões personalizadas? A relação
> seria de
> > uma
> > > região para muitos pontos ou de muitas regiões para muitos pontos?
> > >
> > > Tem que avaliar e decidir a modelagem. Se a relação entre ponto e
> região
> > será
> > > armazenada no banco de dados ou será obtida por query espacial.
> Para
> > decidir
> > > isso melhor seria bom ter uma ideia da quantidade de pontos que
> serão
> > > armazenados, quantidade de regiões, casos de uso e restrições,
> para saber
> > qual
> > > opção é melhor.
> > >
> > > Se teremos muitos pontos e as regiões são fixas, então armazenar a
> > relação é
> > > uma boa pois é mais barato fazer uma query por relação do que uma
> query
> > > espacial, principalmente quando temos muitos pontos.
> > >
> > > Se não tiver tantos pontos, a query espacial não é tão custosa e
> > armazenar a
> > > relação pode ser desnecessário.
> > >
> > > Se as regiões não são fixas, caso seja salva a relação com pontos
> teremos
> > que
> > > cada vez que uma região for adicionada/editada/removida atualizar
> as
> > relações
> > > com os pontos. Se for usada query espacial, então não tem problema
> ter
> > > alterações nas regiões, sempre pegaremos as relações corretas.
> > >
> > > 2015-07-14 11:41 GMT-03:00 Andres MRM <andres em inventati.org>:
> > >
> > >
> > > Quoting Luiz Armesto (2015-07-14 11:30:49)
> > > > Cria uma outra coluna e salva nela o status do
> processamento. Não é
> > uma
> > > boa
> > > > usar o valor da coluna "point" para inferir algo que seria
> melhor
> > > armazenado
> > > > explicitamente.
> > >
> > > Ok.
> > >
> > > > Como estamos usando um banco relacional, o melhor é criar uma
> > tabela de
> > > regiões
> > > > e relacionar execucao com regiao.
> > > >
> > > > Qual é o uso de armazenar em qual regiao esta uma execucao?
> > agilizar
> > > alguma
> > > > filtragem ou busca sem precisar fazer query espacial?
> > >
> > > Erm... Não sei bem. Imagino que em alguns momentos vamos querer
> > mostrar em
> > > que
> > > região está uma despesa.
> > > Por exemplo, quando clicar em um ponto e mostrar todas as
> informações
> > dele,
> > > a
> > > região deve estar lá. Ou então quando quisermos mostrar, em um
> mapa,
> > o
> > > total
> > > gasto em cada região.
> > > Como essas informações seriam obtidas?
> > > _______________________________________________
> > > Gastosabertos mailing list
> > > Gastosabertos em lists.okfn.org
> > > https://lists.okfn.org/mailman/listinfo/gastosabertos
> > >
> > >
> > >
> > >
> > > --
> > > Luiz Armesto
> > _______________________________________________
> > Gastosabertos mailing list
> > Gastosabertos em lists.okfn.org
> > https://lists.okfn.org/mailman/listinfo/gastosabertos
> >
> >
> >
> >
> > --
> > Luiz Armesto
> _______________________________________________
> Gastosabertos mailing list
> Gastosabertos em lists.okfn.org
> https://lists.okfn.org/mailman/listinfo/gastosabertos
>
--
Luiz Armesto
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://lists.okfn.org/pipermail/gastosabertos/attachments/20150715/c3d667e7/attachment-0003.html>
Mais detalhes sobre a lista de discussão Gastosabertos