Estou tentando criar pontos (nova camada) a uma distância específica ao longo da estrada (camada existente) no QGIS. Criando pontos regulares a cada metro no nível do condado usando o ArcGIS Desktop? fornece solução para ArcGIS. Como conseguir isso no QGIS? Adicionando pontos à camada vetorial de pontos usando o QGIS? explica como criar pontos, mas não faz nada sobre a distância.
(Apliquei as soluções propostas com diferentes medidas de comprimento, pois não conhecia a conversão) @ A solução de Nathans funcionou até certo ponto, consegui ...
. Aqui, a projeção desses pontos equidistantes é diferente da linha original.
Com a sugestão de @ underdark, recebi
onde os pontos não parecem ser equidistantes. Eu acho que há algum problema de projeção com os dois que eu não estou entendendo.
import locate
linha mais de uma vez. Apenas chamá-lo de uma vez, então você pode chamarlocate.pointsAlongLine(30)
tanto quanto você precisaRespostas:
Nota: Agora existe um plug-in QGIS
QChainage
. Faz tudo isso e muito mais. O código abaixo está desatualizado com o QGIS 2.0 e superior.Aqui está um código Python que você pode colar em um arquivo e usar dentro do QGIS:
O QGIS possui um método na API para fazer referência ao liner, no entanto, não consegui fazê-lo funcionar corretamente, mas vou entrar em contato com o autor do código e ver se estou fazendo algo errado.
Por enquanto, você precisará da bem tornada biblioteca Python, que você deve instalar de qualquer maneira, porque é útil ter por perto. Ele também possui excelente documentação em http://toblerity.github.com/shapely/manual.html
Esta é a seção que estou usando no exemplo a seguir http://toblerity.github.com/shapely/manual.html#interoperation .
A maior parte do código a seguir é do código padrão do QGIS, apenas criando os recursos, as camadas, convertendo de wkb e wkt e vice-versa. O bit principal é o
point = line.interpolate(currentdistance)
que retorna um ponto à distância ao longo de uma linha. Nós apenas envolvemos isso em um loop até ficarmos sem linha.Copie e cole o código acima no arquivo, chamei meu localiz.py, no
~./qgis/python
diretório (porque está no caminho do Python) e faça isso no console do Python dentro do QGIS.Isso criará uma nova camada de pontos com pontos a cada 30 metros, ao longo das linhas selecionadas, da seguinte forma:
Nota: O código é bastante difícil e pode precisar de uma limpeza.
EDIT: A última versão do desenvolvedor do QGIS agora pode fazer isso de forma nativa.
Altere o loop while
createPointsAt
para:e você pode remover o
fonte
locate
e usá-lo, mas ainda não obtive os pontos equidistantes. Além disso, sou um neófito em Python, então não entendi onde executar o código (1) python no diretório qgis ou (2) no C: \ Python27 \?C:\Users\{you user name}\.qgis\python
e reinicie o QGIS se estiver aberto, e vá para `Plugins-> Python Console. Load a line layer, select a line a call
import location` elocate.pointsAlongLine(30)
Você pode usar a ferramenta v.to.points do plugin QGIS GRASS para criar pontos ao longo das linhas em intervalos regulares
fonte
CRS of Original Shape file, the line = EPSG:26915 - NAD83 / UTM zone 15N, CRS of Grass line vector obtained using v.in.ogr = EPSG:4269 - NAD83, CRS of Grass points vector obtained using v.to.points = EPSG:4326 - WGS 84
Se você deseja plotar a corrente em intervalos fixos ao longo de uma estrada, pode usar o plug-in 'Perfil da linha' para fazer isso. Você precisa de um DEM sob a camada de linha da estrada, mas o procedimento é rápido e muito simples. Usuario.
fonte
Observe que o modelo de dados Shapely (Python) / GEOS (C ++) está definido em um plano. Portanto, se seus pontos consistirem em posições GPS (latitude, longitude), o
shapely.geometry.LineString.interpolate(distance)
método emitirá uma posição GPS na distância euclidiana ao longo do dadoLineString
.O Shapely's
interpolate()
é baseado nageos::linearref::LengthIndexedLine
classe do GEOS usando oextractPoint
métodoSupostamente, a interpolação igualmente espaçada no plano de latitude-longitude é suficiente para aplicações que consideram distâncias relativamente pequenas. Em geral, no entanto, deve-se considerar a distância em uma esfera para aplicativos GIS (conforme definido em WGS84 ).
Posso pensar em duas soluções alternativas usando o módulo Shapely:
LineString
todas as propriedades recebem pontos e curvas interpoladas linearmente ao longo deles. Talvez você possa escrever um membro que acesse as curvas interpoladas e implementar a seguinte linha integral, substituindo a distância euclidiana. Eu gosto dessa abordagem porque, usando a curva contínua em partes, os pontos desejados podem ser obtidos calculando-se as interseções dos círculos adjacentes ao longo da curva com o raior = radian_measure(arc_length) = arc_length / R
, onde R é igual ao raio da Terra na posição determinada.Para conseguir isso, gostaria de consultar a seguinte pergunta StackOverflow e esta resposta em particular:
fonte
O Sextante possui uma ferramenta que pode funcionar para você. O Sextante pode ser baixado do repositório de plugins Qgis.
Procure por:
"Ferramentas para camadas de linha"
"Linhas para pontos com espaço equidistante"
fonte