gps2shp folders [points2points\line]

oleg
Завсегдатай
Сообщения: 460
Зарегистрирован: 03 фев 2005, 11:46
Репутация: 15
Контактная информация:

gps2shp folders [points2points\line]

Сообщение oleg » 07 июл 2011, 19:41

Привет!

Прошу помощи с такой задачей. Есть структура папок, в подкаталогах (на 2 уровня вниз) лежат gps-треки. Нужно их массово конвертнуть в шейпы (выход в родные папочки). Arc10 или OpenSoft.

Спасибо.

UPD: добавил в название темы "[points2points\line]"
Последний раз редактировалось oleg 11 авг 2011, 09:36, всего редактировалось 1 раз.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: gps2shp folders

Сообщение Александр Мурый » 07 июл 2011, 21:59

Попробуйте один из вариантов:
1) gpx2shp + bat-файл (или Python или ??)
2) ogr2ogr + bat-файл (или Python или ??)
3) GPSBabel + bat-файл (или Python или ??)
Поищите в сети, может есть готовые скрипты.
Редактор материалов, модератор форума

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: gps2shp folders

Сообщение Denis Rykov » 08 июл 2011, 06:06

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

import os,fnmatch

def main():
rootPath = 'c:/personal/gpx'
for root, dirs, files in os.walk(rootPath):
gpxfiles = fnmatch.filter(files, '*.gpx')
if (len(gpxfiles) != 0):
for filename in gpxfiles:
os.system('ogr2ogr '+os.path.join(root,filename)+'.shp '+os.path.join(root,filename)+' tracks')
return 0

if __name__ == '__main__':
main()
Spatial is now, more than ever, just another column- The Geometry Column.

oleg
Завсегдатай
Сообщения: 460
Зарегистрирован: 03 фев 2005, 11:46
Репутация: 15
Контактная информация:

Re: gps2shp folders

Сообщение oleg » 12 июл 2011, 08:59

Спасибо! Вижу, что нужно установить gdal. По синтаксису вижу, что питон. Подскажите, пожалуйста, последовательность действий успешного использования этото скрипта или где смотреть.

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: gps2shp folders

Сообщение Voltron » 12 июл 2011, 10:57

Ставим gdal c привязками к Python и сам Python. Для Windows проще всего сделать это через уставновщик OSGeo4W: пакеты gdal и gdal-python (остальное подтянется по зависимостям).

Код копируем и вставляем в новый текстовый документ, например, при помощи Блокнота. В строке

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

rootPath = 'c:/personal/gpx'
исправляем путь на свой. Сохраняем как gpx2shp.py или под другим именем. Открываем командную строку OSGeo4W, переходим в каталог с сохраненным скриптом и выполняем

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

python gpx2shp.py

oleg
Завсегдатай
Сообщения: 460
Зарегистрирован: 03 фев 2005, 11:46
Репутация: 15
Контактная информация:

Re: gps2shp folders

Сообщение oleg » 12 июл 2011, 21:00

Спасибо за помощь! Делюсь успехами.
Попробовал – шейпы создались, но пустые (см.скрин ниже).

Есть подозрения, что из-за проблем с типом/структурой данных.
Выяснил дополнительные условия – текущий *.gpx был получен путём конвертации из *.gps.

Образец строки *.gps ниже
50.85953,28.98493,181.0,0.8,1,11,185.8,-6.1,092007.000,180411

Приаттачил к сообщению zip-пример *.gps, *.gpx, структуры папок, скрипта.
Посмотрите, пожалуйста, если будет время.

- Как Вы думаете, проблемы могут быть из-за неверной структуры *.gpx?
- Возможно ли конвертировать в шейп сразу из подобных *.gps?
- Возможно проблема в типе точка/линия?

Спасибо.
Вложения
test.zip
(115.92 КБ) 554 скачивания
gps2shp.png
gps2shp.png (15.79 КБ) 24387 просмотров

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: gps2shp folders

Сообщение Александр Мурый » 12 июл 2011, 23:37

В файле 2011418.gpx содержится 3350 точек ("waypoints") и нет "track" или "route"-точек.
Такой командой нормально конвертируется в точечный шейп:

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

ogr2ogr -f "ESRI Shapefile" -lco SHPT="POINTZ"  2011418.shp 2011418.gpx
Редактор материалов, модератор форума

oleg
Завсегдатай
Сообщения: 460
Зарегистрирован: 03 фев 2005, 11:46
Репутация: 15
Контактная информация:

Re: gps2shp folders

Сообщение oleg » 13 июл 2011, 15:23

Да, спасибо! Так конвертирует. Помогите, пожалуйста, автоматизировать (модернизировать скрипт выше). Если есть вариант сразу либо в несколько этапов конвертировать в *.shp из *.gps (исходные данные) - буду благодарен за варианты решения.

UPD: [del]*.gpx[/del] *.gps
Последний раз редактировалось oleg 13 июл 2011, 19:11, всего редактировалось 1 раз.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: gps2shp folders

Сообщение Denis Rykov » 13 июл 2011, 16:01

oleg писал(а):Помогите, пожалуйста, автоматизировать (модернизировать скрипт выше). Если есть вариант сразу либо в несколько этапов конвертировать в *.shp из *.gpx (исходные данные) - буду благодарен за варианты решения.
Не понял, вы же сами написали, что всё работает и из *.gpx в *.shp конвертирует.
Spatial is now, more than ever, just another column- The Geometry Column.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: gps2shp folders

Сообщение Александр Мурый » 13 июл 2011, 17:18

В каждом GPX несколько слоев, все они имеют разную геометрию, некоторые пустые:

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

Layer name: waypoints
Geometry: Point
Feature Count: 3350
--
Layer name: routes
Geometry: Line String
Feature Count: 0
--
Layer name: tracks
Geometry: Multi Line String
Feature Count: 0
--
Layer name: route_points
Geometry: Point
Feature Count: 0
--
Layer name: track_points
Geometry: Point
Feature Count: 0


Нужно, чтобы скрипт проверял наличие "ненулевых" слоев и записывал только их в шейпы с соответствующей геометрией.
Если убрать из 9 строки предыдущего скрипта "' +tracks", то будут писаться все слои, и "нулевые" тоже.

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


import os,fnmatch

def main():
rootPath = 'нужная_папка'
for root, dirs, files in os.walk(rootPath):
gpxfiles = fnmatch.filter(files, '*.gpx')
if (len(gpxfiles) != 0):
for filename in gpxfiles:
os.system('ogr2ogr '+os.path.join(root,filename)+'.shp '+os.path.join(root,filename))

return 0

if __name__ == '__main__':
main()

(заменить 'нужная_папка' на нужную папку :))

В общем, задача: отсеять "нулевые" слои, "ненулевые" слои выбрать с помощью ogr2ogr -select
Редактор материалов, модератор форума

oleg
Завсегдатай
Сообщения: 460
Зарегистрирован: 03 фев 2005, 11:46
Репутация: 15
Контактная информация:

Re: gps2shp folders

Сообщение oleg » 13 июл 2011, 19:06

_DR_ писал(а):
oleg писал(а):Помогите, пожалуйста, автоматизировать (модернизировать скрипт выше). Если есть вариант сразу либо в несколько этапов конвертировать в *.shp из *.gpx (исходные данные) - буду благодарен за варианты решения.
Не понял, вы же сами написали, что всё работает и из *.gpx в *.shp конвертирует.
Прошу прощения, - из *.gps в *.shp

Образец *.gps (X,Y, ...)
50.5049667,29.510525,348.0,1.3,1,9,278.1,-4.9,114245.000,180411
50.5048217,29.510935,349.0,1.3,1,9,278.4,-4.9,114247.000,180411
50.504545,29.512105,354.0,1.3,1,9,277.7,-4.9,114253.000,180411

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: gps2shp folders

