Profil Ketinggian dengan label pada titik jalan (QGIS, Python)

Aug 30 2020

Saya ingin memplot banyak profil ketinggian dengan label pada titik arah tertentu (Tempat Menarik). Pada akhirnya akan terlihat seperti ini:

Atau seperti ini:https://www.birdandhike.com/Hike/Mt_Char/Sawmill_Big/maps-sb/Sawmill_Big_Prof.htm

DEM dan Trek (gpx dan format lain) sudah ada. Sekarang saya ingin membuat profil ketinggian dengan nama menggunakan QGIS dan skrip.

Saya sudah memeriksa plugin profil di QGIS tetapi tidak ada yang dapat menampilkan nama titik lewat tertentu.

Apakah Anda tahu solusi mudah untuk mencapai ini?

EDIT1: Trek gpx terlihat seperti ini. Saya ingin nama Fitur WPT (mis. "Lembah", "mulai", "puncak") tertulis di profil ketinggian

<?xml version="1.0" encoding="UTF-8"?>
<!-- track-length = 4644 filtered ascend = 159 plain-ascend = -764 cost=12636 energy=.0kwh time=2h 9m 17s -->
<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" 
 creator="BRouter-1.6.1" version="1.1">
 <wpt lon="6.005273" lat="44.910205">
  <name>start</name>
 </wpt>
 <wpt lon="6.000938" lat="44.907256">
  <name>valley</name>
 </wpt>
 <wpt lon="6.000209" lat="44.904671">
  <name>peak1</name>
 </wpt>
 <wpt lon="5.984759" lat="44.905219">
  <name>peak2</name>
 </wpt>
 <wpt lon="5.988064" lat="44.915039">
  <name>end</name>
 </wpt>
 <trk>
  <name>hike</name>
  <trkseg>
   <trkpt lon="6.005280" lat="44.910300"><ele>2399.25</ele></trkpt>
   <trkpt lon="6.005140" lat="44.910209"><ele>2397.5</ele></trkpt>
   <trkpt lon="6.004897" lat="44.909971"><ele>2395.0</ele></trkpt>
   <trkpt lon="6.004762" lat="44.909907"><ele>2396.0</ele></trkpt>
   <trkpt lon="6.004484" lat="44.909822"><ele>2399.0</ele></trkpt>
   <trkpt lon="6.004411" lat="44.909778"><ele>2399.5</ele></trkpt>
   <trkpt lon="6.004219" lat="44.909626"><ele>2400.25</ele></trkpt>
   <trkpt lon="6.004030" lat="44.909456"><ele>2403.5</ele></trkpt>
   <trkpt lon="6.003947" lat="44.909340"><ele>2404.75</ele></trkpt>
   <trkpt lon="6.003913" lat="44.909181"><ele>2403.75</ele></trkpt>
   <trkpt lon="6.003748" lat="44.908935"><ele>2405.5</ele></trkpt>
   <trkpt lon="6.003613" lat="44.908836"><ele>2408.5</ele></trkpt>
   <trkpt lon="6.003452" lat="44.908730"><ele>2411.75</ele></trkpt>
   <trkpt lon="6.002808" lat="44.908451"><ele>2429.75</ele></trkpt>
   <trkpt lon="6.002544" lat="44.908326"><ele>2436.25</ele></trkpt>
   <trkpt lon="6.002435" lat="44.908241"><ele>2440.75</ele></trkpt>
   <trkpt lon="6.002347" lat="44.908140"><ele>2444.5</ele></trkpt>
   <trkpt lon="6.002221" lat="44.908055"><ele>2450.5</ele></trkpt>
   <trkpt lon="6.002068" lat="44.907923"><ele>2456.0</ele></trkpt>
   <trkpt lon="6.001889" lat="44.907816"><ele>2462.75</ele></trkpt>
   <trkpt lon="6.001722" lat="44.907700"><ele>2467.75</ele></trkpt>
   <trkpt lon="6.001472" lat="44.907585"><ele>2469.5</ele></trkpt>
   <trkpt lon="6.001398" lat="44.907565"><ele>2470.0</ele></trkpt>
   <trkpt lon="6.001246" lat="44.907489"><ele>2470.5</ele></trkpt>
   <trkpt lon="6.001149" lat="44.907422"><ele>2473.0</ele></trkpt>
   <trkpt lon="6.001003" lat="44.907193"><ele>2478.5</ele></trkpt>
   <trkpt lon="6.000930" lat="44.907129"><ele>2480.75</ele></trkpt>
   <trkpt lon="6.000901" lat="44.907128"><ele>2481.25</ele></trkpt>
   <trkpt lon="6.000833" lat="44.907182"><ele>2481.5</ele></trkpt>
   <trkpt lon="6.000867" lat="44.907061"><ele>2482.75</ele></trkpt>
   <trkpt lon="6.000851" lat="44.906900"><ele>2485.25</ele></trkpt>
   <trkpt lon="6.000802" lat="44.906802"><ele>2485.75</ele></trkpt>
   <trkpt lon="6.000807" lat="44.906625"><ele>2490.75</ele></trkpt>
   <trkpt lon="6.000757" lat="44.906530"><ele>2495.75</ele></trkpt>
   <trkpt lon="6.000682" lat="44.906473"><ele>2497.25</ele></trkpt>
   <trkpt lon="6.000661" lat="44.906423"><ele>2500.0</ele></trkpt>
   <trkpt lon="6.000669" lat="44.906386"><ele>2502.75</ele></trkpt>
   <trkpt lon="6.000735" lat="44.906334"><ele>2508.0</ele></trkpt>
   <trkpt lon="6.000799" lat="44.906164"><ele>2521.25</ele></trkpt>
   <trkpt lon="6.000794" lat="44.906026"><ele>2530.25</ele></trkpt>
   <trkpt lon="6.000741" lat="44.905909"><ele>2536.75</ele></trkpt>
   <trkpt lon="6.000755" lat="44.905811"><ele>2542.25</ele></trkpt>
   <trkpt lon="6.000830" lat="44.905601"><ele>2543.75</ele></trkpt>
   <trkpt lon="6.000800" lat="44.905520"><ele>2543.75</ele></trkpt>
   <trkpt lon="6.000422" lat="44.905142"><ele>2549.25</ele></trkpt>
   <trkpt lon="6.000330" lat="44.905084"><ele>2552.0</ele></trkpt>
   <trkpt lon="6.000293" lat="44.904982"><ele>2554.0</ele></trkpt>
   <trkpt lon="6.000324" lat="44.904927"><ele>2550.5</ele></trkpt>
   <trkpt lon="6.000328" lat="44.904885"><ele>2548.25</ele></trkpt>
   <trkpt lon="6.000324" lat="44.904927"><ele>2550.5</ele></trkpt>
   <trkpt lon="6.000293" lat="44.904982"><ele>2554.0</ele></trkpt>
   <trkpt lon="6.000330" lat="44.905084"><ele>2552.0</ele></trkpt>
   <trkpt lon="6.000422" lat="44.905142"><ele>2549.25</ele></trkpt>
   <trkpt lon="6.000800" lat="44.905520"><ele>2543.75</ele></trkpt>
   <trkpt lon="6.000830" lat="44.905601"><ele>2543.75</ele></trkpt>
   <trkpt lon="6.000755" lat="44.905811"><ele>2542.25</ele></trkpt>
   <trkpt lon="6.000741" lat="44.905909"><ele>2536.75</ele></trkpt>
   <trkpt lon="6.000794" lat="44.906026"><ele>2530.25</ele></trkpt>
   <trkpt lon="6.000799" lat="44.906164"><ele>2521.25</ele></trkpt>
   <trkpt lon="6.000735" lat="44.906334"><ele>2508.0</ele></trkpt>
   <trkpt lon="6.000669" lat="44.906386"><ele>2502.75</ele></trkpt>
   <trkpt lon="6.000661" lat="44.906423"><ele>2500.0</ele></trkpt>
   <trkpt lon="6.000682" lat="44.906473"><ele>2497.25</ele></trkpt>
   <trkpt lon="6.000757" lat="44.906530"><ele>2495.75</ele></trkpt>
   <trkpt lon="6.000807" lat="44.906625"><ele>2490.75</ele></trkpt>
   <trkpt lon="6.000802" lat="44.906802"><ele>2485.75</ele></trkpt>
   <trkpt lon="6.000851" lat="44.906900"><ele>2485.25</ele></trkpt>
   <trkpt lon="6.000867" lat="44.907061"><ele>2482.75</ele></trkpt>
   <trkpt lon="6.000833" lat="44.907182"><ele>2481.5</ele></trkpt>
   <trkpt lon="6.000811" lat="44.907142"><ele>2481.25</ele></trkpt>
   <trkpt lon="6.000757" lat="44.907090"><ele>2479.75</ele></trkpt>
   <trkpt lon="6.000693" lat="44.907132"><ele>2476.75</ele></trkpt>
   <trkpt lon="6.000655" lat="44.907074"><ele>2476.25</ele></trkpt>
   <trkpt lon="6.000438" lat="44.906983"><ele>2469.75</ele></trkpt>
   <trkpt lon="6.000253" lat="44.906933"><ele>2464.25</ele></trkpt>
   <trkpt lon="6.000092" lat="44.906899"><ele>2459.5</ele></trkpt>
   <trkpt lon="5.999980" lat="44.906887"><ele>2455.5</ele></trkpt>
   <trkpt lon="6.000002" lat="44.906966"><ele>2454.25</ele></trkpt>
   <trkpt lon="5.999879" lat="44.906957"><ele>2448.5</ele></trkpt>
   <trkpt lon="5.999941" lat="44.907034"><ele>2449.5</ele></trkpt>
   <trkpt lon="5.999770" lat="44.906997"><ele>2442.25</ele></trkpt>
   <trkpt lon="5.999880" lat="44.907079"><ele>2445.25</ele></trkpt>
   <trkpt lon="5.999554" lat="44.906959"><ele>2432.5</ele></trkpt>
   <trkpt lon="5.999477" lat="44.906917"><ele>2429.5</ele></trkpt>
   <trkpt lon="5.999288" lat="44.906888"><ele>2420.5</ele></trkpt>
   <trkpt lon="5.999219" lat="44.906853"><ele>2417.75</ele></trkpt>
   <trkpt lon="5.999168" lat="44.906804"><ele>2415.75</ele></trkpt>
   <trkpt lon="5.999093" lat="44.906804"><ele>2412.75</ele></trkpt>
   <trkpt lon="5.999041" lat="44.906820"><ele>2410.5</ele></trkpt>
   <trkpt lon="5.998836" lat="44.907070"><ele>2398.75</ele></trkpt>
   <trkpt lon="5.998813" lat="44.907143"><ele>2397.0</ele></trkpt>
   <trkpt lon="5.998818" lat="44.907243"><ele>2395.75</ele></trkpt>
   <trkpt lon="5.998837" lat="44.907282"><ele>2395.75</ele></trkpt>
   <trkpt lon="5.998813" lat="44.907334"><ele>2394.25</ele></trkpt>
   <trkpt lon="5.998765" lat="44.907349"><ele>2392.0</ele></trkpt>
   <trkpt lon="5.998554" lat="44.907373"><ele>2383.75</ele></trkpt>
   <trkpt lon="5.998392" lat="44.907353"><ele>2378.0</ele></trkpt>
   <trkpt lon="5.998365" lat="44.907404"><ele>2376.25</ele></trkpt>
   <trkpt lon="5.998311" lat="44.907396"><ele>2374.5</ele></trkpt>
   <trkpt lon="5.998195" lat="44.907534"><ele>2369.0</ele></trkpt>
   <trkpt lon="5.998130" lat="44.907536"><ele>2366.5</ele></trkpt>
   <trkpt lon="5.998117" lat="44.907497"><ele>2366.0</ele></trkpt>
   <trkpt lon="5.998067" lat="44.907483"><ele>2364.5</ele></trkpt>
   <trkpt lon="5.997989" lat="44.907420"><ele>2362.5</ele></trkpt>
   <trkpt lon="5.997918" lat="44.907414"><ele>2360.0</ele></trkpt>
   <trkpt lon="5.997902" lat="44.907449"><ele>2359.0</ele></trkpt>
   <trkpt lon="5.997845" lat="44.907478"><ele>2356.5</ele></trkpt>
   <trkpt lon="5.997517" lat="44.907407"><ele>2345.75</ele></trkpt>
   <trkpt lon="5.997472" lat="44.907390"><ele>2344.25</ele></trkpt>
   <trkpt lon="5.997429" lat="44.907355"><ele>2343.0</ele></trkpt>
   <trkpt lon="5.997311" lat="44.907299"><ele>2338.75</ele></trkpt>
   <trkpt lon="5.997230" lat="44.907231"><ele>2336.25</ele></trkpt>
   <trkpt lon="5.997098" lat="44.907086"><ele>2333.25</ele></trkpt>
   <trkpt lon="5.996286" lat="44.906681"><ele>2311.5</ele></trkpt>
   <trkpt lon="5.996041" lat="44.906621"><ele>2306.0</ele></trkpt>
   <trkpt lon="5.995998" lat="44.906603"><ele>2305.25</ele></trkpt>
   <trkpt lon="5.995972" lat="44.906573"><ele>2305.5</ele></trkpt>
   <trkpt lon="5.995893" lat="44.906551"><ele>2303.5</ele></trkpt>
   <trkpt lon="5.995833" lat="44.906562"><ele>2301.25</ele></trkpt>
   <trkpt lon="5.995779" lat="44.906580"><ele>2298.25</ele></trkpt>
   <trkpt lon="5.995676" lat="44.906572"><ele>2294.0</ele></trkpt>
   <trkpt lon="5.995571" lat="44.906544"><ele>2290.25</ele></trkpt>
   <trkpt lon="5.995325" lat="44.906415"><ele>2283.75</ele></trkpt>
   <trkpt lon="5.995182" lat="44.906422"><ele>2277.25</ele></trkpt>
   <trkpt lon="5.995133" lat="44.906436"><ele>2274.75</ele></trkpt>
   <trkpt lon="5.994957" lat="44.906380"><ele>2269.5</ele></trkpt>
   <trkpt lon="5.994905" lat="44.906353"><ele>2268.5</ele></trkpt>
   <trkpt lon="5.994890" lat="44.906317"><ele>2269.25</ele></trkpt>
   <trkpt lon="5.994851" lat="44.906298"><ele>2268.5</ele></trkpt>
   <trkpt lon="5.994781" lat="44.906290"><ele>2266.5</ele></trkpt>
   <trkpt lon="5.994744" lat="44.906318"><ele>2264.25</ele></trkpt>
   <trkpt lon="5.994574" lat="44.906294"><ele>2259.0</ele></trkpt>
   <trkpt lon="5.994560" lat="44.906320"><ele>2258.0</ele></trkpt>
   <trkpt lon="5.994521" lat="44.906319"><ele>2256.75</ele></trkpt>
   <trkpt lon="5.994493" lat="44.906327"><ele>2255.5</ele></trkpt>
   <trkpt lon="5.994489" lat="44.906397"><ele>2253.5</ele></trkpt>
   <trkpt lon="5.994439" lat="44.906394"><ele>2252.0</ele></trkpt>
   <trkpt lon="5.994415" lat="44.906489"><ele>2249.0</ele></trkpt>
   <trkpt lon="5.994384" lat="44.906510"><ele>2247.5</ele></trkpt>
   <trkpt lon="5.994303" lat="44.906525"><ele>2244.75</ele></trkpt>
   <trkpt lon="5.994213" lat="44.906508"><ele>2242.25</ele></trkpt>
   <trkpt lon="5.994150" lat="44.906575"><ele>2239.0</ele></trkpt>
   <trkpt lon="5.994088" lat="44.906677"><ele>2234.75</ele></trkpt>
   <trkpt lon="5.994013" lat="44.906706"><ele>2230.75</ele></trkpt>
   <trkpt lon="5.994017" lat="44.906674"><ele>2232.5</ele></trkpt>
   <trkpt lon="5.993983" lat="44.906629"><ele>2232.25</ele></trkpt>
   <trkpt lon="5.993935" lat="44.906635"><ele>2230.5</ele></trkpt>
   <trkpt lon="5.993800" lat="44.906712"><ele>2223.25</ele></trkpt>
   <trkpt lon="5.993695" lat="44.906656"><ele>2222.25</ele></trkpt>
   <trkpt lon="5.993605" lat="44.906543"><ele>2220.5</ele></trkpt>
   <trkpt lon="5.993428" lat="44.906284"><ele>2217.25</ele></trkpt>
   <trkpt lon="5.993208" lat="44.906129"><ele>2210.5</ele></trkpt>
   <trkpt lon="5.993070" lat="44.906092"><ele>2205.75</ele></trkpt>
   <trkpt lon="5.993031" lat="44.906032"><ele>2205.0</ele></trkpt>
   <trkpt lon="5.992923" lat="44.905985"><ele>2201.25</ele></trkpt>
   <trkpt lon="5.992850" lat="44.905916"><ele>2199.25</ele></trkpt>
   <trkpt lon="5.992692" lat="44.905853"><ele>2193.75</ele></trkpt>
   <trkpt lon="5.992457" lat="44.905717"><ele>2188.5</ele></trkpt>
   <trkpt lon="5.992328" lat="44.905652"><ele>2187.0</ele></trkpt>
   <trkpt lon="5.992267" lat="44.905600"><ele>2186.5</ele></trkpt>
   <trkpt lon="5.992120" lat="44.905586"><ele>2183.25</ele></trkpt>
   <trkpt lon="5.991976" lat="44.905558"><ele>2180.25</ele></trkpt>
   <trkpt lon="5.991574" lat="44.905673"><ele>2171.25</ele></trkpt>
   <trkpt lon="5.991336" lat="44.905703"><ele>2169.0</ele></trkpt>
   <trkpt lon="5.991148" lat="44.905779"><ele>2168.0</ele></trkpt>
   <trkpt lon="5.991032" lat="44.905788"><ele>2167.5</ele></trkpt>
   <trkpt lon="5.990534" lat="44.905676"><ele>2161.75</ele></trkpt>
   <trkpt lon="5.990394" lat="44.905665"><ele>2160.0</ele></trkpt>
   <trkpt lon="5.990168" lat="44.905593"><ele>2155.75</ele></trkpt>
   <trkpt lon="5.990106" lat="44.905559"><ele>2154.0</ele></trkpt>
   <trkpt lon="5.989688" lat="44.905474"><ele>2145.25</ele></trkpt>
   <trkpt lon="5.989577" lat="44.905456"><ele>2143.25</ele></trkpt>
   <trkpt lon="5.989275" lat="44.905432"><ele>2138.25</ele></trkpt>
   <trkpt lon="5.989205" lat="44.905436"><ele>2137.5</ele></trkpt>
   <trkpt lon="5.988909" lat="44.905409"><ele>2133.0</ele></trkpt>
   <trkpt lon="5.988484" lat="44.905395"><ele>2127.5</ele></trkpt>
   <trkpt lon="5.988252" lat="44.905430"><ele>2125.5</ele></trkpt>
   <trkpt lon="5.987537" lat="44.905468"><ele>2115.5</ele></trkpt>
   <trkpt lon="5.987238" lat="44.905502"><ele>2113.0</ele></trkpt>
   <trkpt lon="5.986975" lat="44.905555"><ele>2111.25</ele></trkpt>
   <trkpt lon="5.986619" lat="44.905669"><ele>2110.75</ele></trkpt>
   <trkpt lon="5.986503" lat="44.905677"><ele>2110.0</ele></trkpt>
   <trkpt lon="5.986126" lat="44.905588"><ele>2106.0</ele></trkpt>
   <trkpt lon="5.986047" lat="44.905598"><ele>2105.75</ele></trkpt>
   <trkpt lon="5.985758" lat="44.905512"><ele>2103.0</ele></trkpt>
   <trkpt lon="5.985445" lat="44.905491"><ele>2099.75</ele></trkpt>
   <trkpt lon="5.985340" lat="44.905495"><ele>2099.0</ele></trkpt>
   <trkpt lon="5.985190" lat="44.905445"><ele>2098.25</ele></trkpt>
   <trkpt lon="5.985037" lat="44.905384"><ele>2098.5</ele></trkpt>
   <trkpt lon="5.985190" lat="44.905445"><ele>2098.25</ele></trkpt>
   <trkpt lon="5.985221" lat="44.905493"><ele>2097.75</ele></trkpt>
   <trkpt lon="5.985136" lat="44.905490"><ele>2097.0</ele></trkpt>
   <trkpt lon="5.985178" lat="44.905560"><ele>2096.5</ele></trkpt>
   <trkpt lon="5.985038" lat="44.905540"><ele>2095.25</ele></trkpt>
   <trkpt lon="5.985123" lat="44.905617"><ele>2095.0</ele></trkpt>
   <trkpt lon="5.985064" lat="44.905625"><ele>2094.0</ele></trkpt>
   <trkpt lon="5.985104" lat="44.905656"><ele>2094.0</ele></trkpt>
   <trkpt lon="5.984989" lat="44.905664"><ele>2092.0</ele></trkpt>
   <trkpt lon="5.985159" lat="44.905725"><ele>2094.0</ele></trkpt>
   <trkpt lon="5.985285" lat="44.905789"><ele>2095.75</ele></trkpt>
   <trkpt lon="5.985422" lat="44.905886"><ele>2095.0</ele></trkpt>
   <trkpt lon="5.985524" lat="44.906057"><ele>2085.5</ele></trkpt>
   <trkpt lon="5.985463" lat="44.906047"><ele>2084.75</ele></trkpt>
   <trkpt lon="5.985492" lat="44.906090"><ele>2082.5</ele></trkpt>
   <trkpt lon="5.985658" lat="44.906176"><ele>2080.5</ele></trkpt>
   <trkpt lon="5.985882" lat="44.906244"><ele>2081.0</ele></trkpt>
   <trkpt lon="5.985966" lat="44.906256"><ele>2081.25</ele></trkpt>
   <trkpt lon="5.986099" lat="44.906348"><ele>2076.75</ele></trkpt>
   <trkpt lon="5.986204" lat="44.906556"><ele>2064.75</ele></trkpt>
   <trkpt lon="5.986443" lat="44.906692"><ele>2059.25</ele></trkpt>
   <trkpt lon="5.986593" lat="44.906739"><ele>2057.5</ele></trkpt>
   <trkpt lon="5.986526" lat="44.906776"><ele>2053.25</ele></trkpt>
   <trkpt lon="5.986664" lat="44.906838"><ele>2050.5</ele></trkpt>
   <trkpt lon="5.986750" lat="44.907042"><ele>2034.0</ele></trkpt>
   <trkpt lon="5.986980" lat="44.907108"><ele>2030.75</ele></trkpt>
   <trkpt lon="5.987027" lat="44.907162"><ele>2026.75</ele></trkpt>
   <trkpt lon="5.987179" lat="44.907258"><ele>2020.25</ele></trkpt>
   <trkpt lon="5.987211" lat="44.907310"><ele>2016.25</ele></trkpt>
   <trkpt lon="5.987352" lat="44.907399"><ele>2010.5</ele></trkpt>
   <trkpt lon="5.987336" lat="44.907467"><ele>2004.75</ele></trkpt>
   <trkpt lon="5.987291" lat="44.907563"><ele>1997.0</ele></trkpt>
   <trkpt lon="5.987226" lat="44.907583"><ele>1994.75</ele></trkpt>
   <trkpt lon="5.987252" lat="44.907657"><ele>1989.5</ele></trkpt>
   <trkpt lon="5.987219" lat="44.907711"><ele>1985.0</ele></trkpt>
   <trkpt lon="5.987090" lat="44.907629"><ele>1989.75</ele></trkpt>
   <trkpt lon="5.986956" lat="44.907945"><ele>1965.0</ele></trkpt>
   <trkpt lon="5.986843" lat="44.907916"><ele>1966.25</ele></trkpt>
   <trkpt lon="5.986798" lat="44.907829"><ele>1972.0</ele></trkpt>
   <trkpt lon="5.986731" lat="44.907914"><ele>1965.25</ele></trkpt>
   <trkpt lon="5.986618" lat="44.908247"><ele>1939.0</ele></trkpt>
   <trkpt lon="5.986650" lat="44.908408"><ele>1928.75</ele></trkpt>
   <trkpt lon="5.986554" lat="44.908520"><ele>1919.25</ele></trkpt>
   <trkpt lon="5.986637" lat="44.908615"><ele>1915.25</ele></trkpt>
   <trkpt lon="5.986511" lat="44.908657"><ele>1909.5</ele></trkpt>
   <trkpt lon="5.986589" lat="44.908769"><ele>1904.25</ele></trkpt>
   <trkpt lon="5.986669" lat="44.908813"><ele>1903.25</ele></trkpt>
   <trkpt lon="5.986556" lat="44.908857"><ele>1898.0</ele></trkpt>
   <trkpt lon="5.986677" lat="44.908940"><ele>1895.25</ele></trkpt>
   <trkpt lon="5.986535" lat="44.908980"><ele>1889.75</ele></trkpt>
   <trkpt lon="5.986712" lat="44.909071"><ele>1886.5</ele></trkpt>
   <trkpt lon="5.986575" lat="44.909075"><ele>1884.5</ele></trkpt>
   <trkpt lon="5.986664" lat="44.909149"><ele>1882.0</ele></trkpt>
   <trkpt lon="5.986618" lat="44.909461"><ele>1866.25</ele></trkpt>
   <trkpt lon="5.986406" lat="44.909732"><ele>1848.25</ele></trkpt>
   <trkpt lon="5.986436" lat="44.909831"><ele>1844.5</ele></trkpt>
   <trkpt lon="5.986253" lat="44.909687"><ele>1846.5</ele></trkpt>
   <trkpt lon="5.986243" lat="44.909896"><ele>1836.25</ele></trkpt>
   <trkpt lon="5.985945" lat="44.909687"><ele>1838.5</ele></trkpt>
   <trkpt lon="5.985972" lat="44.910091"><ele>1820.0</ele></trkpt>
   <trkpt lon="5.986135" lat="44.910473"><ele>1807.75</ele></trkpt>
   <trkpt lon="5.985620" lat="44.910260"><ele>1801.75</ele></trkpt>
   <trkpt lon="5.985610" lat="44.910456"><ele>1793.75</ele></trkpt>
   <trkpt lon="5.985671" lat="44.910587"><ele>1791.0</ele></trkpt>
   <trkpt lon="5.985376" lat="44.910428"><ele>1786.5</ele></trkpt>
   <trkpt lon="5.985341" lat="44.910695"><ele>1775.5</ele></trkpt>
   <trkpt lon="5.985368" lat="44.910857"><ele>1770.5</ele></trkpt>
   <trkpt lon="5.985516" lat="44.911149"><ele>1763.5</ele></trkpt>
   <trkpt lon="5.985607" lat="44.911073"><ele>1769.0</ele></trkpt>
   <trkpt lon="5.985647" lat="44.911184"><ele>1765.25</ele></trkpt>
   <trkpt lon="5.985524" lat="44.911216"><ele>1761.0</ele></trkpt>
   <trkpt lon="5.985454" lat="44.911514"><ele>1747.75</ele></trkpt>
   <trkpt lon="5.985248" lat="44.911484"><ele>1745.5</ele></trkpt>
   <trkpt lon="5.985248" lat="44.911729"><ele>1736.25</ele></trkpt>
   <trkpt lon="5.985170" lat="44.911674"><ele>1738.25</ele></trkpt>
   <trkpt lon="5.985159" lat="44.911790"><ele>1732.5</ele></trkpt>
   <trkpt lon="5.985175" lat="44.911913"><ele>1726.5</ele></trkpt>
   <trkpt lon="5.985363" lat="44.911942"><ele>1726.0</ele></trkpt>
   <trkpt lon="5.985502" lat="44.911902"><ele>1729.0</ele></trkpt>
   <trkpt lon="5.986555" lat="44.911819"><ele>1719.75</ele></trkpt>
   <trkpt lon="5.986762" lat="44.911848"><ele>1715.25</ele></trkpt>
   <trkpt lon="5.987243" lat="44.912001"><ele>1706.25</ele></trkpt>
   <trkpt lon="5.987372" lat="44.912018"><ele>1705.25</ele></trkpt>
   <trkpt lon="5.987527" lat="44.912019"><ele>1705.75</ele></trkpt>
   <trkpt lon="5.987582" lat="44.912040"><ele>1705.75</ele></trkpt>
   <trkpt lon="5.987537" lat="44.912127"><ele>1701.25</ele></trkpt>
   <trkpt lon="5.987389" lat="44.912334"><ele>1690.75</ele></trkpt>
   <trkpt lon="5.987405" lat="44.912382"><ele>1688.5</ele></trkpt>
   <trkpt lon="5.987513" lat="44.912461"><ele>1686.0</ele></trkpt>
   <trkpt lon="5.987538" lat="44.912604"><ele>1681.5</ele></trkpt>
   <trkpt lon="5.987607" lat="44.912670"><ele>1681.0</ele></trkpt>
   <trkpt lon="5.987881" lat="44.913527"><ele>1661.5</ele></trkpt>
   <trkpt lon="5.988041" lat="44.913646"><ele>1661.5</ele></trkpt>
   <trkpt lon="5.988053" lat="44.913688"><ele>1660.75</ele></trkpt>
   <trkpt lon="5.988113" lat="44.913738"><ele>1660.5</ele></trkpt>
   <trkpt lon="5.988191" lat="44.913757"><ele>1661.5</ele></trkpt>
   <trkpt lon="5.988359" lat="44.913881"><ele>1661.5</ele></trkpt>
   <trkpt lon="5.988366" lat="44.914059"><ele>1656.75</ele></trkpt>
   <trkpt lon="5.988521" lat="44.914075"><ele>1661.0</ele></trkpt>
   <trkpt lon="5.988564" lat="44.914108"><ele>1661.25</ele></trkpt>
   <trkpt lon="5.988576" lat="44.914149"><ele>1660.75</ele></trkpt>
   <trkpt lon="5.988557" lat="44.914248"><ele>1658.25</ele></trkpt>
   <trkpt lon="5.988514" lat="44.914299"><ele>1656.25</ele></trkpt>
   <trkpt lon="5.988301" lat="44.914436"><ele>1648.5</ele></trkpt>
   <trkpt lon="5.988178" lat="44.914623"><ele>1643.5</ele></trkpt>
   <trkpt lon="5.988187" lat="44.914673"><ele>1643.0</ele></trkpt>
   <trkpt lon="5.988063" lat="44.914907"><ele>1637.25</ele></trkpt>
   <trkpt lon="5.988018" lat="44.914938"><ele>1636.0</ele></trkpt>
   <trkpt lon="5.987995" lat="44.914997"><ele>1634.75</ele></trkpt>
   <trkpt lon="5.988072" lat="44.915077"><ele>1634.75</ele></trkpt>
   <trkpt lon="5.988057" lat="44.915096"><ele>1634.0</ele></trkpt>
  </trkseg>
 </trk>
