Как из точек в CSV получить полигоны в SHP

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Ответить
Atom74
Новоприбывший
Сообщения: 7
Зарегистрирован: 11 авг 2015, 11:20
Репутация: 0

Как из точек в CSV получить полигоны в SHP

Сообщение Atom74 » 11 авг 2015, 11:45

Задача в следующем:
Есть трек работы сельхозтехники на поле(точки в WGS-84). У техники есть понятие ширины захвата.
Необходимо получить прямоугольные полигоны, шириной равной ширине захвата, соединяющие эти точки в SHP формате.
Как преобразовать в линии через ogs2ogs и VRT-драйвер разобрался.
Разобрался как рисовать полигоны через WKT.

Как прибавить к точке ширину захвата?
Может есть более "красивый" способ решения данной задачи, например полилиния с указанием её ширины?

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: Как из точек в CSV получить полигоны в SHP

Сообщение Ariki » 11 авг 2015, 12:03

В QGIS Вектор -> Геообработка -> Буферные зоны

Atom74
Новоприбывший
Сообщения: 7
Зарегистрирован: 11 авг 2015, 11:20
Репутация: 0

Re: Как из точек в CSV получить полигоны в SHP

Сообщение Atom74 » 13 авг 2015, 08:31

Да, то что надо, только бы в пакетном режиме, без установки и "тыкании" в QGIS.

Ставлю буферную зону равную 0.00005 получаю заливку в 11.1 метров, пополам 5.55 метров.
В чем указывается буферная зона?

Еще проблемка с линиями, необходимо получить не одну линию, а много линий(проходы техники). Признак новой линии есть у точки. Для формирования линии использовал модуль Points2One, но в нем нет такой возможности.
Может есть другой способ формировать линии или другой модуль?

Спасибо.

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

Re: Как из точек в CSV получить полигоны в SHP

Сообщение trir » 13 авг 2015, 08:41

SQL

Atom74
Новоприбывший
Сообщения: 7
Зарегистрирован: 11 авг 2015, 11:20
Репутация: 0

Re: Как из точек в CSV получить полигоны в SHP

Сообщение Atom74 » 13 авг 2015, 09:38

Например есть точки:

lat,lon,is_new
10,10,1
20,20,0
30,30,1
40,40,0

Как на SQL получить две линии?

Спасибо.

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

Re: Как из точек в CSV получить полигоны в SHP

Сообщение trir » 13 авг 2015, 09:50

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

Set CrLn = geometryfromtext(concat('LineString(',x(p1),' ',y(p1),',',x(CrP),' ',y(CrP),')'));
Пример создания базы данных
Через OGR загрузить данные в БД (PostGIS, MySQL MS SQL Server), а потом уже работать с ними на SQL

Atom74
Новоприбывший
Сообщения: 7
Зарегистрирован: 11 авг 2015, 11:20
Репутация: 0

Re: Как из точек в CSV получить полигоны в SHP

Сообщение Atom74 » 16 авг 2015, 11:53

После преобразования данных к такому виду:
lat,lon,is_new,id_line
10,10,1,1
20,20,0,1
30,30,1,2
40,40,0,2
Модуль Points2One с Group features by id_line нормально строит две линии.
Затем используя совет от Ariki "Вектор -> Геообработка -> Буферные зоны", получаем требуемый результат.

Теперь вопрос возможно ли все это проделать в пакетном режиме без запуска QGIS, например через ogr2ogr?

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

Re: Как из точек в CSV получить полигоны в SHP

Сообщение trir » 16 авг 2015, 12:04

SQL

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: Как из точек в CSV получить полигоны в SHP

Сообщение Ariki » 16 авг 2015, 12:48

Можно с помощью скрипта на Python:
https://pcjericks.github.io/py-gdalogr- ... ate-buffer

gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Как из точек в CSV получить полигоны в SHP

Сообщение gamm » 16 авг 2015, 13:47

Atom74 писал(а):Ставлю буферную зону равную 0.00005 получаю заливку в 11.1 метров, пополам 5.55 метров.
В чем указывается буферная зона?
в координатах, в вашем случае - в градусах (0.00005*111000=5.55, 111км о длина градуса на экваторе). А площади у вас будут в квадратных градусах :mrgreen:

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

Re: Как из точек в CSV получить полигоны в SHP

Сообщение trir » 16 авг 2015, 14:03

ST_Buffer

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

--A lighter but lamer circle
-- only 2 points per quarter circle is an octagon
--Below is a 100 meter octagon
-- Note coordinates are in NAD 83 long lat which we transform
to Mass state plane meter and then buffer to get measurements in meters;
SELECT ST_AsText(ST_Buffer(
ST_Transform(
ST_SetSRID(ST_MakePoint(-71.063526, 42.35785),4269), 26986),100,2)) As octagon;

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

