Estou interessado em examinar a largura média de um polígono que representa a superfície da estrada. Eu também tenho a linha central da estrada como um vetor (que às vezes não está exatamente no centro). Neste exemplo, a linha central da estrada está em vermelho e o polígono é azul:
Uma abordagem de força bruta que eu pensei, é amortecer a linha em pequenos incrementos, interceptar o buffer com uma grade de rede de pesca, interceptar o polígono da estrada com uma grade de rede de pesca, calcular a área de interseção para ambas as medidas de interseção e continuar fazendo isso até o erro é pequeno. Essa é uma abordagem grosseira, e estou me perguntando se existe uma solução mais elegante. Além disso, isso ocultaria a largura de uma estrada grande e uma estrada pequena.
Estou interessado em uma solução que usa o software ArcGIS 10, PostGIS 2.0 ou QGIS. Vi essa pergunta e baixei a ferramenta de Dan Patterson para o ArcGIS10, mas não consegui calcular o que quero com ela.
Acabei de descobrir a ferramenta Minimum Bounding Geometry no ArcGIS 10, que me permite produzir os seguintes polígonos verdes:
Essa parece ser uma boa solução para estradas que seguem uma grade, mas não funcionariam de outra maneira, por isso ainda estou interessado em outras sugestões.
Respostas:
Parte do problema é encontrar uma definição adequada de "largura média". Vários são naturais, mas diferem, pelo menos um pouco. Por uma questão de simplicidade, considere definições baseadas em propriedades fáceis de calcular (o que excluirá aquelas baseadas na transformação do eixo medial ou nas seqüências de buffers, por exemplo).
Como exemplo, considere que a intuição arquetípica de um polígono com uma "largura" definida é um pequeno buffer (digamos, raio r com extremidades quadradas) ao redor de uma polilinha longa e bastante reta (digamos comprimento L ). Pensamos em 2r = w como sua largura. Portanto:
Seu perímetro P é aproximadamente igual a 2L + 2w;
Sua área A é aproximadamente igual a w L.
A largura w e o comprimento L podem então ser recuperados como raízes do quadrático x ^ 2 - (P / 2) x + A; em particular, podemos estimar
Quando você tiver certeza de que o polígono é realmente longo e fino, como uma aproximação adicional, você pode levar 2L + 2w para igualar 2L, de onde
O erro relativo nesta aproximação é proporcional a w / L: quanto mais fino o polígono, mais próximo w / L é de zero e melhor a aproximação fica.
Essa abordagem não é apenas extremamente simples (apenas divida a área pelo perímetro e multiplique por 2). Com qualquer uma das fórmulas, não importa como o polígono está orientado ou onde está localizado (porque esses movimentos euclidianos não alteram a área nem a área). perímetro).
Você pode considerar o uso de uma dessas fórmulas para estimar a largura média de qualquer polígono que represente segmentos de ruas. O erro que você comete na estimativa original de w (com a fórmula quadrática) ocorre porque a área A também inclui pequenas fatias em cada curva da polilinha original. Se a soma dos ângulos de dobra for t radianos (esta é a curvatura absoluta total da polilinha), então realmente
P = 2L + 2w + 2 Pi tw e
A = Lw + Pi tw ^ 2.
Conecte-os à solução anterior (fórmula quadrática) e simplifique. Quando a fumaça desaparece, a contribuição do termo de curvatura t desaparece! O que originalmente parecia uma aproximação é perfeitamente preciso para os buffers de polilinha sem auto-interseção (com extremidades ao quadrado). Para polígonos de largura variável, essa é, portanto, uma definição razoável de largura média.
fonte
Aqui mostro pouca otimização sobre a solução @whuber, e estou colocando em termos de "largura do buffer", porque é útil para integrar a solução de um problema mais geral: Existe uma função inversa st_buffer, que retorna uma estimativa de largura?
Para este problema, a questão @celenius sobre largura da rua ,
sw
a solução éonde
sw
é a "largura média",g1
a linha central deg2
e a ruag2
é um polígono . Usei apenas a biblioteca padrão OGC, testei com PostGIS e resolvi outras aplicações práticas sérias com a mesma função buffer_width.DEMONSTRAÇÃO
A2
é a área deg2
,L1
o comprimento da linha central (g1
) deg2
.Supondo que possamos gerar
g2
porg2=ST_Buffer(g1,w)
, e queg1
seja reto,g2
um retângulo com comprimentoL1
e largura2*w
, eNão é a mesma fórmula de @whuber, porque aqui
w
está metade dag2
largura do retângulo ( ). É um bom estimador, mas, como podemos ver pelos testes (abaixo), não é exato, e a função o utiliza como uma pista para reduzir ag2
área e como um estimador final.Aqui, não avaliamos buffers com "endcap = square" ou "endcap = round", que precisam da soma
A2
de uma área de um buffer de ponto com o mesmow
.Referências: em um fórum semelhante de 2005 , W. Huber explica soluções semelhantes e outras.
ENSAIOS E RAZÕES
Para linhas retas, os resultados, como esperado, são exatos. Mas para outras geometrias, os resultados podem ser decepcionantes. A principal razão é que, talvez, todo o modelo seja para retângulos exatos ou para geometrias que possam ser aproximadas a um "retângulo de tira". Aqui está um "kit de teste" para verificar os limites dessa aproximação (veja
wfactor
nos resultados acima).RESULTADOS:
COM RETÂNGULOS (a linha central é uma LINHA RETO):
COM OUTRAS GEOMETRIAS (linha central dobrada):
Sobre,
btype
consulte o guia ST_Buffer , com boas ilustrações e os LINESTRINGs usados aqui.CONCLUSÕES :
w_estim
é sempre melhor quew_near
;g2
geometrias "quase retangulares" , tudo bem, qualquerwfactor
wfactor=~0.01
para 1% de erro emw_estim
. Até esse fator, use outro estimador.Cuidado e prevenção
Por que o erro de estimativa ocorre? Quando você usa
ST_Buffer(g,w)
, espera, pelo "modelo de faixa retangular", que a nova área adicionada pelo buffer de larguraw
seja aproximadamentew*ST_Length(g)
ouw*ST_Perimeter(g)
... Quando não, geralmente por sobreposições (consulte linhas dobradas) ou "estilo", é quando a estimativa daw
falha média . Esta é a principal mensagem dos testes.Para detectar esse problema em qualquer rei do buffer , verifique o comportamento da geração do buffer:
RESULTADOS:
fonte
Se você pode associar seus dados de polígono aos dados da linha de centro (por meios espaciais ou tabulares), basta somar as áreas de polígono para cada alinhamento da linha de centro e dividir pelo comprimento da linha de centro.
fonte
Eu desenvolvi uma fórmula para a largura média de um polígono e a coloquei em uma função Python / ArcPy. Minha fórmula é derivada (mas amplia substancialmente) da noção mais direta de largura média que eu já vi discutida em outros lugares; isto é, o diâmetro de um círculo com a mesma área do seu polígono. No entanto, na pergunta acima e no meu projeto, eu estava mais interessado na largura do eixo mais estreito. Além disso, eu estava interessado na largura média de formas potencialmente complexas e não convexas.
Minha solução foi:
Isso é:
A função é:
Aqui está um mapa exportado com a largura média (e alguns outros atributos de geometria para referência) em uma variedade de formas usando a função acima:
fonte
area / perimeter * 4
.Outra solução com eixo medial aproximado:
O resultado certamente estará errado para os polígonos em que o eixo medial aproximado não é uma única linha contínua, para que você possa verificá-lo antes da etapa 1 e retornar
NULL
ou algo assim.Aqui está um exemplo da função PostgreSQL (nota: você precisa instalar as extensões postgis e postgis_sfcgal ):
Desvantagem:
Essa solução não funcionará com casos em que o polígono é quase retangular e o ser humano pode intuitivamente definir seu comprimento, mas o eixo medial aproximado possui pequenos ramos próximos à borda e, portanto, o algoritmo retorna Nenhum.
Exemplo:
fonte