Mã màu một đa tuyến Tờ rơi dựa trên các giá trị bổ sung, ví dụ: độ cao, tốc độ,


13

Tôi muốn vẽ đường đua GPX trên bản đồ Tờ rơi. Đa tuyến không nên chỉ có một màu, nhưng tôi muốn hiển thị một số giá trị nhất định như độ cao, tốc độ, nhịp tim, nhiệt độ, nhịp, độ dốc được mã hóa màu. Tất nhiên chỉ có một giá trị có thể được hình dung cùng một lúc.

Các giá trị sẽ được lưu trữ cùng với L.LatLng, ví dụ như trong một meta: {ele: 298, hr: 155}đối tượng.

Tôi chưa quen với Leaflet và đặc biệt quan tâm đến việc tìm ra cách hiệu quả để làm điều này. Việc đầu tiên xuất hiện trong đầu là tạo ra hàng trăm hoặc hàng nghìn polylines mỗi màu với một màu đặc biệt. Nhưng điều này nghe có vẻ rất tham lam về bộ nhớ và cpu.

Có ý kiến ​​gì không?

Một ví dụ những gì tôi muốn nói có thể được xem ở đâyẢnh chụp màn hình MyTourbook


Bạn có thể vui lòng cung cấp một tập tin mẫu. Bằng cách này, nó có thể dễ dàng hơn để giúp đỡ.
ustroetz

Dưới đây là một ví dụ: track-and-find.me/gpx-viewer/data/kampenwand.gpx
hgoebl

Câu trả lời:


7

Chuyển đổi bản nhạc GPX của bạn thành GeoJSON với QGIS.

Hãy nói rằng GeoJSON của bạn trông như thế này. GeoJSON có một thuộc tính elevationvới giá trị của độ cao.

        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 ], ] } }
];


Thêm GeoJSON của bạn với mã sau vào bản đồ tờ rơi của bạn. Sử dụng một chức năng để định kiểu tệp của bạn. Phần "color"tử gọi hàm get colorvà truyền vào elevationgiá trị của tính năng của bạn dưới dạng tham số.

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

Hàm getColortrả về màu dựa trên giá trị độ cao.

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

Tôi đã tạo một JSFiddle với GeoJSON mẫu và các hàm được mô tả ở trên: http://jsfiddle.net/2VY5z/1/


1
Cảm ơn bạn, đó là một giải pháp có thể. Tôi nghịch một chút jsfiddle.net/2VY5z/3 và quan sát thấy rằng bên trong sẽ có một lớp được tạo cho mọi tính năng. Trong trường hợp các bài hát GPX dài, tôi cho rằng điều này có thể trở nên khá áp đảo. Do đó, tôi sẽ đợi một vài giờ để có câu trả lời tốt hơn cho đến khi bạn nhận được dấu "chính xác".
hgoebl

1
Tôi đồng ý với @hgoebl, để phân đoạn một tính năng nguồn thành hàng ngàn khối nhỏ dường như không tốt về hiệu suất. Tôi nghĩ rằng chúng ta cần một lớp học đặc biệt, xuất phát từ L.Path với chức năng đã đề cập ở trên. Có lẽ ai đó đã làm nó rồi? ;)
unibasil

Tôi hiện đang phát triển một plugin Layer hiệu quả hơn một chút. Nhưng tôi e rằng tôi phải tạo ra ít nhất số lượng <path>phần tử thường xuyên như các công tắc màu. Đáng buồn thay, không có cách nào để thay đổi màu sắc trong một đường dẫn: M184 398L187 395C#00FF00 L183 399sẽ là cần thiết cho điều đó (C = màu).
hgoebl

7

Tôi đã tạo một plugin nhỏ cho Leaflet: Leaflet.MultiOptionsPolyline .

Đây là một ảnh chụp màn hình từ trang demo :

ví dụ từ trang demo

Hiện tại nó thiếu tài liệu, nhưng trang demo liên kết đến mã nguồn nên khá tự giải thích.

Phản hồi của bạn rất đáng hoan nghênh (tạo sự cố trên GitHub hoặc nhận xét câu trả lời này nếu bạn không có tài khoản GitHub).


2

Có vẻ như đây là chủ đề cũ, nhưng hy vọng, ai đó tìm thấy điều này hữu ích.

Một plugin Leaflet để vẽ gradient màu dọc theo polylines. https://github.com/iosphere/Leaflet.hotline/ bản giới thiệu


1
Nó có vẻ hữu ích, nhưng như một quy tắc chung, một câu trả lời không chỉ chứa một liên kết. Ngay cả khi tất cả những gì bạn làm là đưa ra một bản tóm tắt về những gì ở phía bên kia của liên kết, một người dùng khác sẽ có thể hiểu giải pháp này là gì và tại sao nó giải quyết thỏa đáng câu hỏi ban đầu mà không cần nói người dùng phải rời khỏi trang này.
JoshC

@JoshC, cảm ơn, hy vọng nó là mô tả dễ hiểu sau khi cập nhật nếu bạn có một tài khoản mà hình ảnh giải thích rất nhiều
Dzmitry Atkayey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.