9 votos

¿Encontrar la línea más cercana a un punto en QGIS?

Dado un punto y unas cuantas rectas, ¿qué debo hacer para encontrar la recta más próxima al punto?

enter image description here

Soy consciente de ¿Cómo encontrar la línea más cercana a un punto con ArcGIS Desktop (ArcObjects/ArcPy)? pero que está en ArcGIS y utiliza sus funciones.


La pregunta "duplicado" no responde adecuadamente a esta pregunta, sólo es un indicador de MMQGIS.

15voto

kjo Puntos 197

Puede utilizar QgsSpatialIndex para encontrar los objetos más cercanos. Primero tendrá que crear un nuevo objeto de esta clase. A continuación, añada las características necesarias al índice. Entonces podrá utilizar QgsSpatialIndex.nearestNeighbor (QgsPoint point, int neighbors) para recuperar los más cercanos.

Aquí está la muestra que he gestionado en la consola de python.

lineLayer = iface.activeLayer()
provider = lineLayer.dataProvider()

spIndex = QgsSpatialIndex() #create spatial index object

feat = QgsFeature()
fit = provider.getFeatures() #gets all features in layer

# insert features to index
while fit.nextFeature(feat):
    spIndex.insertFeature(feat)

pt = QgsPoint(-0.00062201,0.00001746)

# QgsSpatialIndex.nearestNeighbor (QgsPoint point, int neighbors)
nearestIds = spIndex.nearestNeighbor(pt,1) # we need only one neighbour
print nearestIds

Editer :

Para obtener el objeto QgsFeature real de la lista de python, puede hacer lo siguiente,

featureId = nearestIds[0]
fit2 = lineLayer.getFeatures(QgsFeatureRequest().setFilterFid(featureId))
ftr = QgsFeature()
fit2.nextFeature(ftr)
# ftr now contains the QgsFeature object for the id

2voto

chhh Puntos 1154

Mientras tanto, hay una manera fácil de hacerlo utilizando expresiones QGIS con overlay_nearest() función:

overlay_nearest ('line_layer', $geometry)[0]

2voto

matzeri Puntos 176

Desde QGIS 3.8 también existe una aplicación nativa algoritmo de procesamiento : Unir atributos por cercanía

enter image description here

2voto

matzeri Puntos 176

Casi 10 años después, probablemente merezca la pena añadir una actualización a Respuesta de @vinayan :

Al almacenar las geometrías de las características dentro del QgsSpatialIndex() utilizando QgsSpatialIndex.FlagStoreFeatureGeometries flag, puede obtener las características más cercanas reales, no sólo las aproximadas por su caja delimitadora. De este modo se soluciona el problema comentario de Håvard Tveite . Además, hoy en día es mucho más eficiente cargar el índice de una sola vez; esto es mucho más rápido que añadir características una a una después de la creación del índice en un bucle. Además, se pueden obtener las geometrías más cercanas directamente del índice, lo que es mucho más rápido que obtener la característica completa mediante un bucle. QgsFeatureRequest() . Si aún desea obtener toda la función, ahora también puede utilizar directamente .getFeature(id) que es más corto. Aparte de eso, la sintaxis es ahora para PyQGIS 3. El código:

layer = iface.activeLayer()

# Bulkloading the index is much faster than adding features one by one
# Storing the geometry in the index allows finding the exact nearest neighbor, also for not single-point-features
index = QgsSpatialIndex(layer.getFeatures(), flags=QgsSpatialIndex.FlagStoreFeatureGeometries)

# QgsSpatialIndex.nearestNeighbor(QgsPointXY(), int neighbors)
pt = QgsPointXY(-0.00062201,0.00001746)
nearestIds = index.nearestNeighbor(pt,1) # we need only one neighbour

# Or, not stated in the docs, if you store the geometry in the index as done here, you can also: QgsSpatialIndex.nearestNeighbor(QgsGeometry(), int neighbors)
geom = QgsGeometry.fromPointXY(QgsPointXY(-0.00062201,0.00001746))
nearestIds = index.nearestNeighbor(geom,1)

# note that in reality, if both layers are the same, the nearest feature will always be itself
# in that case you should request 2 nearest neighbors and remove the one with the same id as your current source feature
print(nearestIds)

for nearestId in nearestIds:
    # get the geometry of nearest feature efficiently directly from the index without a slow feature request
    nearestGeom = index.geometry(nearestId)
    print(nearestGeom)
    # or get the whole feature via a short getFeature() request
    nearestFeat = layer.getFeature(nearestId)
    print(nearestFeat)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X