Точки вдоль линии с неравномерным шагом
- Svility
- Участник
- Сообщения: 55
- Зарегистрирован: 24 окт 2017, 19:41
- Репутация: 5
- Откуда: 32637
Точки вдоль линии с неравномерным шагом
Задача: Есть линейный объект (путь), и есть таблица со значениями "км пересечения". Необходимо создать точки вдоль линии через заданные в таблице значения.
Последний раз редактировалось Svility 04 июл 2018, 20:54, всего редактировалось 3 раза.
-
- Гуру
- Сообщения: 5309
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1016
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Точки вдоль линии с неравномерным шагом
ST_Affine - нужные точки имеют координаты x,0 в СК сегмента - нужно лишь получить коэффициенты этой СК
- Svility
- Участник
- Сообщения: 55
- Зарегистрирован: 24 окт 2017, 19:41
- Репутация: 5
- Откуда: 32637
Re: Точки вдоль линии с неравномерным шагом
Почитал о ST_Affine, но так и не понял как ее применить. Можно пример?
- Svility
- Участник
- Сообщения: 55
- Зарегистрирован: 24 окт 2017, 19:41
- Репутация: 5
- Откуда: 32637
Re: Точки вдоль линии с неравномерным шагом
РЕШЕНО:
Код: Выделить всё
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)
-
- Гуру
- Сообщения: 5309
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1016
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
- Svility
- Участник
- Сообщения: 55
- Зарегистрирован: 24 окт 2017, 19:41
- Репутация: 5
- Откуда: 32637
Re: Точки вдоль линии с неравномерным шагом
А есть простой пример на postgis, что то не получается
-
- Гуру
- Сообщения: 5309
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1016
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Точки вдоль линии с неравномерным шагом
--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: Точки вдоль линии с неравномерным шагом
fraction нужно вычислять как "отметка пикета"/"длина линии"ST_Line_Interpolate_Point
длину линии можно брать из геометрии, а можно из отдельного атрибута "длина" (откалиброванная длина)
понравилось? жми палец вверх
- Svility
- Участник
- Сообщения: 55
- Зарегистрирован: 24 окт 2017, 19:41
- Репутация: 5
- Откуда: 32637
Re: Точки вдоль линии с неравномерным шагом
Код: Выделить всё
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)))
-
- Гуру
- Сообщения: 5309
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1016
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Точки вдоль линии с неравномерным шагом
вынос мозга
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(
специально издеваетесь?
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: Точки вдоль линии с неравномерным шагом
а вы не хотите отступы и длины линий считать в проекции? например, в подходящей зоне UTM?
понравилось? жми палец вверх
- Svility
- Участник
- Сообщения: 55
- Зарегистрирован: 24 окт 2017, 19:41
- Репутация: 5
- Откуда: 32637
Re: Точки вдоль линии с неравномерным шагом
Я же не гуру) как смог сделал, главное работает...trir писал(а): ↑23 окт 2018, 12:21вынос мозга
Получилось Спасибоnovia писал(а): ↑23 окт 2018, 12:25а вы не хотите отступы и длины линий считать в проекции? например, в подходящей зоне UTM?
Код: Выделить всё
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
- Svility
- Участник
- Сообщения: 55
- Зарегистрирован: 24 окт 2017, 19:41
- Репутация: 5
- Откуда: 32637
Re: Точки вдоль линии с неравномерным шагом
В продолжение темы...
Как интерполировать одну точку за один запрос разобрались, а как переделать запрос, что бы точки генерировались через каждые 1000 метров вдоль линии?
т.е. имея линию 16000 метров, нужно создать 16 точек через каждые 1000м
Как интерполировать одну точку за один запрос разобрались, а как переделать запрос, что бы точки генерировались через каждые 1000 метров вдоль линии?
т.е. имея линию 16000 метров, нужно создать 16 точек через каждые 1000м
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость