Estoy tratando de crear puntos (nueva capa) a una distancia específica a lo largo del camino (capa existente) en QGIS. ¿Crea puntos regulares cada metro a nivel de condado usando ArcGIS Desktop? da solución para ArcGIS. ¿Cómo lograr esto en QGIS? ¿Agregar puntos a la capa vectorial de puntos usando QGIS? explica cómo crear puntos pero no hace nada sobre la distancia.
(Apliqué las soluciones propuestas con diferentes medidas de longitudes porque no conocía la conversión) La solución de @ Nathans funcionó hasta cierto punto, obtuve ...
. Aquí, la proyección de estos puntos equidistantes es diferente de la línea original.
Con la sugerencia de @ underdark, obtuve
donde los puntos no parecen ser equidistantes. Supongo que hay algún problema de proyección con ambos que no entiendo.
import locate
línea más de una vez. Sólo tiene que llamar una vez, entonces puede llamar alocate.pointsAlongLine(30)
todo lo que necesitaRespuestas:
Nota: ahora hay un complemento QGIS
QChainage
. Hace todo esto y más. El siguiente código está desactualizado con QGIS 2.0 y superior.Aquí hay un código de Python que puede pegar en un archivo y usar dentro de QGIS:
QGIS tiene un método en su API para hacer referencias de línea, sin embargo no pude hacer que funcione correctamente, pero me pondré en contacto con el autor del código y veré si estaba haciendo algo mal.
Por ahora necesitará la biblioteca Python bien formada , que debe instalar de todos modos porque es útil tenerla a mano. También tiene una excelente documentación en http://toblerity.github.com/shapely/manual.html
Esta es la sección que estoy usando en el siguiente ejemplo http://toblerity.github.com/shapely/manual.html#interoperation .
La mayor parte del siguiente código es un código repetitivo de QGIS que solo crea las características, las capas, la conversión de wkb y wkt y viceversa. El bit central es el
point = line.interpolate(currentdistance)
que devuelve un punto a una distancia a lo largo de una línea. Simplemente envolvemos esto en un bucle hasta que nos quedemos sin línea.Copie y pegue el código anterior en el archivo, llamé a mi location.py, en el
~./qgis/python
directorio (porque está en la ruta de Python) y solo haga esto en la consola de Python dentro de QGIS.Eso creará una nueva capa de puntos con puntos cada 30 metros a lo largo de las líneas seleccionadas, de esta manera:
Nota: El código es bastante tosco y podría necesitar alguna limpieza.
EDITAR: la última versión de desarrollo de QGIS ahora puede hacer esto de forma nativa.
Cambie el bucle while
createPointsAt
a:y puedes quitar el
fuente
locate
y usarlo, pero aún así no obtuve los puntos equidistantes. Además, soy un neófito en Python, así que no entendí dónde ejecutar el código (1) python en el directorio qgis o (2) que en C: \ Python27 \?C:\Users\{you user name}\.qgis\python
luego reinicie QGIS si está abierto, y vaya a `Complementos->. Load a line layer, select a line a call
Importar consola de Python localizar` ylocate.pointsAlongLine(30)
Puede usar la herramienta v.to.points del complemento QGIS GRASS para crear puntos a lo largo de líneas a intervalos regulares
fuente
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
Si desea trazar el PK a intervalos fijos a lo largo de una línea de carretera, puede usar el complemento 'Perfil desde la línea' para hacer esto. Necesita un DEM debajo de la capa de línea de ruta, pero el procedimiento es rápido y muy simple. Mella.
fuente
Tenga en cuenta que el modelo de datos Shapely (Python) / GEOS (C ++) se define en un plano. Entonces, si sus puntos consisten en posiciones de GPS (latitud, longitud) usando el
shapely.geometry.LineString.interpolate(distance)
método, generará una posición de GPS a la distancia euclidiana a lo largo de la dadaLineString
.Shapely's
interpolate()
se basa en lageos::linearref::LengthIndexedLine
clase de GEOS utilizando elextractPoint
método.Supuestamente, la interpolación igualmente espaciada en el plano de latitud-longitud es suficiente para aplicaciones que consideran distancias relativamente pequeñas. En general, sin embargo, uno debe considerar la distancia en una esfera para aplicaciones SIG (como se define en WGS84 ).
Puedo pensar en dos soluciones alternativas usando el módulo Shapely:
LineString
todas las propiedades son puntos dados y curvas interpoladas linealmente a lo largo de ellos. Quizás pueda escribir un miembro que acceda a las curvas interpoladas e implementar la siguiente integral de línea sustituyendo la distancia euclidiana. Este enfoque me gusta porque usando la curva continua por partes se pueden obtener los puntos deseados calculando las intersecciones de los círculos adyacentes a lo largo de la curva con el radior = radian_measure(arc_length) = arc_length / R
, donde R es igual al radio de la Tierra en la posición dada.Para lograr esto, me gustaría consultar la siguiente pregunta de StackOverflow y esta respuesta en particular:
fuente
Sextante tiene una herramienta que podría funcionar para usted. Sextante se puede descargar desde el repositorio de complementos de Qgis.
Busque:
"Herramientas para capas de línea"
"Líneas a puntos equiespaciados"
fuente