Color-code a Leaflet polyline ขึ้นอยู่กับค่าเพิ่มเติมเช่นความสูงความเร็ว


13

ฉันต้องการวาด GPX-track บนแผนที่ Leaflet โพลีไลน์ไม่ควรมีเพียงสีเดียว แต่ฉันต้องการแสดงค่าบางอย่างเช่นระดับความสูง, ความเร็ว, อัตราการเต้นของหัวใจ, อุณหภูมิ, จังหวะ, ความชันของรหัสสี แน่นอนสามารถมองเห็นค่าเดียวเท่านั้นในครั้งเดียว

ค่าจะถูกเก็บไว้พร้อมกับL.LatLngเช่นในmeta: {ele: 298, hr: 155}วัตถุ

ฉันใหม่กับ Leaflet และกังวลเป็นพิเศษเกี่ยวกับการหาวิธีที่มีประสิทธิภาพในการทำเช่นนี้ สิ่งแรกที่อยู่ในใจคือการสร้าง polylines หลายร้อยหรือหลายพันตัวแต่ละอันมีสีพิเศษ แต่ฟังดูโลภมากเกี่ยวกับหน่วยความจำและซีพียู

ความคิดใด ๆ

ตัวอย่างสิ่งที่ฉันหมายถึงสามารถดูได้ที่นี่ภาพหน้าจอ MyTourbook


คุณกรุณาให้ไฟล์ตัวอย่างได้ไหม วิธีนี้อาจช่วยได้ง่ายขึ้น
ustroetz

นี่คือตัวอย่าง: track-and-find.me/gpx-viewer/data/kampenwand.gpx
hgoebl

คำตอบ:


7

แปลง GPX track ของคุณเป็น GeoJSON ด้วย QGIS

สมมติว่า GeoJSON ของคุณเป็นแบบนี้ GeoJSON มีคุณสมบัติที่elevationมีค่าระดับความสูง

        var yourGeoJSON = [ 
{ "type": "Feature", "properties": { "id": 2, "elevation": 50 }, "geometry": { "type": "LineString", "coordinates": [ [ 11.836395263671875, 47.75317468890147 ], [ 11.865234375, 47.73193447949174 ] ] } },
{ "type": "Feature", "properties": { "id": 1, "elevation": 750 }, "geometry": { "type": "LineString", "coordinates": [ [ 11.865234375,47.73193447949174 ], [ 11.881027221679688, 47.700520033704954 ] ] } },
{ "type": "Feature", "properties": { "id": 0, "elevation": 1700 }, "geometry": { "type": "LineString", "coordinates": [ [ 11.881027221679688, 47.700520033704954 ], [ 11.923599243164062, 47.706527200903395 ] ] } },
{ "type": "Feature", "properties": { "id": 0, "elevation": 3000 }, "geometry": { "type": "LineString", "coordinates": [ [ 11.923599243164062, 47.706527200903395 ], [ 11.881027221679688, 47.700520033704954 ], ] } }
];


เพิ่ม GeoJSON ของคุณด้วยรหัสต่อไปนี้ในแผนที่แผ่นพับของคุณ ใช้ฟังก์ชันเพื่อจัดรูปแบบไฟล์ของคุณ "color"องค์ประกอบเรียกฟังก์ชันget colorและผ่านในelevationค่าของคุณสมบัติของคุณเป็นพารามิเตอร์

L.geoJson(yourGeoJSON, {
    style: function (feature) {
        return {
         "color": getColor(feature.properties.elevation),
         "opacity": 1,
        }}
}).addTo(map);

ฟังก์ชันgetColorส่งคืนสีตามค่าระดับความสูง

function getColor(x) {
  return x < 500     ?    '#bd0026':
         x < 1000     ?   '#f03b20':
         x < 1500     ?   '#fd8d3c':
         x < 2000     ?   '#fecc5c':
                          '#ffffb2' ;
};

ฉันสร้าง JSFiddle ด้วยตัวอย่าง GeoJSON และฟังก์ชั่นที่อธิบายไว้ข้างต้น: http://jsfiddle.net/2VY5z/1/


1
ขอบคุณนั่นเป็นทางออกที่เป็นไปได้ ฉันเล่นซอๆjsfiddle.net/2VY5z/3และสังเกตว่าภายในจะมีเลเยอร์ที่สร้างขึ้นสำหรับทุกฟีเจอร์ ในกรณีที่มีแทร็ก GPX ที่ยาวฉันคิดว่ามันจะค่อนข้างท่วมท้น ดังนั้นฉันจะรอสองสามชั่วโมงเพื่อหาคำตอบที่ดียิ่งขึ้นจนกว่าคุณจะได้รับเครื่องหมาย "ถูกต้อง"
hgoebl

1
ฉันเห็นด้วยกับ @hgoebl เพื่อแบ่งส่วนคุณลักษณะของแหล่งที่มาหนึ่งแห่งออกเป็นพันชิ้นเล็ก ๆ ดูเหมือนว่าไม่ดีต่อประสิทธิภาพ ฉันคิดว่าเราต้องการคลาสพิเศษที่ได้มาจาก L.Path ด้วยฟังก์ชั่นที่กล่าวถึงข้างต้น อาจมีคนสร้างมันขึ้นมาแล้ว? ;)
unibasil

ตอนนี้ฉันกำลังพัฒนาปลั๊กอิน Layer ซึ่งมีประสิทธิภาพมากกว่า แต่ฉันเกรงว่าฉันจะต้องสร้าง<path>องค์ประกอบอย่างน้อยบ่อยเท่าที่สวิตช์สี น่าเศร้าที่ไม่มีวิธีการเปลี่ยนสีในเส้นทาง: M184 398L187 395C#00FF00 L183 399จำเป็นสำหรับสิ่งนั้น (C = color)
hgoebl

7

ฉันได้สร้างปลั๊กอินขนาดเล็กสำหรับใบปลิว: Leaflet.MultiOptionsPolyline

นี่คือภาพหน้าจอจากหน้าตัวอย่าง :

ตัวอย่างจากหน้าตัวอย่าง

ขณะนี้ยังไม่มีเอกสารประกอบ แต่หน้าตัวอย่างเชื่อมโยงไปยังซอร์สโค้ดซึ่งควรอธิบายด้วยตนเอง

ความคิดเห็นของคุณยินดีต้อนรับ (สร้างปัญหาใน GitHub หรือแสดงความคิดเห็นคำตอบนี้หากคุณไม่มีบัญชี GitHub)


2

ดูเหมือนว่านี่จะเป็นเธรดเก่า แต่หวังว่าจะมีคนพบว่ามีประโยชน์

ปลั๊กอิน Leaflet สำหรับการวาดการไล่ระดับสีตามแนวโพลีน https://github.com/iosphere/Leaflet.hotline/ การสาธิต


1
ดูเหมือนว่าจะมีประโยชน์ แต่ตามกฎทั่วไปคำตอบควรมีมากกว่าลิงค์ แม้ว่าสิ่งที่คุณทำคือการสรุปสิ่งที่อยู่อีกด้านหนึ่งของลิงก์ผู้ใช้รายอื่นควรเข้าใจว่าโซลูชันนี้คืออะไรและทำไมมันถึงตอบคำถามเดิมอย่างเพียงพอโดยที่ผู้ใช้ไม่ต้องออกจากหน้านี้
JoshC

@JoshC ขอบคุณหวังว่ามันจะเป็นคำอธิบายที่เข้าใจได้หลังจากอัปเดตหากคุณใช้บัญชีที่มีภาพอธิบายมากมาย
Dzmitry Atkayey
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.