Mais

Quando devo usar o ST_Buffer?


Gostaria de saber qual é o sentido de usar a operação st_buffer. No guia de referência PostGIS existe apenas a sintaxe e uma breve descrição desta operação.

Você poderia dar alguns exemplos para entender as vantagens dessa operação?


Como @Underdark comenta, ST_Dwithin é a forma recomendada de encontrar geometrias à distância. Em muitos outros sistemas gis, o método de buffer é a única maneira, mas construir buffers é bastante caro.

Mas há outros casos de uso em que você precisa fazer o buffer. Um dos motivos pode ser visualizar um buffer. Se você, por exemplo, quiser mostrar a área mais próxima a 100 metros de uma rodovia, pode fazer um buffer.

Outro caso é se você quiser que a área a 100 metros da rodovia seja cortada de outro mapa. Digamos que você tenha um mapa mostrando o uso da área e queira analisar quanto da área mais próxima a 100 metros da rodovia é floresta e quanto é área agrícola. Então você faz um buffer e cria uma interseção com o mapa de uso da área.

Há um exemplo na página 8-10 neste tutorial:
http://postgisonline.org/map.php?tutorial=mixed_examples.html


OpenGeo fornece um bom resumo do ST_Buffer. Observe a capacidade de passar um raio de buffer negativo.

A função buffer também é uma solução útil às vezes. Ao passar um raio de buffer de zero, você pode construir uma pegada de uma coleção de geometrias ou "reparar" uma geometria de polígono inválida.


ummm fazer um buffer? Isso é tudo o que realmente faz.

Eu realmente não chamaria isso de uma breve descrição http://www.postgis.org/documentation/manual-svn/ST_Buffer.html

Um caso de uso é se você deseja selecionar todos os objetos em uma tabela que estão a 20m de cada objeto em outra tabela.


Isso não é algo que você, como usuário, possa implementar. Este erro informa que o próprio MySQL não implementou a função ST_Buffer para o caso de SRS geográfico.

O problema é que existem dois tipos de SRS - projetado (mapa planar, também chamado de cartesiano) e geográfico (no elipsóide). Em outros sistemas, eles são geralmente representados por tipos separados, geometria (planar) e geografia (elipsóide). No MySQL, é um tipo com SRS projetado ou elipsóide.

Alguns algoritmos no elipsóide são mais complexos, portanto, algumas funcionalidades do MySQL espacial ainda não foram implementadas para esse caso.

1) mude para o SRS projetado apropriado, se possível,

2) mudar para outra plataforma, por exemplo PostgreSQL + PostGIS que suporta ST_Buffer para tipo de geografia,

3) evite ST_Buffer (muitas vezes é mal utilizado para verificar interseção de buffer quando ST_DWithin deve ser usado, embora eu não saiba seu caso de uso específico)


Templo PSM em GIS

Existem cerca de 550 escolas e um total de 55 bibliotecas públicas na Filadélfia. De todas as grandes e pequenas cidades dos Estados Unidos, a Filadélfia tem uma das maiores taxas de criminalidade (44 por mil). Este projeto tenta determinar o risco para os alunos quando eles desejam ir à biblioteca pública mais próxima. Também determina quantas escolas estão em uma milha de cada biblioteca, o que mostrará como as bibliotecas estão distribuídas de forma desigual na área da cidade ou as bibliotecas públicas não consideraram o número de escolas ao redor quando foram estabelecidas. Isso também mostra onde estão as escolas e a biblioteca e quantos crimes aconteceram ao redor de cada escola e biblioteca. Então, isso vai prever a possibilidade de se tornar uma vítima com os crimes do bairro. Para fazer isso, usei o PostgreSQL, que é mais fácil de calcular e medir o risco no caminho de uma escola para uma biblioteca mais próxima.

Usei três fontes de dados importantes, como dados escolares como .csv, dados de biblioteca como um arquivo de forma e os dados de crimes que mostram todos os crimes relatados que aconteceram na Filadélfia de 2007 a 2014. Todos esses dados são adquiridos do OpenDataPhilly, que é um dado aberto fonte. Após o download de todos os dados necessários, realizou-se uma normalização dos dados para reduzir a redundância dos dados. Para usar esses dados com o PostgreSQL, é necessário fazer o upload no servidor SQL (para o arquivo de forma use o comando shp2pgsql e para o arquivo .csv use o console SQL simples). O mapa abaixo mostra a localização de escolas e bibliotecas, incidências de crimes a cerca de uma milha de cada escola e o número de escolas a menos de uma milha de cada biblioteca pública.

Depois de aplicar algumas pedreiras, descobri que há muitas escolas onde mais de 2.000 crimes aconteceram e há três escolas onde mais de 5.000 crimes aconteceram em um raio de 1.000 pés, e há 5 bibliotecas onde mais de 2.000 crimes aconteceram nesses 7 anos. As bibliotecas estão distribuídas de forma desigual pela cidade, dependendo do número de escolas. Existem algumas bibliotecas em que há apenas uma escola, e há duas bibliotecas onde mais de 20 escolas em um raio de uma milha. Até mesmo existem algumas escolas que estão a mais de uma milha e meia de distância das bibliotecas mais próximas. A figura abaixo mostra as linhas entre as escolas e as bibliotecas mais próximas com 30 metros de proteção ao redor das linhas.


CRIAR TABELA phl.shortest_distance_buffer AS
SELECT e.from_school, e.close_library, ST_Buffer (geom, 100) :: geometry (Polygon, 2272) AS geom
A PARTIR DE (
SELECT d.school como from_school,
d.library como close_library,
ST_MakeLine (d.geom1, d.geom2) como geom
A PARTIR DE(
SELECIONE
escola s.facil_name AS,
s.geom AS geom1,
Biblioteca A.branch_nam AS,
A.geom AS geom2,
ST_Distance (s.geom, A.geom) como distância
A PARTIR DE
phl.all_philly_school as s
CROSS JOIN LATERAL
(
SELECT l.branch_nam, l.geom
FROM phl.philly_libraries como l
ORDENAR POR l.geom s.geom
LIMITE 1
) AS A) as d) as e


SELECT a.from_school, a.close_library, count (b.objectid)
FROM phl.shortest_distance_buffer como um
JOIN phl.philly_crime_incident_coded as b
ON ST_Contains (a.geom, b.geom)
GROUP BY a.from_school, a.close_library
Contagem ORDER BY (b.objectid)

As consultas acima, eu costumo fazer uma linha reta entre cada escola até as bibliotecas mais próximas e fazer um buffer de 30 metros ao redor de cada linha. A parte inferior da consulta conta crimes em cada buffer. A intenção de fazer isso é determinar o número de crimes que acontecem em cada linha de amortecimento e descobrir a possibilidade de ser vítima se um aluno quiser ir da escola à biblioteca mais próxima. O resultado desta consulta mostra que há 14 linhas de distância de escolas e bibliotecas onde mais de 650 crimes acontecem de 2007 a 2014. Portanto, é mais provável que se torne uma vítima com os crimes de bairro do que outras 531 linhas de distância de escolas a bibliotecas . Como alternativa, existem 12 distâncias de linha entre escolas e bibliotecas mais próximas, onde menos de 10 crimes ocorreram de 2007 a 2014.

Existem algumas limitações no projeto, como as linhas retas criadas entre as escolas e as bibliotecas mais próximas não são o caminho para se chegar a uma biblioteca, portanto, os cálculos do crime não são corretos apenas uma suposição. Além disso, na hora do cálculo do crime não me preocupei com a hora do crime, e o aluno & # 8217s pretendendo hora de ir à biblioteca. É importante considerar a hora do crime e o tempo previsto para um aluno ir à biblioteca para fazer uma estimativa racional dos crimes (incluindo o tipo de crime) que acontecem nas áreas de amortecimento. Dependendo das limitações, pesquisas adicionais podem ser feitas nas quais o pesquisador pode usar o PG Routing para obter as rotas exatas com distância entre uma escola e uma biblioteca mais próxima e conectar esse resultado com os crimes considerando o tempo e o tipo de crimes a serem cometidos um relatório potencial para ver as possibilidades de se tornar uma vítima de um crime de bairro quando um aluno pretendia ir a uma biblioteca. A pesquisa também pode encontrar as rotas alternativas e horário do dia onde e quando (forma e horário mais seguros) tem muito menos possibilidades de se tornar vítima do crime de bairro.