SELECT ST_Buffer(
 ST_GeomFromText(
  'LINESTRING(50 50,150 150,150 50)'
 ), 10, 'endcap=flat join=round');
Изображение

Atom74
Новоприбывший
Сообщения: 7
Зарегистрирован: 11 авг 2015, 11:20
Репутация: 0

Re: Как из точек в CSV получить полигоны в SHP

Сообщение Atom74 » 17 авг 2015, 09:49

В каком пакете идет библиотека "ogr"?
Использую установщик от OsGeo4W64.
Хотел проверить скрипт https://pcjericks.github.io/py-gdalogr- ... ate-buffer

Ariki
Гуру
Сообщения: 731
Зарегистрирован: 12 янв 2011, 22:40
Репутация: 304
Ваше звание:

Re: Как из точек в CSV получить полигоны в SHP

Сообщение Ariki » 17 авг 2015, 12:37

Сам не пользуюсь OSGeo4W, но по идее вот это:
pkg-gdal-python

Atom74
Новоприбывший
Сообщения: 7
Зарегистрирован: 11 авг 2015, 11:20
Репутация: 0

Re: Как из точек в CSV получить полигоны в SHP

Сообщение Atom74 » 17 авг 2015, 19:44

Сейчас имеется shp файл с точками в атрибутах у которых есть номер принадлежности к линии, необходимо получить shp файл с линиями сгруппированными по номеру точек.

Возможно ли в пакетном режиме использовать модуль Points2One?

Как на Python использовать модуль Points2One?

Спасибо.

Atom74
Новоприбывший
Сообщения: 7
Зарегистрирован: 11 авг 2015, 11:20
Репутация: 0

Re: Как из точек в CSV получить полигоны в SHP

Сообщение Atom74 » 28 авг 2015, 14:43

Таким кодом получил из точек линии:

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

import ogr, os

def createLine(inputPointfn, outputLinefn):

# Open shape file with points
    inputds = ogr.Open(inputPointfn)
    inputlyr = inputds.GetLayer()

    shpdriver = ogr.GetDriverByName('ESRI Shapefile')
    if os.path.exists(outputLinefn):
        shpdriver.DeleteDataSource(outputLinefn)
    outputLineds = shpdriver.CreateDataSource(outputLinefn)

# Create Layer Multiline
    Linelyr = outputLineds.CreateLayer(outputLinefn, geom_type=ogr.wkbMultiLineString)
    featureDefn = Linelyr.GetLayerDefn()
    outFeature = ogr.Feature(featureDefn)

    oMultiLine = ogr.Geometry(ogr.wkbMultiLineString)
    oLine = ogr.Geometry(ogr.wkbLineString)

    for feature in inputlyr:
        oPoint = feature.GetGeometryRef()
	if feature.GetField("field_4") == "1" :
	    oMultiLine.AddGeometry(oLine)
	    oLine = ogr.Geometry(ogr.wkbLineString)
	    oLine.AddPoint(oPoint.GetX(),oPoint.GetY());
	else:
	    oLine.AddPoint(oPoint.GetX(),oPoint.GetY());


    oMultiLine.AddGeometry(oLine)
    outFeature.SetGeometry(oMultiLine)
    Linelyr.CreateFeature(outFeature)


def main(inputPointfn, outputLinefn):
    createLine(inputPointfn, outputLinefn)


if __name__ == "__main__":
    inputPointfn = 'corgon_point.shp'
    outputLinefn = 'corgon_line.shp'

    main(inputPointfn, outputLinefn)
Затем формируем буферные зоны:

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

import ogr, os

def createBuffer(inputfn, outputBufferfn, bufferDist):
    inputds = ogr.Open(inputfn)
    inputlyr = inputds.GetLayer()

    shpdriver = ogr.GetDriverByName('ESRI Shapefile')
    if os.path.exists(outputBufferfn):
        shpdriver.DeleteDataSource(outputBufferfn)
    outputBufferds = shpdriver.CreateDataSource(outputBufferfn)
    bufferlyr = outputBufferds.CreateLayer(outputBufferfn, geom_type=ogr.wkbPolygon)
    featureDefn = bufferlyr.GetLayerDefn()

    for feature in inputlyr:
        ingeom = feature.GetGeometryRef()
        geomBuffer = ingeom.Buffer(bufferDist)
	outFeature = ogr.Feature(featureDefn)
        outFeature.SetGeometry(geomBuffer)
        bufferlyr.CreateFeature(outFeature)


def main(inputfn, outputBufferfn, bufferDist):
    createBuffer(inputfn, outputBufferfn, bufferDist)


if __name__ == "__main__":
    inputfn = 'corgon_line.shp'
    outputBufferfn = 'corgon_poligon.shp'
    bufferDist = 0.000135

    main(inputfn, outputBufferfn, bufferDist)
Как сделать чтобы буферные зоны не сливались в один объект при наложении буферных зон?

Ответить

Вернуться в «QGIS»

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

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