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

Ответить
Аватара пользователя
Svility
Участник
Сообщения: 55
Зарегистрирован: 24 окт 2017, 19:41
Репутация: 5
Откуда: 32637

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

Сообщение Svility » 21 июн 2018, 18:51

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

trir
Гуру
Сообщения: 5271
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1013
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 21 июн 2018, 19:08

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

Аватара пользователя
Svility
Участник
Сообщения: 55
Зарегистрирован: 24 окт 2017, 19:41
Репутация: 5
Откуда: 32637

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

Сообщение Svility » 04 июл 2018, 15:52

Почитал о ST_Affine, но так и не понял как ее применить. Можно пример?

Аватара пользователя
Svility
Участник
Сообщения: 55
Зарегистрирован: 24 окт 2017, 19:41
Репутация: 5
Откуда: 32637

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

Сообщение Svility » 12 июл 2018, 20:14

РЕШЕНО:

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

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 КБ) 1053 скачивания

trir
Гуру
Сообщения: 5271
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1013
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 12 июл 2018, 20:23


Аватара пользователя
Svility
Участник
Сообщения: 55
Зарегистрирован: 24 окт 2017, 19:41
Репутация: 5
Откуда: 32637

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

Сообщение Svility » 22 окт 2018, 21:35

А есть простой пример на postgis, что то не получается :roll:

trir
Гуру
Сообщения: 5271
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1013
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 23 окт 2018, 06:31

--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)

Аватара пользователя
novia
Гуру
Сообщения: 2261
Зарегистрирован: 29 апр 2011, 15:06
Репутация: 489
Откуда: Тель-Авив

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

Сообщение novia » 23 окт 2018, 10:02

ST_Line_Interpolate_Point
fraction нужно вычислять как "отметка пикета"/"длина линии"
длину линии можно брать из геометрии, а можно из отдельного атрибута "длина" (откалиброванная длина)
понравилось? жми палец вверх :!:

Аватара пользователя
Svility
Участник
Сообщения: 55
Зарегистрирован: 24 окт 2017, 19:41
Репутация: 5
Откуда: 32637

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

Сообщение Svility » 23 окт 2018, 11:49

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

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 совподают)

trir
Гуру
Сообщения: 5271
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1013
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 23 окт 2018, 12:21

вынос мозга
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 совподают
и что?

Аватара пользователя
novia
Гуру
Сообщения: 2261
Зарегистрирован: 29 апр 2011, 15:06
Репутация: 489
Откуда: Тель-Авив

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

Сообщение novia » 23 окт 2018, 12:25

а вы не хотите отступы и длины линий считать в проекции? например, в подходящей зоне UTM?
понравилось? жми палец вверх :!:

Аватара пользователя
Svility
Участник
Сообщения: 55
Зарегистрирован: 24 окт 2017, 19:41
Репутация: 5
Откуда: 32637

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

Сообщение Svility » 23 окт 2018, 21:03

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;

Аватара пользователя
Svility
Участник
Сообщения: 55
Зарегистрирован: 24 окт 2017, 19:41
Репутация: 5
Откуда: 32637

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

Сообщение Svility » 23 окт 2018, 21:05

-

Аватара пользователя
Svility
Участник
Сообщения: 55
Зарегистрирован: 24 окт 2017, 19:41
Репутация: 5
Откуда: 32637

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

Сообщение Svility » 03 фев 2019, 09:23

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

Ответить

Вернуться в «PostGIS/PostgreSQL»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя