PLT & WPT -> в SHP (python) готовый скрипт

Кроме QGIS
Ответить
ttestt
Участник
Сообщения: 82
Зарегистрирован: 22 сен 2008, 20:41
Репутация: 1

PLT & WPT -> в SHP (python) готовый скрипт

Сообщение ttestt » 24 мар 2010, 07:12

PLT это треки "в формате OZI-explorer".
WPT - путевые точки оттуда же

Все найденные (рекурсивно, начиная от пути запуска) PLT сначала переводит в два csv - один с точками другой с линиями.
Затем при помощи ogr2ogr конвертирует эти CSV соответственно в два шейпа.

Все найденные (рекурсивно, начиная от пути запуска) WPT сначала переводит в один общий csv - с точками.
Затем при помощи ogr2ogr конвертирует эти CSV соответственно шейп.

внимательно! данные со всех найденных файлов одного типа - пишет в один csv файл! csv создаются в рабочем пути (откуда запускали)

Испытано на Убунте 9.10

Сразу пожалуюсь что метод использования ogr2ogr без .vrt файла (описано тут, gis-lab.info/qa/csv2shp.html, поиск по тексту WKT) у меня не сработал.
Поэтому пришлось делать с .wrt

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

#!/usr/bin/python

import os
import string

workpath = os.getcwd()

search_path='./'

fcsvtl = open( 'csv_tline.csv', 'w' )
fcsvtl.write( "LINEW,COLOR,TEXT,SKIPVAL,TYPE,FILLSTYLE,FCOLOR,FILENAME,WKT" + "\n")
fcsvtp = open( 'csv_tpoint.csv', 'w' )
fcsvtp.write( "LAT,LONG,WKT,CODE,ALT,DATE" + "\n")
fcsvwp = open( 'csv_wpoint.csv', 'w' )
fcsvwp.write( "N,NAME,LAT,LONG,DATE,SYMBOL,STATUS,MAPFORMAT,FORECOLOR,BACKCOLOR,DESCR,PTRDIR,GARFORM,PROX,ALT,FONTSIZE,FONTSTYLE,SYMSIZE,PROXPOS,PROXTIME,PROXROUTE,FILEATTNAME,PROXFILENAME,PROXSYMNAME,WKT" + "\n")


for dir in os.walk(search_path):
    for file_name in dir[2]:
        file_name_lower = string.lower(file_name)
        tmpcwd = os.getcwd()
        if file_name_lower[-3:]=='plt':
            os.chdir(dir[0])
            fname = file_name[0:-4]
            fplt = open(file_name, 'r')
            pltlist = fplt.readlines()
            pltcnt = len( pltlist )
            thegeom = ""
            linetext = pltlist[4].rstrip("\r\n")
            ln_flds = string.split( linetext, ',')
            fcsvtl.write( ln_flds[1] +","+ ln_flds[2] +","+ ln_flds[3] +","+ ln_flds[4] +","+ ln_flds[5] +","+ ln_flds[6] +","+ ln_flds[7] +","+ fname +",\"MULTILINESTRING((" )
            for pltstrcnt in range(6, pltcnt):
                pointtext = pltlist[pltstrcnt].rstrip("\r\n")
                pt_flds = string.split( pointtext, ',')
                if pt_flds[2]=="1":
                    separator = "),("
                    print pointtext
                else:
                    separator = ","
                if thegeom!="":
                    thegeom = thegeom + separator + pt_flds[1] + " " + pt_flds[0]
                else:
                    thegeom = pt_flds[1] + " " + pt_flds[0]
                fcsvtp.write( pt_flds[0] +","+ pt_flds[1] +",\"POINT("+ pt_flds[1] +" "+ pt_flds[0] +")\","+ pt_flds[2] +","+ pt_flds[3] +","+ pt_flds[4] + "\n" )
            fcsvtl.write( thegeom + "))\"\n" )
        if file_name_lower[-3:]=='wpt':
            os.chdir(dir[0])
            fname = file_name[0:-4]
            fwpt = open(file_name, 'r')
            wptlist = fwpt.readlines()
            wptcnt = len( wptlist )
            for wptstrcnt in range(4, wptcnt):
                pointtext = wptlist[wptstrcnt].rstrip("\r\n")
                pt_flds = string.split( pointtext, ',')
                thegeom = pt_flds[3] + " " + pt_flds[2]
                for touchidx in range(0, 23):
                    fcsvwp.write( pt_flds[touchidx] + ',' )
                fcsvwp.write( ",\"POINT(" + thegeom + ")\"\n" )
        os.chdir(tmpcwd)

fcsvtl.close()
fcsvtp.close()
fcsvwp.close()

os.chdir(workpath)

fvrt = open('csv_tline.vrt', 'wt')
fvrt.write('<OGRVRTDataSource>\n'
    '    <OGRVRTLayer name="csv_tline">\n'
    '        <SrcDataSource>csv_tline.csv</SrcDataSource>\n'
    '        <GeometryType>wkbUnknown</GeometryType>\n'
    '        <GeometryField encoding="WKT" field="WKT"/>\n'
    '    </OGRVRTLayer>\n'
    '</OGRVRTDataSource>\n')
fvrt.close()

