Точки вдоль линии с неравномерным шагом
Добавлено: 21 июн 2018, 18:51
Задача: Есть линейный объект (путь), и есть таблица со значениями "км пересечения". Необходимо создать точки вдоль линии через заданные в таблице значения.
Геоинформационные системы (ГИС) и Дистанционное зондирование Земли
https://gis-lab.info/forum/
Код: Выделить всё
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)
--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)
fraction нужно вычислять как "отметка пикета"/"длина линии"ST_Line_Interpolate_Point
Код: Выделить всё
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)))
и что?параметры wgs совподают
Я же не гуру) как смог сделал, главное работает...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;