Merge pull request #227 from nrenner/nogo-fixes

Nogo fixes for GeometryCollection geojson + minor UI
This commit is contained in:
Gautier P 2019-08-10 19:36:10 +02:00 committed by GitHub
commit ce9e34283b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 140 additions and 112 deletions

View file

@ -11,7 +11,7 @@
// TODO not included in permalink (better replace permalink with hash plugin)
//BR.conf.transit = params.has('transit') && (params.get('transit') === 'true');
if (hostname === 'brouter.de' ) {
if (hostname === 'brouter.de') {
// online service (brouter.de) configuration
BR.conf.profiles = [

View file

@ -457,7 +457,11 @@
</button>
</div>
<div class="modal-body">
<p id="nogoError" style="display: none;"></p>
<p
id="nogoError"
class="invalid-feedback"
style="display: none;"
></p>
<form>
<fieldset>
<legend data-i18n="loadNogos.source">
@ -478,10 +482,11 @@
<label
for="nogoFile"
data-i18n="loadNogos.file"
>File:
>File (.geojson):
</label>
<input
type="file"
accept=".geojson"
name="nogoFile"
id="nogoFile"
/>
@ -495,26 +500,28 @@
<label
for="nogoWeight"
data-i18n="loadNogos.nogoWeight"
>No-go weight:
>No-go weight (-1 means impassable):
</label>
<input
type="number"
name="nogoWeight"
id="nogoWeight"
value="-1"
min="-1"
/>
</p>
<p>
<label
for="nogoRadius"
data-i18n="loadNogos.nogoRadius"
>No-go radius (for points):
>No-go radius for points (in meters):
</label>
<input
type="number"
name="nogoRadius"
id="nogoRadius"
value="20"
min="0"
/>
</p>
<p>
@ -528,6 +535,7 @@
name="nogoBuffer"
id="nogoBuffer"
value="0"
min="0"
/>
</p>
</fieldset>

View file

@ -409,109 +409,6 @@
$(this).collapse('show');
}
});
$('#submitNogos').on('click', function() {
var geoJSONPromise;
var nogoURL = $('#nogoURL').val();
var nogoFile = $('#nogoFile')[0].files[0];
if (nogoURL) {
// TODO: Handle {{bbox}}
geoJSONPromise = fetch(nogoURL).then(function(response) {
response.json();
});
} else if (nogoFile) {
geoJSONPromise = new Promise(function(resolve, reject) {
var reader = new FileReader();
reader.onload = function() {
resolve(reader.result);
};
reader.readAsText(nogoFile);
}).then(function(response) {
return JSON.parse(response);
});
} else {
$('#nogoError').text('Error: Missing file or URL.');
$('#nogoError').css('display', 'block');
return false;
}
var nogoWeight = parseFloat($('#nogoWeight').val());
if (isNaN(nogoWeight)) {
$('#nogoError').text('Error: Missing default nogo weight.');
$('#nogoError').css('display', 'block');
return false;
}
var nogoRadius = parseFloat($('#nogoRadius').val());
if (isNaN(nogoRadius) || nogoRadius < 0) {
$('#nogoError').text('Error: Invalid default nogo radius.');
$('#nogoError').css('display', 'block');
return false;
}
var nogoBuffer = parseFloat($('#nogoBuffer').val());
if (isNaN(nogoBuffer)) {
$('#nogoError').text('Error: Invalid nogo buffering radius.');
$('#nogoError').css('display', 'block');
return false;
}
geoJSONPromise.then(function(response) {
// Iterate on features in order to discard features without geometry
var cleanedGeoJSONFeatures = [];
turf.featureEach(response, function(feature) {
if (turf.getGeom(feature)) {
var maybeBufferedFeature = feature;
// Eventually buffer GeoJSON
if (nogoBuffer != 0) {
maybeBufferedFeature = turf.buffer(
maybeBufferedFeature,
nogoBuffer,
{ units: 'meters' }
);
}
cleanedGeoJSONFeatures.push(maybeBufferedFeature);
}
});
var geoJSON = L.geoJson(
turf.featureCollection(cleanedGeoJSONFeatures),
{
onEachFeature: function(feature, layer) {
layer.options.nogoWeight =
feature.properties.nogoWeight || nogoWeight;
}
}
);
var nogosPoints = geoJSON.getLayers().filter(function(e) {
return e.feature.geometry.type === 'Point';
});
nogosPoints = nogosPoints.map(function(item) {
var radius = item.feature.properties.radius || nogoRadius;
if (radius > 0) {
return L.circle(item.getLatLng(), { radius: radius });
}
return null;
});
nogosPoints = nogosPoints.filter(function(e) {
return e;
});
nogos.setOptions({
nogos: nogosPoints,
polygons: geoJSON.getLayers().filter(function(e) {
return e.feature.geometry.type === 'Polygon';
}),
polylines: geoJSON.getLayers().filter(function(e) {
return e.feature.geometry.type === 'LineString';
})
});
updateRoute({
options: nogos.getOptions()
});
urlHash.onMapMove();
$('#nogoError').text('');
$('#nogoError').css('display', 'none');
$('#loadNogos').modal('hide');
});
return false;
});
}
i18next

View file

