geodesic lines: improve the handling for lines that extend beyond the antimeridian. no odd straight line segments
leaflet doesn't have particularly great handling for this, but this is a reasonable measure for now
This commit is contained in:
26
external/L.Geodesic.js
vendored
26
external/L.Geodesic.js
vendored
@ -77,14 +77,28 @@ Modified by qnstie 2013-07-17 to maintain compatibility with Leaflet.draw
|
|||||||
}
|
}
|
||||||
|
|
||||||
L.geodesicConvertLines = function (latlngs, fill) {
|
L.geodesicConvertLines = function (latlngs, fill) {
|
||||||
var i, j, len, geodesiclatlngs = [];
|
if (latlngs.length == 0) {
|
||||||
for (i = 0, len = latlngs.length; i < len; i++) {
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0, len = latlngs.length; i < len; i++) {
|
||||||
if (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') {
|
if (L.Util.isArray(latlngs[i]) && typeof latlngs[i][0] !== 'number') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
latlngs[i] = L.latLng(latlngs[i]);
|
latlngs[i] = L.latLng(latlngs[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// geodrsic calculations have issues when crossing the anti-meridian. so offset the points
|
||||||
|
// so this isn't an issue, then add back the offset afterwards
|
||||||
|
// a center longitude would be ideal - but the start point logitude will be 'good enougn'
|
||||||
|
var lngOffset = latlngs[0].lng;
|
||||||
|
|
||||||
|
// points are wrapped after being offset relative to the first point coordinate, so they're
|
||||||
|
// within +-180 degrees
|
||||||
|
latlngs = latlngs.map(function(a){ return L.latLng(a.lat, a.lng-lngOffset).wrap(); });
|
||||||
|
|
||||||
|
var geodesiclatlngs = [];
|
||||||
|
|
||||||
if(!fill) {
|
if(!fill) {
|
||||||
geodesiclatlngs.push(latlngs[0]);
|
geodesiclatlngs.push(latlngs[0]);
|
||||||
}
|
}
|
||||||
@ -94,6 +108,12 @@ Modified by qnstie 2013-07-17 to maintain compatibility with Leaflet.draw
|
|||||||
if(fill) {
|
if(fill) {
|
||||||
geodesicConvertLine(latlngs[len], latlngs[0], geodesiclatlngs);
|
geodesicConvertLine(latlngs[len], latlngs[0], geodesiclatlngs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// now add back the offset subtracted above. no wrapping here - the drawing code handles
|
||||||
|
// things better when there's no sudden jumps in coordinates. yes, lines will extend
|
||||||
|
// beyond +-180 degrees - but they won't be 'broken'
|
||||||
|
geodesiclatlngs = geodesiclatlngs.map(function(a){ return L.latLng(a.lat, a.lng+lngOffset); });
|
||||||
|
|
||||||
return geodesiclatlngs;
|
return geodesiclatlngs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user