</gpx>```

Jawaban

4 christoph Aug 31 2020 at 20:40

Anda dapat menggabungkan QGIS dengan HTML / Javascript ( Highchart atau kerangka kerja lainnya) untuk menghasilkan profil ketinggian yang menarik. Dengan bantuan beberapa fungsi ekspresi Python, dimungkinkan untuk menggunakan fitur QGIS Atlas untuk menampilkan banyak trek bersama dengan titik jalan yang sesuai. Idenya adalah, untuk membuat layer titik arah virtual yang akan difilter berdasarkan nama trek:

Yang harus Anda lakukan adalah:

  1. Seret & Jatuhkan file GPX Anda ke kanvas peta QGIS, impor dan ubah lapisan trek Anda dari MultiLinestring ke Linestring. Panggil layer yang dihasilkan "track". Kemudian impor layer waypoint Anda dan ubah namanya menjadi "waypoints_orig".
  2. Tambahkan kolom "nama" ke lapisan "trek" Anda dan beri trek Anda beberapa nama yang bermakna. Kemudian tambahkan kolom "track" ke layer "waypoints_orig" Anda dan tetapkan nama track yang sesuai ke titik lewat. Tambahkan lapisan virtual "titik jalan" ke proyek Anda:
vlayer = QgsVectorLayer ("? query = pilih * dari waypoints_orig di mana track = '' & geometry = geometry", 'waypoints', 'virtual')
QgsProject.instance (). AddMapLayer (vlayer)
  1. Letakkan Kode Python berikut ke dalam bagian Makro proyek QGIS Anda dan aktifkan Macro Python:
from qgis.core import qgsfunction,QgsCoordinateTransform,QgsProject
from qgis.PyQt.QtCore import QTimer,QEventLoop
from itertools import accumulate
@qgsfunction(args=0, group='Custom', usesgeometry=True)
def GetProfileData(values, feature, parent):
    vertices = list(feature.geometry().vertices())
    dList,zList = zip(*[[vertices[i-1].distance(vertex),vertex.z()] for i,vertex in enumerate(vertices) if i > 0])
    dList = tuple(accumulate(dList))
    data = [list(elem) for elem in list(zip(dList,zList))]
    data.insert(0,[0,vertices[0].z()])
    return str(data)

@qgsfunction(args=0, group='Custom')
def wait1000(values, feature, parent):
    loop = QEventLoop()
    QTimer.singleShot(1000,loop.quit)
    loop.exec_()
    return 0
    
@qgsfunction(args=3, group='Custom', usesgeometry=True)
def GetWaypoints(values, feature, parent):
    waypointLayer = values[0]
    trackLayer = values[1]
    nameFilter = values[2]
    wplayer = QgsProject.instance().mapLayersByName(waypointLayer)[0]
    wplayer.setDataSource("?query=select * from waypoints_orig where track='%s'&geometry=geometry" % nameFilter,waypointLayer,'virtual')
    
    loop = QEventLoop()
    QTimer.singleShot(1000,loop.quit)
    loop.exec_()
    
    trlayer = QgsProject.instance().mapLayersByName(trackLayer)[0]
    geom = feature.geometry()
    
    crsSrc = wplayer.crs()
    crsDest = trlayer.crs()
    xform = QgsCoordinateTransform(crsSrc, crsDest,QgsProject.instance())
       
    ret = ''
    for wpf in wplayer.getFeatures():
        wpgeom =  wpf.geometry()
        wpgeom.transform(xform)
        vtx = geom.closestVertex(wpgeom.asPoint())[1]
        elev = geom.vertexAt(vtx).z()
        d = geom.distanceToVertex(vtx)
        print(d)
        ret += "{point: { xAxis: 0, yAxis: 0, x: %s, y: %s}, text: '%s'}," % (d,elev, wpf["name"])
     
    ret = ret[0:-1]
    return ret
  1. Buat Atlas dengan lapisan "track" Anda sebagai "Lapisan cakupan"
  2. Tambahkan bingkai HTML ke tata letak Anda:
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
    #container {
    max-width: 850px;
    height: 350px;
    margin: 1em auto;
}
</style>

<title>Highcharts Demo</title>
</head>

<body>
<script src="http://code.highcharts.com/highcharts.js"></script>
<script src="http://code.highcharts.com/modules/annotations.js"></script>

<div id="container" style="height: 400px; min-width: 380px;"></div>

<script type="text/javascript">//<![CDATA[

var elevationData = [%GetProfileData()%];

Highcharts.chart('container', {
    chart: {
        type: 'area'
    },

    title: {
         style: { color: "#2b435d" },
        text: "Mountain Trail"
    },

    subtitle: {
         style: { color: "#2b435d" },
        text: 'Total Length: [%round($length)%]m'
    },
    xAxis: {
        labels: {
              style: { color: "#2b435d" },
            format: '{value}'
        },
        minTickInterval: 250,
        title: {
            text: 'Distance [m]'
        }
    },

    yAxis: {
        startOnTick: true,
        endOnTick: false,
        maxPadding: 0.35,
        title: {
            text: 'Elevation [m]'
        },
        labels: {
              style: { color: "#2b435d" },
            format: '{value}'
        }
    },

    legend: {
        enabled: false
    },
    annotations: [{
        labelOptions: {
            backgroundColor: 'rgba(255,255,255,0.5)'
        },
        labels: [[% GetWaypoints('waypoints','track',"name") %]]}
    ],
    plotOptions: {
                area: {
                    fillColor: {
                        linearGradient: {
                            x1: 0,
                            y1: 0,
                            x2: 0,
                            y2: 1
                        },
                        stops: [
                            [0,'#8B4513'],
                            [1, Highcharts.Color(Highcharts.getOptions().colors[2]).setOpacity(0.3).get('rgba')]
                        ]
                    },
                    marker: {
                        radius: 2
                    },
                    lineWidth: 1,
                    states: {
                        hover: {
                            lineWidth: 1
                        }
                    },
                    threshold: null
                }
            },    

    series: [{
        data: elevationData,
        lineColor: Highcharts.getOptions().colors[1],
        color: Highcharts.getOptions().colors[2],
        fillOpacity: 0.5,
        name: 'Elevation',
        marker: {
            enabled: false
        },
        threshold: null
    }]

});
//]]> 

</script>
</body>
</html>
  1. Karena masalah waktu, kita harus menambahkan fungsi ekspresi Python wait1000 () ke bingkai HTML (yaitu, gunakan penggantian yang ditentukan data untuk "Kecualikan item dari ekspor")
4 BERA Aug 30 2020 at 16:07

Menggunakan file xml dan matplotlib Anda, Anda dapat mencapai hasil yang bagus jika Anda berusaha keras. Plot Matplotlib dapat disesuaikan agar terlihat seperti contoh Anda. Bagian tersulit adalah menghitung di mana harus menempatkan label.

import matplotlib.pyplot as plt
import numpy as np

#Function to project geometries to get distances in meters instead of degrees
#From: https://gis.stackexchange.com/questions/163645/transforming-single-qgsgeometry-object-from-one-crs-to-another-using-pyqgis
def pr(ingeom):
    sourceCrs = QgsCoordinateReferenceSystem(4326)
    destCrs = QgsCoordinateReferenceSystem(32632)
    tr = QgsCoordinateTransform(sourceCrs, destCrs, QgsProject.instance())
    ingeom.transform(tr)
    return ingeom

tp = QgsProject.instance().mapLayersByName('track_points')[0]
zfield = 'ele'
orderfield = 'track_seg_point_id'
tpfeats = [f for f in tp.getFeatures()] #List all trackpoints
tpfeats.sort(key=lambda x: x[orderfield]) #Sort by orderfield (maybe they already are(?), doesnt matter)

#List all horizontal distances, the plot x values
hdist = [pr(p1.geometry()).distance(pr(p2.geometry())) for p1,p2 in zip(tpfeats, tpfeats[1:])]
hdist.insert(0,0) #First point
hdist = np.cumsum(hdist)
#List heights
zs = [f[zfield] for f in tpfeats] #The plot y values

#Which track point is closest to each waypoint?
#To know where to place each label in horizontal and height directions 
wp = QgsProject.instance().mapLayersByName('waypoints')[0]
placenamefield = 'name'
wpfeats = [f for f in wp.getFeatures()]
labels = [] #Each waypoints name attribute and the index of the closest trackpoint
for wpf in wpfeats:
    closest_trackpoint = min(tpfeats, key=lambda x: pr(x.geometry()).distance(pr(wpf.geometry())))
    ix = [tpf.id() for tpf in tpfeats].index(closest_trackpoint.id())
    labels.append([wpf[placenamefield], ix])

labels = [[l[0], hdist[l[1]]-100, zs[l[1]]+25] for l in labels] #List of lists like this: [['somelabeltext',horizontal distance, height], ['somelabeltext2',...

#Plot
plt.plot(hdist, zs, 'g')
plt.xlabel("Distance")
plt.ylabel("Elevation")
plt.title("Forgiving terrain 50k")
plt.hlines(range(1600,2700,100), xmin=0, xmax=4500, colors='silver', linestyles='solid')
x1,x2,y1,y2 = plt.axis()
plt.axis((x1,x2,1600,2600))
plt.fill_between(hdist, zs, color='#c1daba')

for labeltext, x, y, in labels:
    plt.annotate(labeltext, (x, y), color='g')
plt.show()