Страница 1 из 1

Точки вдоль линии с неравномерным шагом

Добавлено: 21 июн 2018, 18:51
Svility
Задача: Есть линейный объект (путь), и есть таблица со значениями "км пересечения". Необходимо создать точки вдоль линии через заданные в таблице значения.
9DC89DCE-2DD5-49D6-BFFC-A696CE0ACC9C.jpeg
9DC89DCE-2DD5-49D6-BFFC-A696CE0ACC9C.jpeg (306.22 КБ) 16749 просмотров

Re: Точки вдоль линии с неравномерным шагом

Добавлено: 21 июн 2018, 19:08
trir
ST_Affine - нужные точки имеют координаты x,0 в СК сегмента - нужно лишь получить коэффициенты этой СК

Re: Точки вдоль линии с неравномерным шагом

Добавлено: 04 июл 2018, 15:52
Svility
Почитал о ST_Affine, но так и не понял как ее применить. Можно пример?

Re: Точки вдоль линии с неравномерным шагом

Добавлено: 12 июл 2018, 20:14
Svility
РЕШЕНО:

Код: Выделить всё

import csv
from PyQt4.QtCore import QVariant

#Исходные параметры
layer_name = '014' # Имя линейного слоя в списке слоев
csvfile_path = 'C:/Users/user/Desktop/111.csv' # путь к файлу с данными
EPSG = '32637' #метрическая система координат

#Получаем слой и данные csv-файла
layer = QgsMapLayerRegistry.instance().mapLayersByName(layer_name)[0]
csvfile = open(csvfile_path, 'rb')
reader = csv.reader(csvfile, delimiter=';')
header = reader.next()

#Подгатавливаем выходной слой
mem_layer = QgsVectorLayer("Point?crs=epsg:"+EPSG, 'point', 'memory')
mem_layer.startEditing()
attr = [QgsField(header[0],QVariant.String),QgsField(header[1],QVariant.Double),QgsField(header[2],QVariant.Double)] #Задаем тип данных для каждого столбца csv
prov = mem_layer.dataProvider()
prov.addAttributes(attr)
mem_layer.updateFields()

#Выполняем запрос и заполняем поля из csv-файла
for feat in layer.getFeatures():
	for row in reader:
		new_feat = QgsFeature()
		new_feat.setGeometry(feat.geometry().interpolate(float(row[0])))
		new_feat.setAttributes(attr)
		new_feat.setAttribute(0, float(row[0])) # Заполняем столбец 0
		new_feat.setAttribute(1,row[1]) # Заполняем столбец 1
		new_feat.setAttribute(2,row[2]) # Заполняем столбец 2
		mem_layer.addFeatures([new_feat])

#Сохраняем результат в виртуальный слой
mem_layer.commitChanges()
QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
point from csv.py
(1.68 КБ) 1058 скачиваний

Re: Точки вдоль линии с неравномерным шагом

Добавлено: 12 июл 2018, 20:23
trir

Re: Точки вдоль линии с неравномерным шагом

Добавлено: 22 окт 2018, 21:35
Svility
А есть простой пример на postgis, что то не получается :roll:

Re: Точки вдоль линии с неравномерным шагом

Добавлено: 23 окт 2018, 06:31
trir
--Return point 20% along 2d line
SELECT ST_AsEWKT(ST_Line_Interpolate_Point(the_line, 0.20))
FROM (SELECT ST_GeomFromEWKT('LINESTRING(25 50, 100 125, 150 190)') as the_line) As foo;
st_asewkt
----------------
POINT(51.5974135047432 76.5974135047432)

Re: Точки вдоль линии с неравномерным шагом

Добавлено: 23 окт 2018, 10:02
novia
ST_Line_Interpolate_Point
fraction нужно вычислять как "отметка пикета"/"длина линии"
длину линии можно брать из геометрии, а можно из отдельного атрибута "длина" (откалиброванная длина)

Re: Точки вдоль линии с неравномерным шагом

Добавлено: 23 окт 2018, 11:49
Svility

Код: Выделить всё

SELECT ST_AsEWKT(
ST_Line_Interpolate_Point(
(select ST_GeomFromEWKT(ST_AsText(ST_LineMerge(geom)))
  FROM "sheme".my_line_table where id=1),  (SELECT 100/ST_LengthSpheroid(ST_Transform(ST_GeomFromEWKT(geom),4326), 'SPHEROID["WGS 84",6378137,298.257223563]') from "sheme".my_line_table where id=1)))
Сделал вот так, но точка создается в 97м от начала, а не 100. Проверяю линейкой в qgis(параметры wgs совподают)

Re: Точки вдоль линии с неравномерным шагом

Добавлено: 23 окт 2018, 12:21
trir
вынос мозга
ST_LineMerge(geom) FROM "sheme".my_line_table where id=1
а потом
ST_Transform(ST_GeomFromEWKT(geom),4326) from "sheme".my_line_table where id=1
и ещё
ST_GeomFromEWKT(ST_AsText(
специально издеваетесь?
параметры wgs совподают
и что?

Re: Точки вдоль линии с неравномерным шагом

Добавлено: 23 окт 2018, 12:25
novia
а вы не хотите отступы и длины линий считать в проекции? например, в подходящей зоне UTM?

Re: Точки вдоль линии с неравномерным шагом

Добавлено: 23 окт 2018, 21:03
Svility
trir писал(а):
23 окт 2018, 12:21
вынос мозга
Я же не гуру) как смог сделал, главное работает...
novia писал(а):
23 окт 2018, 12:25
а вы не хотите отступы и длины линий считать в проекции? например, в подходящей зоне UTM?
Получилось :D Спасибо

Код: Выделить всё

SELECT ST_AsEWKT(ST_Line_Interpolate_Point(linestring, fraction))
FROM (SELECT ST_AsText(ST_Transform(ST_LineMerge(geom),32637)) as linestring,
(SELECT 100/ST_3DLength(ST_Transform(ST_GeomFromEWKT(geom),32637))) as fraction
from "sheme".line_table where id=1) as foo;

Re: Точки вдоль линии с неравномерным шагом

Добавлено: 23 окт 2018, 21:05
Svility
-

Re: Точки вдоль линии с неравномерным шагом

Добавлено: 03 фев 2019, 09:23
Svility
В продолжение темы...
Как интерполировать одну точку за один запрос разобрались, а как переделать запрос, что бы точки генерировались через каждые 1000 метров вдоль линии?
т.е. имея линию 16000 метров, нужно создать 16 точек через каждые 1000м