Сообщение Denis Rykov » 14 июл 2011, 06:34

Судя по формату *.gps файлов, в *.gpx присутствуют только waypoint-ы, поэтому используем следующую модификацию скрипта и получаем на выходе ненулевые шейпы:

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

import os,fnmatch

def main():
rootPath = 'c:/personal/tmp/test/dir0/'
for root, dirs, files in os.walk(rootPath):
gpxfiles = fnmatch.filter(files, '*.gpx')
if (len(gpxfiles) != 0):
for filename in gpxfiles:
os.system('ogr2ogr '+os.path.join(root,filename)[:-4]+'.shp '+os.path.join(root,filename)+' waypoints')
return 0

if __name__ == '__main__':
main()


А вот так можно пакетно сконвертировать *.gps в шейпы:

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

from __future__ import with_statement
import os,fnmatch
def main():
rootPath = 'c:/personal/tmp/test/dir0/'
for root, dirs, files in os.walk(rootPath):
gpsfiles = fnmatch.filter(files, '*.gps')
if (len(gpsfiles) != 0):
for filename in gpsfiles:
with file(os.path.join(root,filename)[:-4]+'.csv', "wb") as out:
out.write('x,y,n3,n4,n5,n6,n7,n8,n9,n10\n')
for line in (x.strip() for x in file(os.path.join(root,filename)).readlines()):
out.write(line+'\n')
shp = os.path.join(os.path.join(root,filename))[:-4] + ".shp"
fvrt = open('work.vrt', 'wt')
fvrt.write('<OGRVRTDataSource>\n'
'<OGRVRTLayer name="' + filename[:-4] + '">\n'
'<SrcDataSource>' + os.path.join(root,filename)[:-4]+'.csv' + '</SrcDataSource>\n'
'<GeometryType>wkbPoint</GeometryType>\n'
'<LayerSRS>WGS84</LayerSRS>\n'
'<GeometryField encoding="PointFromColumns" x="y" y="x"/>\n'
'</OGRVRTLayer>\n'
'</OGRVRTDataSource>\n')
fvrt.close()
cmd = 'ogr2ogr -overwrite ' + shp + ' work.vrt'
print "converting from ......" + filename
os.system(cmd)
os.remove("work.vrt")
os.remove(os.path.join(root,filename)[:-4]+'.csv')
return 0

if __name__ == '__main__':
main()
Spatial is now, more than ever, just another column- The Geometry Column.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: gps2shp folders

Сообщение Александр Мурый » 14 июл 2011, 14:19

Написал shell-скрипт в тему.
http://blogs.gis-lab.info/amuriy/2011/0 ... ch_script/
Редактор материалов, модератор форума

ericsson
Гуру
Сообщения: 3321
Зарегистрирован: 27 июл 2009, 19:26
Репутация: 748
Ваше звание: Вредитель полей

Re: gps2shp folders

Сообщение ericsson » 14 июл 2011, 18:54

Хм, а просто gpsbabel с драйвером xcsv (чтобы превратить .gps в .gpx) и ogr не хватит для этого?

oleg
Завсегдатай
Сообщения: 460
Зарегистрирован: 03 фев 2005, 11:46
Репутация: 15
Контактная информация:

Re: gps2shp folders

Сообщение oleg » 20 июл 2011, 17:16

ericsson писал(а):Хм, а просто gpsbabel с драйвером xcsv (чтобы превратить .gps в .gpx) и ogr не хватит для этого?
В gpsbabel пробовал поштучно - всё хорошо. Подскажите, пожалуйста, путь автоматизации, если он есть.
_DR_ писал(а):А вот так можно пакетно сконвертировать *.gps в шейпы:
Спасибо большое, всё работает!

Ответить

Вернуться в «GDAL/OGR»

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

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