Страница 1 из 2
gps2shp folders [points2points\line]
Добавлено: 07 июл 2011, 19:41
oleg
Привет!
Прошу помощи с такой задачей. Есть структура папок, в подкаталогах (на 2 уровня вниз) лежат gps-треки. Нужно их массово конвертнуть в шейпы (выход в родные папочки). Arc10 или OpenSoft.
Спасибо.
UPD: добавил в название темы "[points2points\line]"
Re: gps2shp folders
Добавлено: 07 июл 2011, 21:59
Александр Мурый
Попробуйте один из вариантов:
1) gpx2shp + bat-файл (или Python или ??)
2) ogr2ogr + bat-файл (или Python или ??)
3) GPSBabel + bat-файл (или Python или ??)
Поищите в сети, может есть готовые скрипты.
Re: gps2shp folders
Добавлено: 08 июл 2011, 06:06
Denis Rykov
Код: Выделить всё
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()
Re: gps2shp folders
Добавлено: 12 июл 2011, 08:59
oleg
Спасибо! Вижу, что нужно установить gdal. По синтаксису вижу, что питон. Подскажите, пожалуйста, последовательность действий успешного использования этото скрипта или где смотреть.
Re: gps2shp folders
Добавлено: 12 июл 2011, 10:57
Voltron
Ставим gdal c привязками к Python и сам Python. Для Windows проще всего сделать это через уставновщик OSGeo4W: пакеты gdal и gdal-python (остальное подтянется по зависимостям).
Код копируем и вставляем в новый текстовый документ, например, при помощи Блокнота. В строке
исправляем путь на свой. Сохраняем как gpx2shp.py или под другим именем. Открываем командную строку OSGeo4W, переходим в каталог с сохраненным скриптом и выполняем
Re: gps2shp folders
Добавлено: 12 июл 2011, 21:00
oleg
Спасибо за помощь! Делюсь успехами.
Попробовал – шейпы создались, но пустые (см.скрин ниже).
Есть подозрения, что из-за проблем с типом/структурой данных.
Выяснил дополнительные условия – текущий *.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?
- Возможно проблема в типе точка/линия?
Спасибо.
Re: gps2shp folders
Добавлено: 12 июл 2011, 23:37
Александр Мурый
В файле 2011418.gpx содержится 3350 точек ("waypoints") и нет "track" или "route"-точек.
Такой командой нормально конвертируется в точечный шейп:
Код: Выделить всё
ogr2ogr -f "ESRI Shapefile" -lco SHPT="POINTZ" 2011418.shp 2011418.gpx
Re: gps2shp folders
Добавлено: 13 июл 2011, 15:23
oleg
Да, спасибо! Так конвертирует. Помогите, пожалуйста, автоматизировать (модернизировать скрипт выше). Если есть вариант сразу либо в несколько этапов конвертировать в *.shp из *.gps (исходные данные) - буду благодарен за варианты решения.
UPD: [del]*.gpx[/del] *.gps
Re: gps2shp folders
Добавлено: 13 июл 2011, 16:01
Denis Rykov
oleg писал(а):Помогите, пожалуйста, автоматизировать (модернизировать скрипт выше). Если есть вариант сразу либо в несколько этапов конвертировать в *.shp из *.gpx (исходные данные) - буду благодарен за варианты решения.
Не понял, вы же сами написали, что всё работает и из *.gpx в *.shp конвертирует.
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
Re: gps2shp folders
Добавлено: 13 июл 2011, 19:06
oleg
_DR_ писал(а):oleg писал(а):Помогите, пожалуйста, автоматизировать (модернизировать скрипт выше). Если есть вариант сразу либо в несколько этапов конвертировать в *.shp из *.gpx (исходные данные) - буду благодарен за варианты решения.
Не понял, вы же сами написали, что всё работает и из *.gpx в *.shp конвертирует.
Прошу прощения, - из *.gp
s в *.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
Re: gps2shp folders
Добавлено: 14 июл 2011, 06:34
Denis Rykov
Судя по формату *.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()
Re: gps2shp folders
Добавлено: 14 июл 2011, 14:19
Александр Мурый
Re: gps2shp folders
Добавлено: 14 июл 2011, 18:54
ericsson
Хм, а просто gpsbabel с драйвером xcsv (чтобы превратить .gps в .gpx) и ogr не хватит для этого?
Re: gps2shp folders
Добавлено: 20 июл 2011, 17:16
oleg
ericsson писал(а):Хм, а просто gpsbabel с драйвером xcsv (чтобы превратить .gps в .gpx) и ogr не хватит для этого?
В gpsbabel пробовал поштучно - всё хорошо. Подскажите, пожалуйста, путь автоматизации, если он есть.
_DR_ писал(а):А вот так можно пакетно сконвертировать *.gps в шейпы:
Спасибо большое, всё работает!