1 resposta 1

Manter a latitude longa assim não é espacial. Você precisa fazer um ponto

Eu armazenaria o resultado acima na linha, em vez de cabos de latitude / longitude individuais. Independentemente do que você armazena na linha, é com isso que você precisa trabalhar. Não armazenar isso na linha será apenas mais lento, pois você terá que calcular todas as vezes.

Em seguida, o que você quer é o teste de caixa delimitadora. No MySQL, eles são designados com um prefixo MBR.

Você terá que calcular DISTANCE_IN_DEGREES sozinho. O MySQL não tem um tipo de geografia, então você não pode apenas usar uma distância fixa como metros, milhas ou pés. Você tem que fazer as contas sozinho. Isso é muito trabalho por si só.

ST_Contains não usa um índice. Para isso, você precisará do MBRContains. Ou você pode simplesmente usar o PostgreSQL, para que fique assim,

Não só é mais curto, mas dos documentos

Essa chamada de função incluirá automaticamente uma comparação de caixa delimitadora que fará uso de todos os índices disponíveis nas geometrias.

Portanto, você não precisa usar duas funções como faria em MySQL MBRcontains (caixa delimitadora com índice) e ST_Contains.


As configurações semelhantes também são necessárias para o melhor desempenho das unidades LTO-6?

Você está tendo um desempenho ruim ou a velocidade não é a esperada? Se não, apenas siga os padrões. Caso contrário, pergunte ao fornecedor ou forneça mais detalhes sobre sua unidade LTO-6.

De onde conhecemos os valores?

Bem, o melhor seria perguntar ao seu fornecedor de hardware ou verificar o site do fabricante e o manual da sua unidade. Por último, você pode simplesmente errar, se tiver um desempenho ruim.

Quais são as configurações padrão, se nenhum valor for passado?

Consulte dmesg e use modinfo st para revelar os valores e padrões possíveis. Você também pode olhar em / sys / module / st / parameters / * para ver as configurações atuais. Pode ser que isso não esteja disponível.


16.1.5. Olhando para as funções PostGIS instaladas¶

O PostGIS pode ser considerado uma coleção de funções no banco de dados que estendem os recursos básicos do PostgreSQL para que ele possa lidar com dados espaciais. Por & # 8216deal com & # 8217, queremos dizer armazenar, recuperar, consultar e manipular. Para fazer isso, várias funções são instaladas no banco de dados.

Nosso PostgreSQL Morada banco de dados agora está habilitado geoespacialmente, graças ao PostGIS. Vamos nos aprofundar nisso nas próximas seções, mas vamos dar uma pequena amostra rápida. Digamos que queremos criar um ponto a partir do texto. Primeiro, usamos o comando psql para encontrar funções relacionadas ao ponto. Se você ainda não estiver conectado ao Morada banco de dados, faça isso agora. Então corra:

Este é o comando que estamos procurando: st_pointfromtext . Para percorrer a lista, use a seta para baixo e pressione q para sair do shell do psql.

  • Definimos um ponto na posição 1,1 (EPSG: 4326 é assumido) usando PONTO (1 1) ,
  • Executamos uma instrução sql, mas não em qualquer tabela, apenas nos dados inseridos no prompt SQL,
  • A linha resultante não faz muito sentido.

A linha resultante está no formato OGC denominado & # 8216Binário conhecido & # 8217 (WKB). Veremos esse formato em detalhes na próxima seção.

Para obter os resultados de volta como texto, podemos fazer uma varredura rápida na lista de funções em busca de algo que retorne texto:

A consulta que estamos procurando agora é st_astext . Vamos combiná-lo com a consulta anterior:

Aqui, inserimos a string PONTO (1,1) , transformou-o em um ponto usando st_pointfromtext () , e o transformou em uma forma legível por humanos com st_astext () , que nos deu de volta nossa string original.

Um último exemplo antes de realmente entrarmos nos detalhes do uso do PostGIS:

O que isso fez? Ele criou um buffer de 1 grau em torno de nosso ponto e retornou o resultado como texto.


