From fb399621003cd13d27b7937f06b8b81b9ba2458e Mon Sep 17 00:00:00 2001 From: The Ripper Date: Sat, 4 Jul 2020 14:51:13 +0200 Subject: [PATCH 1/3] Limited route points to max 200 or lower depending on track length --- js/plugin/RouteLoaderConverter.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/js/plugin/RouteLoaderConverter.js b/js/plugin/RouteLoaderConverter.js index 9ff518e..72b4dd2 100644 --- a/js/plugin/RouteLoaderConverter.js +++ b/js/plugin/RouteLoaderConverter.js @@ -5,6 +5,7 @@ BR.routeLoader = function(map, layersControl, routing, pois) { _bounds: undefined, _testLayer: L.layerGroup().addTo(map), _trackPoints: [], + _maxTrackPoints: 200, _closeCanceled: true, _currentGeoJSON: {}, _options: { @@ -50,11 +51,10 @@ BR.routeLoader = function(map, layersControl, routing, pois) { this._testLayer.clearLayers(); var simplifiedLatLngs = this.getSimplifiedLatLngs(); - if (simplifiedLatLngs.length > 5000) { + if (simplifiedLatLngs.length > this._maxTrackPoints) { this.onBusyChanged(false); return false; } - for (var i = 0; i < simplifiedLatLngs.length; i++) { this._testLayer.addLayer( L.circleMarker(simplifiedLatLngs[i], { @@ -241,6 +241,7 @@ BR.routeLoader = function(map, layersControl, routing, pois) { }, convertTrackLocal: function() { + if ($('#loadedittrackFile')[0].files.length == 0) return; this.onBusyChanged(true); this.getOptions(); @@ -339,6 +340,8 @@ BR.routeLoader = function(map, layersControl, routing, pois) { this.setLayerNameFromGeojson(geoJSON); this._trackPoints = this.getLineStringsFromGeoJSON(geoJSON); + var length = turf.length(this._trackPoints, { units: 'kilometers' }); + this._maxTrackPoints = Math.min(length * Math.max(-0.14 * length + 10, 1), 200); this.fire('file:loaded'); if (this._options.showTrackLayer || this._options.isTestMode) this.addTrackOverlay(geoJSON); From 3f7e0fa66a992a84e9e0110fd72cbf7a90a4da70 Mon Sep 17 00:00:00 2001 From: The Ripper Date: Tue, 7 Jul 2020 16:44:18 +0200 Subject: [PATCH 2/3] iteration test for tolerance value --- js/plugin/RouteLoaderConverter.js | 44 +++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/js/plugin/RouteLoaderConverter.js b/js/plugin/RouteLoaderConverter.js index 72b4dd2..5cb58ee 100644 --- a/js/plugin/RouteLoaderConverter.js +++ b/js/plugin/RouteLoaderConverter.js @@ -8,6 +8,7 @@ BR.routeLoader = function(map, layersControl, routing, pois) { _maxTrackPoints: 200, _closeCanceled: true, _currentGeoJSON: {}, + _counter: 0, _options: { format: undefined, showTrackLayer: true, @@ -37,20 +38,22 @@ BR.routeLoader = function(map, layersControl, routing, pois) { }); }, - getSimplifiedLatLngs: function() { + getSimplifiedCoords: function(tolerance) { var simplifiedLine = turf.simplify(this._trackPoints.geometry, { - tolerance: this._options.simplifyTolerance, + tolerance: tolerance, highQuality: true }); - - return L.GeoJSON.coordsToLatLngs(simplifiedLine.coordinates); + return simplifiedLine.coordinates; + // return L.GeoJSON.coordsToLatLngs(simplifiedLine.coordinates); }, refreshTestLayer: function() { this.onBusyChanged(true); this._testLayer.clearLayers(); - var simplifiedLatLngs = this.getSimplifiedLatLngs(); + var simplifiedLatLngs = L.GeoJSON.coordsToLatLngs( + this.getSimplifiedCoords(this._options.simplifyTolerance) + ); if (simplifiedLatLngs.length > this._maxTrackPoints) { this.onBusyChanged(false); return false; @@ -94,6 +97,7 @@ BR.routeLoader = function(map, layersControl, routing, pois) { setSliderRange: function() { $slider = $('#simplify_tolerance'); + $slider.prop('min', -500); var guessedTolerance = this.guessSimplifyTolerance(this._trackPoints); $slider.data('guess', guessedTolerance.toFixed(20)); $slider.val(0); @@ -111,8 +115,18 @@ BR.routeLoader = function(map, layersControl, routing, pois) { else this._options.simplifyTolerance = Math.abs(guess + Math.pow(f, 3) * (guess / Math.pow(frac, 3))); if (!this.refreshTestLayer()) { + var iterate = this.findLowestTolerance( + parseInt(e.target.value), + parseInt($(e.target).data('lastknowngood')), + guess, + frac + ); + $(e.target).prop('min', iterate); + $(e.target).data('lastknowngood', iterate); e.target.value = $(e.target).data('lastknowngood'); - this._options.simplifyTolerance = this._options.simplifyLastKnownGood; + this._options.simplifyTolerance = this._options.simplifyLastKnownGood = Math.abs( + guess + Math.pow(iterate, 3) * (guess / Math.pow(frac, 3)) + ); this.refreshTestLayer(); } else { this._options.simplifyLastKnownGood = this._options.simplifyTolerance; @@ -120,6 +134,18 @@ BR.routeLoader = function(map, layersControl, routing, pois) { } }, + findLowestTolerance: function(min, max, guess, frac) { + if (Math.abs(max - min) <= 2) return max; + var meridian = Math.round((max + min) / 2); + + var tolerance = Math.abs(guess + Math.pow(meridian, 3) * (guess / Math.pow(frac, 3))); + var simplifiedCoords = this.getSimplifiedCoords(tolerance); + + if (simplifiedCoords.length > this._maxTrackPoints) + return this.findLowestTolerance(meridian, max, guess, frac); + else return this.findLowestTolerance(min, meridian, guess, frac); + }, + onBusyChanged: function(isBusy) { if (typeof isBusy === undefined) { isBusy = false; @@ -177,7 +203,7 @@ BR.routeLoader = function(map, layersControl, routing, pois) { ); }, this); - L.DomUtil.get('simplify_tolerance').onchange = L.bind(this.onToleranceSlider, this); + L.DomUtil.get('simplify_tolerance').oninput = L.bind(this.onToleranceSlider, this); L.DomUtil.get('loadedittrackFile').onchange = L.bind(this.onFileChanged, this); this.onFileChanged({ target: L.DomUtil.get('loadedittrackFile') }); @@ -294,7 +320,9 @@ BR.routeLoader = function(map, layersControl, routing, pois) { this._options.simplifyTolerance = this.guessSimplifyTolerance(this._trackPoints); var routingPoints = []; - var simplifiedLatLngs = this.getSimplifiedLatLngs(); + var simplifiedLatLngs = L.GeoJSON.coordsToLatLngs( + this.getSimplifiedCoords(this._options.simplifyTolerance) + ); for (var i = 0; i < simplifiedLatLngs.length; i++) { routingPoints.push(simplifiedLatLngs[i]); From 2c70b31376c7bddd59d125065150ef8ca64083e3 Mon Sep 17 00:00:00 2001 From: The Ripper Date: Wed, 8 Jul 2020 10:47:44 +0200 Subject: [PATCH 3/3] artefacts removed --- js/plugin/RouteLoaderConverter.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/js/plugin/RouteLoaderConverter.js b/js/plugin/RouteLoaderConverter.js index 5cb58ee..05de571 100644 --- a/js/plugin/RouteLoaderConverter.js +++ b/js/plugin/RouteLoaderConverter.js @@ -8,7 +8,6 @@ BR.routeLoader = function(map, layersControl, routing, pois) { _maxTrackPoints: 200, _closeCanceled: true, _currentGeoJSON: {}, - _counter: 0, _options: { format: undefined, showTrackLayer: true, @@ -44,7 +43,6 @@ BR.routeLoader = function(map, layersControl, routing, pois) { highQuality: true }); return simplifiedLine.coordinates; - // return L.GeoJSON.coordsToLatLngs(simplifiedLine.coordinates); }, refreshTestLayer: function() {