J'essaie de créer des points (nouvelle couche) à une distance spécifique le long de la route (couche existante) dans QGIS. Créer des points réguliers chaque mètre au niveau du comté à l'aide d'ArcGIS Desktop? fournit une solution pour ArcGIS. Comment y parvenir dans QGIS? Ajouter des points à la couche vectorielle de points à l'aide de QGIS? explique comment créer des points mais ne fait rien sur la distance.
(J'ai appliqué les solutions proposées avec différentes mesures de longueurs car je ne connaissais pas la conversion) @ La solution de Nathans a fonctionné dans une certaine mesure, j'ai eu ...
. Ici, la projection de ces points équidistants est différente de la ligne d'origine.
Avec la suggestion de @ underdark, j'ai eu
où les points ne semblent pas équidistants. Je suppose qu'il y a un problème de projection avec ces deux éléments que je ne comprends pas.
import locate
ligne plus d'une fois. Appelez-le une seule fois et vous pourrez appelerlocate.pointsAlongLine(30)
autant que vous le souhaitezRéponses:
Remarque: Il existe maintenant un plugin QGIS
QChainage
. Il fait tout cela et plus encore. Le code ci-dessous est obsolète avec QGIS 2.0 et supérieur.Voici du code Python que vous pouvez coller dans un fichier et utiliser dans QGIS:
QGIS possède une méthode dans l'API pour faire le référencement de ligne, mais je n'ai pas pu le faire fonctionner correctement, mais je vais contacter l'auteur du code et voir si je faisais quelque chose de mal.
Pour l'instant, vous aurez besoin de la bibliothèque Python galbée , que vous devez installer de toute façon car elle est pratique à avoir autour. Il a également une excellente documentation sur http://toblerity.github.com/shapely/manual.html
Il s'agit de la section que j'utilise dans l'exemple suivant http://toblerity.github.com/shapely/manual.html#interoperation .
La plupart du code suivant est du code passe-partout QGIS créant simplement les fonctionnalités, les couches, la conversion de wkb et wkt et vice-versa. Le trépan est le
point = line.interpolate(currentdistance)
qui renvoie un point à distance le long d'une ligne. Nous emballons simplement cela dans une boucle jusqu'à ce que nous manquions de ligne.Copiez et collez le code ci-dessus dans un fichier, j'ai appelé mon Locate.py, dans le
~./qgis/python
répertoire (car il se trouve dans le chemin Python) et faites-le dans la console Python à l'intérieur de QGIS.Cela créera une nouvelle couche de points avec des points tous les 30 mètres le long des lignes sélectionnées, comme ceci:
Remarque: Le code est assez approximatif et peut nécessiter un nettoyage.
EDIT: La dernière version de développement de QGIS peut maintenant le faire en mode natif.
Remplacez la boucle while par
createPointsAt
:et vous pouvez supprimer le
la source
locate
et l'utiliser mais je n'ai toujours pas obtenu les points équidistants. De plus, je suis néophyte en Python, donc je ne comprenais pas où exécuter le code (1) python dans le répertoire qgis ou (2) que sur C: \ Python27 \?C:\Users\{you user name}\.qgis\python
puis redémarrez QGIS s'il est ouvert, et allez dans `Plugins-> Python Console. Load a line layer, select a line a call
import localiser` etlocate.pointsAlongLine(30)
Vous pouvez utiliser l'outil plugin QGIS GRASS v.to.points pour créer des points le long des lignes à intervalles réguliers
la source
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 vous voulez tracer le chaînage à intervalles fixes le long d'une ligne de route, vous pouvez utiliser le plug-in "Profil de ligne" pour ce faire. Vous avez besoin d'un DEM sous la couche de la route, mais la procédure est rapide et très simple. Entaille.
la source
Attention, le modèle de données Shapely (Python) / GEOS (C ++) est défini dans un plan. Donc, si vos points sont constitués de positions GPS (latitude, longitude), la
shapely.geometry.LineString.interpolate(distance)
méthode affichera une position GPS à la distance euclidienne le long de la donnéeLineString
.Shapely
interpolate()
est basé sur lageos::linearref::LengthIndexedLine
classe GEOS utilisant laextractPoint
méthode.On suppose que l'interpolation également espacée dans le plan latitude-longitude est suffisante pour les applications qui considèrent des distances relativement petites. En général, cependant, il faut considérer la distance sur une sphère pour les applications SIG (telles que définies dans WGS84 ).
Je peux penser à deux solutions de contournement en utilisant le module Shapely:
LineString
les propriétés se voient toutes attribuer des points et des courbes interpolées linéairement le long de celles-ci. Vous pouvez peut-être écrire un membre qui accède aux courbes interpolées et implémenter l'intégrale de ligne suivante en remplaçant la distance euclidienne. J'adore cette approche car en utilisant la courbe continue par morceaux, les points souhaités peuvent être obtenus en calculant les intersections de cercles adjacents le long de la courbe avec le rayonr = radian_measure(arc_length) = arc_length / R
, où R est égal au rayon de la Terre à la position donnée.Pour ce faire, je voudrais me référer à la question StackOverflow suivante et à cette réponse en particulier:
la source
Sextante a un outil qui pourrait fonctionner pour vous. Sextante peut être téléchargé à partir du référentiel de plugins Qgis.
Recherchez:
"Outils pour les couches de
lignes " "Lignes vers des points espacés"
la source