Jtdcftul

É possível selecionar todas as colunas, exceto geometria usando camadas virtuais no QGIS?

Por exemplo, tenho esta consulta (simplificada):

Não funciona. Ele não armazena em buffer. Mas usar a consulta (simplificada) da seguinte maneira armazena todos os polígonos conforme pretendido:

Agora, o problema é que, se eu tiver polígonos com muitas colunas, preciso que eles digitem tudo manualmente. Há alguma maneira de evitar isto?

É possível selecionar todas as colunas, exceto geometria usando camadas virtuais no QGIS?

Por exemplo, tenho esta consulta (simplificada):

Não funciona. Ele não armazena em buffer. Mas, usando a consulta (simplificada) da seguinte maneira, todos os polígonos são armazenados em buffer conforme o pretendido:

Agora, o problema é que, se eu tiver polígonos com muitas colunas, preciso que eles digitem tudo manualmente. Há alguma maneira de evitar isto?

É possível selecionar todas as colunas, exceto geometria usando camadas virtuais no QGIS?

Por exemplo, tenho esta consulta (simplificada):

Não funciona. Ele não armazena em buffer. Mas, usando a consulta (simplificada) da seguinte maneira, todos os polígonos são armazenados em buffer conforme o pretendido:

Agora, o problema é que, se eu tiver polígonos com muitas colunas, preciso que eles digitem tudo manualmente. Há alguma maneira de evitar isto?

É possível selecionar todas as colunas, exceto geometria usando camadas virtuais no QGIS?

Por exemplo, tenho esta consulta (simplificada):

Não funciona. Ele não armazena em buffer. Mas, usando a consulta (simplificada) da seguinte maneira, todos os polígonos são armazenados em buffer conforme o pretendido:

Agora, o problema é que, se eu tiver polígonos com muitas colunas, preciso que eles digitem tudo manualmente. Há alguma maneira de evitar isto?


ReconciliarGeografias ()

Depois de determinar que tipo de tolerância devemos passar para a função, agora é hora de realmente executar a função nos dois objetos espaciais.

O resultado da função é um quadro de dados onde cada linha descreve um relacionamento entre um par de geografias dos dois conjuntos de dados.

unigeokey_A unigeokey_B modelo
004037 004037 mesmo
006076 006076 mesmo
001065 001065 mesmo
004203 004203 mesmo
002111 002170 AintersectsB
002052 002052 mesmo
001210 001210 mesmo
002093 002093 mesmo
004167 004167 AintersectsB
003082 003082 mesmo

O recogeo pacote contém duas funções para verificar os resultados de reconcileGeographies (). A primeira função, reportReconciledGeographies (), produz um relatório para inspecionar visualmente cada relacionamento. Assim, por exemplo, a relação “piedmont_1991.sf [piedmont_1991.sf $ PRO_COM_T == '002110',] contém piedmont_2018.sf [piedmont_2018.sf $ PRO_COM_T == '002110',]” será relatado assim

Neste caso, parece claro que o ano de 1991 comuna perdeu parte de seu território para outro comuna ou resultando em um novo comuna sendo criado.

Em vez disso, a função testReconciledGeographies () testa as características espaciais de geografias reconciliadas. Leva o quadro de dados resultante da função reconciliarGeographies () e dos objetos espaciais.

Este teste é particularmente importante para determinar se os resultados são satisfatórios, pois comparar a soma das áreas das antigas geografias dos dois objetos espaciais que correspondem às novas geografias reconciliadas.

.unigeokey_new n / D area_A n_B area_B area_diff_perc
342 1 24630596 1 24885944 -1.0367
596 1 14390068 1 14350670 0.2738
654 1 9457429 1 8967809 5.1771
53 1 96442686 1 96231784 0.2187
407 1 10546479 1 11068439 -4.9491
1062 1 8090767 1 8011784 0.9762
65 1 121231584 1 121912963 -0.5620
727 1 3933001 1 3903543 0.7490
99 1 24623624 1 24945108 -1.3056
608 1 14291803 1 14386575 -0.6631

