Я пытаюсь создать точки (новый слой) на определенном расстоянии вдоль дороги (существующий слой) в QGIS. Создание регулярных точек каждого метра на уровне округа с помощью ArcGIS Desktop? дает решение для ArcGIS. Как этого добиться в QGIS? Добавление точек в векторный слой точек с использованием QGIS? объясняет, как создавать точки, но ничего не делает с расстоянием.
(Я применил предложенные решения с разными мерами длин, потому что не знал преобразования). @ Решение Натанса сработало в некоторой степени, я получил ...
, Здесь проекция этих равноотстоящих точек отличается от исходной линии.
С предложением @ Underdark я получил
где точки не кажутся равноудаленными. Я предполагаю, что есть некоторая проблема проекции с обоими из них, которую я не понимаю.
import locate
линию более одного раза. Просто позвоните ему один раз, и вы сможете звонитьlocate.pointsAlongLine(30)
столько, сколько вам нужноОтветы:
Примечание: теперь есть плагин QGIS
QChainage
. Это делает все это и многое другое. Код ниже устарел с QGIS 2.0 и выше.Вот некоторый код Python, который вы можете вставить в файл и использовать внутри QGIS:
В QGIS есть метод API для ссылки на лайнер, однако я не смог заставить его работать правильно, но я свяжусь с автором кода и посмотрю, сделал ли я что-то не так.
На данный момент вам понадобится красивая библиотека Python, которую вы должны установить в любом случае, потому что она удобна в использовании. Он также имеет отличную документацию на http://toblerity.github.com/shapely/manual.html
Этот раздел я использую в следующем примере: http://toblerity.github.com/shapely/manual.html#interoperation .
Большая часть следующего кода является стандартным кодом QGIS, просто создавая функции, слои, конвертируя из wkb и wkt и обратно. Базовый бит -
point = line.interpolate(currentdistance)
это точка, которая возвращает точку на расстоянии вдоль линии. Мы просто закручиваем это в цикл, пока не закончим.Скопируйте и вставьте приведенный выше код в файл, я назвал мой locate.py в
~./qgis/python
каталоге (потому что он находится в пути Python) и просто сделаю это в консоли Python внутри QGIS.Это создаст новый слой точек с точками на каждые 30 метров вдоль выбранных линий, например так:
Примечание: код довольно грубый и может потребовать некоторой очистки.
РЕДАКТИРОВАТЬ: Самая последняя сборка QGIS теперь может делать это изначально.
Измените цикл while
createPointsAt
на:и вы можете удалить
источник
locate
и использования, но все равно не получил эквидистантные очки. Кроме того, я новичок в Python, поэтому я не понимал, где запустить код (1) python в каталоге qgis или (2), что в C: \ Python27 \?C:\Users\{you user name}\.qgis\python
затем перезапустите QGIS, если он открыт, и перейдите к `Plugins-> Python Console. Load a line layer, select a line a call
import locate` иlocate.pointsAlongLine(30)
Вы можете использовать плагин QGIS GRASS v.to.points для создания точек вдоль линий через равные промежутки времени.
источник
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
Если вы хотите построить цепочку с фиксированными интервалами вдоль линии дороги, вы можете использовать плагин «Профиль из линии», чтобы сделать это. Вам нужен DEM под слоем дорожной линии, но процедура быстрая и очень простая. Ник.
источник
Помните, что модель данных Shapely (Python) / GEOS (C ++) определена на плоскости. Таким образом, если ваши точки состоят из GPS-координат (широта, долгота), то при использовании этого
shapely.geometry.LineString.interpolate(distance)
метода будет выведена GPS-позиция на евклидовом расстоянии вдоль заданного значенияLineString
.Shapely's
interpolate()
основан наgeos::linearref::LengthIndexedLine
классе GEOS с использованиемextractPoint
метода.Предположительно, равномерно распределенная интерполяция в плоскости широта-долгота достаточна для приложений, рассматривающих относительно небольшие расстояния. В целом, однако, следует учитывать расстояние на сфере для приложений ГИС (как определено в WGS84 ).
Я могу придумать два обходных пути, используя модуль Shapely:
LineString
свойствами являются все заданные точки и линейно интерполированные вдоль них кривые. Возможно, вы можете написать член, который обращается к интерполированным кривым и реализовать следующий линейный интеграл, заменяющий евклидово расстояние. Мне нравится этот подход, потому что, используя кусочно-непрерывную кривую, желаемые точки могут быть получены путем вычисления пересечений смежных окружностей вдоль кривой с радиусомr = radian_measure(arc_length) = arc_length / R
, где R равен радиусу Земли в данной позиции.Чтобы достичь этого, я хотел бы обратиться к следующему вопросу StackOverflow и, в частности, к этому ответу :
источник
Sextante имеет инструмент, который может работать для вас. Sextante можно скачать из хранилища плагинов Qgis.
Ищите:
«Инструменты для линейных слоев»,
«Линии для равноотстоящих точек»
источник