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

Преобразование линий в точки

Добавлено: 15 май 2012, 12:15
KartaBY
Добрый день.
Подскажите как можно преобразовать линию в точку?
Существующий инструмент "извлечение узлов" создает точки на концах линии, а мне надо создать одну точку на центре линии.
:oops:
Спасибо.

Re: Преобразование линий в точки

Добавлено: 15 май 2012, 13:05
Александр Мурый
В "чистом" QGIS, боюсь, никак. Можно с помощью GRASS Tools (модуль v.to.points).

Re: Преобразование линий в точки

Добавлено: 15 май 2012, 14:34
KartaBY
Н-да. Не хочет ГРАСС импортировать шейпы хоть убей.
Но это уже совсем другая история (ветка форума).

Re: Преобразование линий в точки

Добавлено: 15 май 2012, 14:38
rhot
спрашивайте, поможем =)

Re: Преобразование линий в точки

Добавлено: 15 май 2012, 14:59
KartaBY
Да собственно и спрашивать пока нечего.
Выдает ошибки, но прочитать их нет возможности, одни кракозябры.
Надо с ними бороться, так что курю пока форум.

Re: Преобразование линий в точки

Добавлено: 15 май 2012, 15:03
KartaBY
Вот описана моя проблема.
Решения пока нет. (
viewtopic.php?f=29&t=8210

Re: Преобразование линий в точки

Добавлено: 15 май 2012, 16:54
Voltron
У вас все линии содержат только по 2 узла и прямые? В таком случае задача решается с использованием школьного курса геометрии.

Если же у вас ломанные, то не совсем понятно как вы собрались находить «центр линии».

Re: Преобразование линий в точки

Добавлено: 15 май 2012, 19:52
Александр Мурый
Voltron писал(а): Если же у вас ломанные, то не совсем понятно как вы собрались находить «центр линии».
Поделить длину линии пополам и отступить это расстояние вдоль линии от одной из конечных точек?

Re: Преобразование линий в точки

Добавлено: 15 май 2012, 20:22
Voltron
amuriy писал(а):Поделить длину линии пополам и отступить это расстояние вдоль линии от одной из конечных точек?
Тогда уж скорее центр bbox'а брать, т.к длина линии может превышать расстояние между крайними точками.

Re: Преобразование линий в точки

Добавлено: 16 май 2012, 10:26
KartaBY
Voltron писал(а):У вас все линии содержат только по 2 узла и прямые?
да

ps. Школьный курс геометрии не говорит как этот процесс сделать в QGIS, а в ручную 150000 линий я буду до второго пришествия преобразовывать.

Re: Преобразование линий в точки

Добавлено: 16 май 2012, 20:18
Александр Мурый
KartaBY, если возможно выложить куда-то данные, могу помочь с точками (в GRASS). В QGIS без спец. программирования вы это не сделаете, как я понял.

Re: Преобразование линий в точки

Добавлено: 16 май 2012, 20:32
Voltron
KartaBY писал(а):ps. Школьный курс геометрии не говорит как этот процесс сделать в QGIS
Школьный курс говорит как найти середину отрезка. Внезапно.
KartaBY писал(а):а в ручную 150000 линий я буду до второго пришествия преобразовывать.
Две минуты, включая набор и проверку на тестовом слое

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

from qgis.core import *
layer = qgis.utils.iface.mapCanvas().currentLayer()
vl = QgsVectorLayer("Point", "temporary_points", "memory")
pr = vl.dataProvider()
layer.select()
ft = QgsFeature()
while layer.nextFeature(ft):
  tmp = ft.geometry().asPolyline()
  x = (tmp[0].x() + tmp[1].x())/2.0
  y = (tmp[0].y() + tmp[1].y())/2.0
  f = QgsFeature()
  f.setGeometry(QgsGeometry.fromPoint(QgsPoint(x, y)))
  pr.addFeatures([f])

QgsMapLayerRegistry.instance().addMapLayer( vl )
Надеюсь, вы знаете что такое Консоль Python в QGIS

Re: Преобразование линий в точки

Добавлено: 17 май 2012, 09:43
KartaBY
amuriy писал(а):KartaBY, если возможно выложить куда-то данные, могу помочь с точками (в GRASS). В QGIS без спец. программирования вы это не сделаете, как я понял.
Вот для примера один из кусков.
Мне требуется преобразовать каждый линейный объект в отдельную точку ( в середине линии) с сохранением всех атрибутов.

Re: Преобразование линий в точки

Добавлено: 17 май 2012, 10:12
KartaBY
Voltron писал(а): Две минуты, включая набор и проверку на тестовом слое
Спасибо что уделили время для моей проблемы,
но ... я не смог получить правильный точечный слой с помощью вашего кода. :(
Выше приложен пример моих шейпов, может дело в нем?
ps. Увы, в программировании я не силен. :oops:

Re: Преобразование линий в точки

Добавлено: 17 май 2012, 15:38
Voltron
KartaBY писал(а):Выше приложен пример моих шейпов, может дело в нем?
Да, проблема в исходных данных. У вас в слое часть объектов имеет тип LineString, а часть — MultiLinestring. Прогоните слой через Multipart to singleparts и будем вам счастье