As colunas n_A e n_B indicam quantas geografias precisam ser agregadas para criar uma nova geografia reconciliada. A coluna area_diff_perc indica a diferença percentual entre as duas novas geografias reconciliadas resultantes da união das geografias dos dois objetos espaciais originais. Intuitivamente, novas geografias reconciliadas podem ser produzidas pela união de geografias de qualquer um dos dois objetos espaciais originais.


ReconciliarGeografias ()

Depois de determinar que tipo de tolerância devemos passar para a função, agora é hora de realmente executar a função nos dois objetos espaciais.

Os resultados da função são um quadro de dados onde cada linha descreve um relacionamento entre um par de geografias dos dois conjuntos de dados.

unigeokey_A unigeokey_B modelo
004037 004037 mesmo
006076 006076 mesmo
001065 001065 mesmo
004203 004203 mesmo
002111 002170 AintersectsB
002052 002052 mesmo
001210 001210 mesmo
002093 002093 mesmo
004167 004167 AintersectsB
003082 003082 mesmo

O recogeo pacote contém duas funções para verificar os resultados de reconcileGeographies (). A primeira função, reportReconciledGeographies (), produz um relatório para inspecionar visualmente cada relacionamento. Assim, por exemplo, a relação “piedmont_1991.sf [piedmont_1991.sf $ PRO_COM_T == '002110',] contém piedmont_2018.sf [piedmont_2018.sf $ PRO_COM_T == '002110',]” será relatado assim

Neste caso, parece claro que o ano de 1991 comuna perdeu parte de seu território para outro comuna ou resultando em um novo comuna sendo criado.

Em vez disso, a função testReconciledGeographies () testa as características espaciais de geografias reconciliadas. Leva o quadro de dados resultante da função reconciliarGeographies () e dos objetos espaciais.

Este teste é particularmente importante para determinar se os resultados são satisfatórios porque comparar a soma das áreas das antigas geografias dos dois objetos espaciais que correspondem às novas geografias reconciliadas.

.unigeokey_new n / D area_A n_B area_B area_diff_perc
342 1 24630596 1 24885944 -1.0367
596 1 14390068 1 14350670 0.2738
654 1 9457429 1 8967809 5.1771
53 1 96442686 1 96231784 0.2187
407 1 10546479 1 11068439 -4.9491
1062 1 8090767 1 8011784 0.9762
65 1 121231584 1 121912963 -0.5620
727 1 3933001 1 3903543 0.7490
99 1 24623624 1 24945108 -1.3056
608 1 14291803 1 14386575 -0.6631

As colunas n_A e n_B indicam quantas geografias precisam ser agregadas para criar uma nova geografia reconciliada. A coluna area_diff_perc indica a diferença percentual entre as duas novas geografias reconciliadas resultantes da união das geografias dos dois objetos espaciais originais. Intuitivamente, novas geografias reconciliadas podem ser produzidas pela união de geografias de qualquer um dos dois objetos espaciais originais.


Quando devo usar o ST_Buffer? - Sistemas de Informação Geográfica

[Devido às limitações de tamanho, o anúncio é dividido em 3. Esta é a parte 1.]

MySQL Server 8.0.4-rc (Release Candidate) é uma nova versão do mundo & # 039s
banco de dados de código aberto mais popular. Este é o segundo lançamento
candidato do MySQL 8.0.

Tal como acontece com qualquer outra versão de pré-produção, deve-se tomar cuidado ao
instalação em sistemas de nível de produção ou sistemas com dados críticos.

Observe que 8.0.4-rc inclui todos os recursos do MySQL 5.7.

Para obter informações sobre a instalação do MySQL 8.0.4-rc em novos servidores, consulte
a documentação de instalação do MySQL em

O MySQL Server 8.0.4-rc está disponível na forma de código-fonte e binário para vários
plataformas da seleção & quotDevelopment Releases & quot de nosso download
páginas em

MySQL Server 8.0.4-rc também está disponível em nosso repositório para Linux
plataformas, acesse aqui para obter detalhes:

Agradecemos seus comentários, relatórios de bugs, correções de bugs,
patches, etc .:

O seguinte link lista as mudanças no MySQL 8.0 desde
o lançamento do MySQL 8.0.3. Também pode ser visualizado
online em