fvrt = open('csv_tpoint.vrt', 'wt')
fvrt.write('<OGRVRTDataSource>\n'
    '    <OGRVRTLayer name="csv_tpoint">\n'
    '        <SrcDataSource>csv_tpoint.csv</SrcDataSource>\n'
    '        <GeometryType>wkbUnknown</GeometryType>\n'
    '        <GeometryField encoding="WKT" field="WKT"/>\n'
    '    </OGRVRTLayer>\n'
    '</OGRVRTDataSource>\n')
fvrt.close()

fvrt = open('csv_wpoint.vrt', 'wt')
fvrt.write('<OGRVRTDataSource>\n'
    '    <OGRVRTLayer name=\"csv_wpoint\">\n'
    '        <SrcDataSource>csv_wpoint.csv</SrcDataSource>\n'
    '        <GeometryType>wkbUnknown</GeometryType>\n'
    '        <GeometryField encoding="WKT" field="WKT"/>\n'
    '    </OGRVRTLayer>\n'
    '</OGRVRTDataSource>\n')
fvrt.close()

os.system('ogr2ogr -overwrite -f "ESRI Shapefile" "csv_tpoint" "csv_tpoint.vrt"')
os.system('ogr2ogr -overwrite -f "ESRI Shapefile" "csv_tline" "csv_tline.vrt"')
os.system('ogr2ogr -overwrite -f "ESRI Shapefile" "csv_wpoint" "csv_wpoint.vrt"')
Описание формата:

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

#WPT:
#Field 1 : Number - this is the location in the array (max 1000), must be unique, usually start at 1 and increment. Can be set to -1 (minus 1) and the number will be auto generated.
#Field 2 : Name - the waypoint name, use the correct length name to suit the GPS type.
#Field 3 : Latitude - decimal degrees.
#Field 4 : Longitude - decimal degrees.
#Field 5 : Date - see Date Format below, if blank a preset date will be used
#Field 6 : Symbol - 0 to number of symbols in GPS
#Field 7 : Status - always set to 1
#Field 8 : Map Display Format
#Field 9 : Foreground Color (RGB value)
#Field 10 : Background Color (RGB value)
#Field 11 : Description (max 40), no commas
#Field 12 : Pointer Direction
#Field 13 : Garmin Display Format
#Field 14 : Proximity Distance - 0 is off any other number is valid 
#Field 15 : Altitude - in feet (-777 if not valid)
#Field 16 : Font Size - in points
#Field 17 : Font Style - 0 is normal, 1 is bold.
#Field 18 : Symbol Size - 17 is normal size
#Field 19 : Proximity Symbol Position
#Field 20 : Proximity Time 
#Field 21 : Proximity or Route or Both 
#Field 22 : File Attachment Name 
#Field 23 : Proximity File Attachment Name 
#Field 24 : Proximity Symbol Name

#PLT
#Line 1 : File type and version information 
#Line 2 : Geodetic Datum used for the Lat/Lon positions for each trackpoint 
#Line 3 : "Altitude is in feet" - just a reminder that the altitude is always stored in feet 
#Line 4 : Reserved for future use 
#Line 5 : multiple fields as below
#  Field 1 : always zero (0)
#  Field 2 : width of track plot line on screen - 1 or 2 are usually the best
#  Field 3 : track color (RGB)
#  Field 4 : track description (no commas allowed)
#  Field 5 : track skip value - reduces number of track points plotted, usually set to 1 
#  Field 6 : track type - 0 = normal , 10 = closed polygon , 20 = Alarm Zone
#  Field 7 : track fill style - 0 =bsSolid; 1 =bsClear; 2 =bsBdiagonal; 3 =bsFdiagonal; 4 =bsCross; 5 =bsDiagCross; 6 =bsHorizontal; 7 =bsVertical;
#  Field 8 : track fill color (RGB)
#Line 6 : Number of track points in the track, will be recalculated when reading file 
#Trackpoint data 
#One line per trackpoint 
#each field separated by a comma 
#non essiential fields need not be entered but comma separators must still be used (example ,,)
#defaults will be used for empty fields 
#Field 1 : Latitude - decimal degrees.
#Field 2 : Longitude - decimal degrees.
#Field 3 : Code - 0 if normal, 1 if break in track line
#Field 4 : Altitude in feet (-777 if not valid)
#Field 5 : Date - see Date Format below, if blank a preset date will be used
#Field 6 : Date as a string 
#Field 7 : Time as a string
#Note that OziExplorer reads the Date/Time from field 5, the date and time in fields 6 & 7 are ignored.
#Example
#-27.350436, 153.055540,1,-777,36169.6307194, 09-Jan-99, 3:08:14 
#-27.348610, 153.055867,0,-777,36169.6307194, 09-Jan-99, 3:08:14
Форматы остальных файлов OZI тут: www.realbiker.ru/OziExplorer/fileformats.shtml

Азимут
Новоприбывший
Сообщения: 12
Зарегистрирован: 13 июл 2011, 00:54
Репутация: 0

Re: PLT & WPT -> в SHP (python) готовый скрипт

Сообщение Азимут » 17 авг 2011, 11:21

У меня происходит в обратную сторону :)
Спасибо Максиму Дубинину за ссылку на Вашу тему.

Ответить

Вернуться в «Свободные, бесплатные, открытые ГИС»

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

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