@ -33,6 +33,8 @@ BR.NogoAreas = L.Control.extend({
onAdd: function(map) {
var self = this;
$('#submitNogos').on('click', L.bind(this.uploadNogos, this));
this.drawnItems = new L.FeatureGroup().addTo(map);
this.drawnItems.on('click', function(e) {
L.DomEvent.stop(e);
@ -118,6 +120,125 @@ BR.NogoAreas = L.Control.extend({
return L.DomUtil.create('div');
},
displayUploadError: function(message) {
$('#nogoError').text(message ? message : '');
$('#nogoError').css('display', message ? 'block' : 'none');
},
uploadNogos: function() {
var self = this;
var geoJSONPromise;
var nogoURL = $('#nogoURL').val();
var nogoFile = $('#nogoFile')[0].files[0];
if (nogoURL) {
// TODO: Handle {{bbox}}
geoJSONPromise = fetch(nogoURL).then(function(response) {
response.json();
});
} else if (nogoFile) {
geoJSONPromise = new Promise(function(resolve, reject) {
var reader = new FileReader();
reader.onload = function() {
resolve(reader.result);
};
reader.onerror = function() {
self.displayUploadError(
'Could not load file: ' + reader.error.message
);
};
reader.readAsText(nogoFile);
}).then(function(response) {
return JSON.parse(response);
});
} else {
// FIXME: use form validator instead
self.displayUploadError('Missing file or URL.');
return false;
}
var nogoWeight = parseFloat($('#nogoWeight').val());
if (isNaN(nogoWeight)) {
// FIXME: use form validator instead
self.displayUploadError('Missing default nogo weight.');
return false;
}
var nogoRadius = parseFloat($('#nogoRadius').val());
if (isNaN(nogoRadius) || nogoRadius < 0) {
// FIXME: use form validator instead
self.displayUploadError('Invalid default nogo radius.');
return false;
}
var nogoBuffer = parseFloat($('#nogoBuffer').val());
if (isNaN(nogoBuffer)) {
// FIXME: use form validator instead
self.displayUploadError('Invalid nogo buffering radius.');
return false;
}
geoJSONPromise.then(function(response) {
// Iterate on features in order to discard features without geometry
var cleanedGeoJSONFeatures = [];
turf.flattenEach(response, function(feature) {
if (turf.getGeom(feature)) {
var maybeBufferedFeature = feature;
// Eventually buffer GeoJSON
if (nogoBuffer !== 0) {
maybeBufferedFeature = turf.buffer(
maybeBufferedFeature,
nogoBuffer,
{ units: 'meters' }
);
}
cleanedGeoJSONFeatures.push(maybeBufferedFeature);
}
});
if (cleanedGeoJSONFeatures.length === 0) {
self.displayUploadError(
'No valid area found in provided input.'
);
return false;
}
var geoJSON = L.geoJson(
turf.featureCollection(cleanedGeoJSONFeatures),
{
onEachFeature: function(feature, layer) {
layer.options.nogoWeight =
feature.properties.nogoWeight || nogoWeight;
}
}
);
var nogosPoints = geoJSON.getLayers().filter(function(e) {
return e.feature.geometry.type === 'Point';
});
nogosPoints = nogosPoints.map(function(item) {
var radius = item.feature.properties.radius || nogoRadius;
if (radius > 0) {
return L.circle(item.getLatLng(), { radius: radius });
}
return null;
});
nogosPoints = nogosPoints.filter(function(e) {
return e;
});
self.setOptions({
nogos: nogosPoints,
polygons: geoJSON.getLayers().filter(function(e) {
return e.feature.geometry.type === 'Polygon';
}),
polylines: geoJSON.getLayers().filter(function(e) {
return e.feature.geometry.type === 'LineString';
})
});
self._fireUpdate();
self.displayUploadError(undefined);
$('#loadNogos').modal('hide');
});
return false;
},
// prevent route waypoint added after circle create (map click after up)
preventRoutePointOnCreate: function(routing) {
this.editTools.on(

View file

@ -3,7 +3,9 @@
var brouterCgi = (function() {
// http://brouter.de/cgi-bin/brouter.sh?coords=13.404681_52.520185_13.340278_52.512356_trekking_0
//var URL_TEMPLATE = '/cgi-bin/proxy.cgi?url=' + 'http://brouter.de/cgi-bin/brouter.sh?coords={fromLng}_{fromLat}_{toLng}_{toLat}_{profile}_{alt}';
var URL_TEMPLATE = '/proxy.php?url=' + 'cgi-bin/brouter.sh?coords={fromLng}_{fromLat}_{toLng}_{toLat}_{profile}_{alt}';
var URL_TEMPLATE =
'/proxy.php?url=' +
'cgi-bin/brouter.sh?coords={fromLng}_{fromLat}_{toLng}_{toLat}_{profile}_{alt}';
var PRECISION = 6;
function getUrl(polyline) {

View file

@ -61,11 +61,11 @@
},
"loadNogos": {
"defaultProperties": "Default properties",
"file": "File: ",
"file": "File (.geojson): ",
"load": "Load",
"nogoBuffer": "Buffer no-go areas (in meters): ",
"nogoRadius": "No-go radius (for points): ",
"nogoWeight": "No-go weight: ",
"nogoRadius": "No-go radius for points (in meters): ",
"nogoWeight": "No-go weight (-1 means impassable): ",
"source": "Source",
"title": "Load no-go areas",
"url": "URL: "