dersblog

Yol Dosyaları, GPX Formatı

Wikiloc gibi servisler yol tariflerini çoğunlukla GPX formatında paylaşırlar. Paket gpxpy ile bu dosyaları işleyebiliriz. Bu yazıyla aynı dizinde yol1.gpx dosyası var, içeriği,

from bs4 import BeautifulSoup
bs = BeautifulSoup(open("yol1.gpx"), 'xml')
pretty_xml = bs.prettify()
print(pretty_xml[:900])
<?xml version="1.0" encoding="utf-8"?>
<gpx creator="Wikiloc - https://www.wikiloc.com" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
 <metadata>
  <name>
   Wikiloc - Harita1
  </name>
  <author>
   <name>
    Kullanici1
   </name>
   <link href="https://www.wikiloc.com/wikiloc/user.do?id=2088213">
    <text>
     Kullanici1 on Wikiloc
    </text>
   </link>
  </author>
  <link href="https://www.wikiloc.com/hiking-trails/falan-filan">
   <text>
    Yer1 on Wikiloc
   </text>
  </link>
  <time>
   2016-09-21T19:40:58Z
  </time>
 </metadata>
 <trk>
  <name>
   Yer1
  </name>
  <cmt/>
  <desc/>
  <trkseg>
   <trkpt lat="40.964344" lon="41.010343">
    <ele>
     1983.363
    </ele>
    <time>
     2022-08-10T00:09:01Z
    </time>

Kordinat listesini bu dosyadan şöyle çıkartabiliriz,

import gpxpy, gpxpy.gpx
gpx = gpxpy.parse(open("yol1.gpx").read())
points = []
for track in gpx.tracks:
    for segment in track.segments:
        for point in segment.points:
            lat,lon = point.latitude, point.longitude
            points.append([lat,lon])
print (len(points))
print (points[:4])
170
[[40.964344, 41.010343], [40.964344, 41.010344], [40.964344, 41.010344], [40.964325, 41.010299]]

Yeni bir GPX dosyası sıfırdan yaratmak için,

gpx = gpxpy.gpx.GPX()

gpx_track = gpxpy.gpx.GPXTrack()
gpx.tracks.append(gpx_track)

gpx_segment = gpxpy.gpx.GPXTrackSegment()
gpx_track.segments.append(gpx_segment)

gpx_segment.points.append(gpxpy.gpx.GPXTrackPoint(40.964344, 41.010343, elevation=1234))
gpx_segment.points.append(gpxpy.gpx.GPXTrackPoint(40.964344, 41.010344, elevation=1235))
gpx_segment.points.append(gpxpy.gpx.GPXTrackPoint(40.964325, 41.010299, elevation=1236))

print('GPX:', gpx.to_xml())
Created GPX: <?xml version="1.0" encoding="UTF-8"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="gpx.py -- https://github.com/tkrajina/gpxpy">
  <trk>
    <trkseg>
      <trkpt lat="40.964344" lon="41.010343">
        <ele>1234</ele>
      </trkpt>
      <trkpt lat="40.964344" lon="41.010344">
        <ele>1235</ele>
      </trkpt>
      <trkpt lat="40.964325" lon="41.010299">
        <ele>1236</ele>
      </trkpt>
    </trkseg>
  </trk>
</gpx>

Eğer birden fazla yol parçası (track) var ise, bunları yeni

... = gpxpy.gpx.GPXTrack()
gpx.tracks.append(..)

çağrıları ile ekleyebiliriz. Eğer birden fazla yol parçasını geziyorsak, üstteki

for track in gpx.tracks:
    for segment in track.segments:
       ..

döngüdeki dış döngü tüm yol parçalarını gezecektir.

Kaynaklar

[1] PyPI


Yukarı