Add basic support for city outlines
Use with load_geojson( "Cities (outline, demo)", "./geojson/cities_demo.json", "outline", "black", 1, style_outlines);
This commit is contained in:
parent
3cb3078820
commit
771704bf15
@ -80,10 +80,8 @@ L.StreetLabels = L.LabelTextCollision
|
|||||||
ctx.lineWidth = this.options.fontStyle.lineWidth;
|
ctx.lineWidth = this.options.fontStyle.lineWidth;
|
||||||
|
|
||||||
var fontSize = this.options.fontStyle.fontSize;
|
var fontSize = this.options.fontStyle.fontSize;
|
||||||
|
|
||||||
if (this._map && this.options.fontStyle.dynamicFontSize === true) {
|
if (this._map && this.options.fontStyle.dynamicFontSize === true) {
|
||||||
fontSize = this._getDynamicFontSize();
|
fontSize = this._getDynamicFontSize(layer.feature);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.font = fontSize + this.options.fontStyle.fontSizeUnit + " 'Helvetica Neue',Helvetica,Arial,sans-serif";
|
ctx.font = fontSize + this.options.fontStyle.fontSizeUnit + " 'Helvetica Neue',Helvetica,Arial,sans-serif";
|
||||||
@ -98,7 +96,6 @@ L.StreetLabels = L.LabelTextCollision
|
|||||||
textWidth, textHeight));
|
textWidth, textHeight));
|
||||||
|
|
||||||
if (this.options.collisionFlg) {
|
if (this.options.collisionFlg) {
|
||||||
|
|
||||||
for (var index in this._textList) {
|
for (var index in this._textList) {
|
||||||
var pointBounds = this._textList[index];
|
var pointBounds = this._textList[index];
|
||||||
if (pointBounds.intersects(bounds)) {
|
if (pointBounds.intersects(bounds)) {
|
||||||
@ -184,7 +181,7 @@ L.StreetLabels = L.LabelTextCollision
|
|||||||
return polyline;
|
return polyline;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getDynamicFontSize: function () {
|
_getDynamicFontSize: function (layer) {
|
||||||
return parseInt(this._map.getZoom());
|
return parseInt(this._map.getZoom());
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1,13 +1,27 @@
|
|||||||
var editor_mode = 0;
|
var editor_mode = 0;
|
||||||
var mymap;
|
var mymap;
|
||||||
|
|
||||||
|
var polyconf_show_street_names = 5; // Zoom level for when to start showing street names
|
||||||
|
var polyconf_show_cities = 5; /* City outlines will be filled on this level and further away */
|
||||||
|
var polyconf_show_districts = 4; /* Shown from polyconf_show_cities until this*/
|
||||||
|
|
||||||
var streetLabelsRenderer = new L.StreetLabels({
|
var streetLabelsRenderer = new L.StreetLabels({
|
||||||
collisionFlg: true,
|
collisionFlg: true,
|
||||||
propertyName: 'name',
|
propertyName: 'name',
|
||||||
showLabelIf: function (layer) {
|
showLabelIf: function (layer) {
|
||||||
if (!(layer.geometry.type == "LineString"|| layer.geometry.type == "Polygon"))
|
switch (layer.geometry.type) {
|
||||||
|
case "LineString":
|
||||||
|
if (mymap.getZoom() <= polyconf_show_street_names)
|
||||||
return false;
|
return false;
|
||||||
if (mymap.getZoom() <= 5)
|
break;
|
||||||
|
case "Polygon":
|
||||||
|
if (mymap.getZoom() > polyconf_show_street_names)
|
||||||
return false;
|
return false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
fontStyle: {
|
fontStyle: {
|
||||||
@ -20,13 +34,33 @@ var streetLabelsRenderer = new L.StreetLabels({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
streetLabelsRenderer._getDynamicFontSize = function () {
|
streetLabelsRenderer._getDynamicFontSize = function (layer) {
|
||||||
zoom = mymap.getZoom();
|
zoom = mymap.getZoom();
|
||||||
|
|
||||||
|
switch (layer.geometry.type) {
|
||||||
|
case "LineString":
|
||||||
if (zoom <= 8)
|
if (zoom <= 8)
|
||||||
return 11;
|
return 11;
|
||||||
else
|
else
|
||||||
return 2**(zoom - 9) * 11;
|
return 2**(zoom - 9) * 11;
|
||||||
|
break;
|
||||||
|
case "Polygon":
|
||||||
|
if (zoom >= 4)
|
||||||
|
return 30;
|
||||||
|
return 20;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
var style_outlines = {
|
||||||
|
radius: 8,
|
||||||
|
fillColor: "#ff7800",
|
||||||
|
color: "black",
|
||||||
|
opacity: 1,
|
||||||
|
fillOpacity: 0.5
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// Projection fix from: https://gis.stackexchange.com/questions/200865/leaflet-crs-simple-custom-scale
|
// Projection fix from: https://gis.stackexchange.com/questions/200865/leaflet-crs-simple-custom-scale
|
||||||
@ -62,7 +96,7 @@ mymap = L.map('mapid', {
|
|||||||
renderer: streetLabelsRenderer,
|
renderer: streetLabelsRenderer,
|
||||||
editable: true,
|
editable: true,
|
||||||
crs: L.CRS.pr
|
crs: L.CRS.pr
|
||||||
}).setView([0, 0], 6);
|
}).setView([0, 0], 5);
|
||||||
|
|
||||||
var mapheight = 16384;
|
var mapheight = 16384;
|
||||||
var mapwidth = mapheight;
|
var mapwidth = mapheight;
|
||||||
@ -115,15 +149,34 @@ function load_tiles(name, id) {
|
|||||||
return satellite;
|
return satellite;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var current_location = "";
|
||||||
|
var current_feature = null;
|
||||||
|
|
||||||
function load_geojson(name, url, iconname, iconcolor, active=1, style={}) {
|
function load_geojson(name, url, iconname, iconcolor, active=1, style={}) {
|
||||||
var xhttp_ps = new XMLHttpRequest();
|
var xhttp_ps = new XMLHttpRequest();
|
||||||
xhttp_ps.onreadystatechange = function() {
|
xhttp_ps.onreadystatechange = function() {
|
||||||
if (this.readyState == 4) {
|
if (this.readyState == 4) {
|
||||||
if (this.status == 200) {
|
if (this.status == 200) {
|
||||||
switch (iconname) {
|
|
||||||
case "street":
|
|
||||||
onEachFeature = null;
|
onEachFeature = null;
|
||||||
pointToLayer = null;
|
pointToLayer = null;
|
||||||
|
filter = null;
|
||||||
|
|
||||||
|
switch (iconname) {
|
||||||
|
case "street":
|
||||||
|
onEachFeature = function(feature, layer) {
|
||||||
|
layer.on("click", function (e) {
|
||||||
|
current_feature = feature;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case "outline":
|
||||||
|
onEachFeature = function(feature, layer) {
|
||||||
|
layer.myTag = iconname;
|
||||||
|
layer.myName = name;
|
||||||
|
layer.on("click", function (e) {
|
||||||
|
current_location = feature.properties.name;
|
||||||
|
});
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default: /* else it is a marker with the specified icon */
|
default: /* else it is a marker with the specified icon */
|
||||||
onEachFeature = function(feature, layer) {
|
onEachFeature = function(feature, layer) {
|
||||||
@ -151,12 +204,14 @@ function load_geojson(name, url, iconname, iconcolor, active=1, style={}) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
var json = JSON.parse(xhttp_ps.responseText);
|
var json = JSON.parse(xhttp_ps.responseText);
|
||||||
var geojson = L.geoJSON(json, {
|
geojson = L.geoJSON(json, {
|
||||||
style: style,
|
style: style,
|
||||||
onEachFeature: onEachFeature,
|
onEachFeature: onEachFeature,
|
||||||
pointToLayer: pointToLayer
|
pointToLayer: pointToLayer,
|
||||||
|
filter: filter
|
||||||
});
|
});
|
||||||
layers.addOverlay(geojson, name);
|
layers.addOverlay(geojson, name);
|
||||||
|
|
||||||
if (active)
|
if (active)
|
||||||
geojson.addTo(mymap);
|
geojson.addTo(mymap);
|
||||||
return geojson;
|
return geojson;
|
||||||
@ -351,7 +406,16 @@ var baseballIcon = L.AwesomeMarkers.icon({
|
|||||||
});
|
});
|
||||||
|
|
||||||
function onMapClick(e) {
|
function onMapClick(e) {
|
||||||
popup.setLatLng(e.latlng).setContent("You clicked the map at " + e.latlng.toString()).openOn(mymap);
|
var addinfo = "";
|
||||||
|
if (current_location != "")
|
||||||
|
addinfo = " (part of " + current_location + ")";
|
||||||
|
if (current_feature) {
|
||||||
|
popup.setLatLng(e.latlng).setContent("This is " + current_feature.properties.name + addinfo).openOn(mymap);
|
||||||
|
} else {
|
||||||
|
popup.setLatLng(e.latlng).setContent("You clicked the map at " + e.latlng.toString() + addinfo).openOn(mymap);
|
||||||
|
}
|
||||||
|
current_feature = null;
|
||||||
|
current_location = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
mymap.on('click', onMapClick);
|
mymap.on('click', onMapClick);
|
||||||
@ -394,13 +458,31 @@ function update_street_width() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function update_outline_visibility() {
|
||||||
|
zoom = mymap.getZoom();
|
||||||
|
mymap.eachLayer( function(layer) {
|
||||||
|
if ( layer.myTag && layer.myTag === "outline") {
|
||||||
|
var opacity;
|
||||||
|
if (zoom <= polyconf_show_cities)
|
||||||
|
opacity = 0.5;
|
||||||
|
//else if (zoom == polyconf_show_cities + 1)
|
||||||
|
// opacity = 0.2;
|
||||||
|
else
|
||||||
|
opacity = 0.0;
|
||||||
|
|
||||||
|
layer.setStyle({fillOpacity: opacity});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
mymap.on('zoomend', function () {is_user_drag = 1; update_hash_from_position();});
|
mymap.on('zoomend', function () {is_user_drag = 1; update_hash_from_position();});
|
||||||
mymap.on('zoomend', update_aa_status);
|
mymap.on('zoomend', update_aa_status);
|
||||||
mymap.on('zoomend', update_street_width);
|
mymap.on('zoomend', update_street_width);
|
||||||
|
mymap.on('zoomend', update_outline_visibility);
|
||||||
mymap.on('moveend', update_hash_from_position);
|
mymap.on('moveend', update_hash_from_position);
|
||||||
mymap.on('dragstart', function () { is_user_drag = 1;});
|
mymap.on('dragstart', function () { is_user_drag = 1;});
|
||||||
mymap.on('keydown', function (e) { if (e.originalEvent.code.match(/Arrow.*/)) is_user_drag = 1;});
|
mymap.on('keydown', function (e) { if (e.originalEvent.code.match(/Arrow.*/)) is_user_drag = 1;});
|
||||||
|
mymap.on('overlayadd', function (e) { update_street_width(); update_outline_visibility(); });
|
||||||
function onHashChange(e, hash=null) {
|
function onHashChange(e, hash=null) {
|
||||||
if (!hash)
|
if (!hash)
|
||||||
hash = document.location.hash;
|
hash = document.location.hash;
|
||||||
@ -417,4 +499,3 @@ function onHashChange(e, hash=null) {
|
|||||||
|
|
||||||
window.addEventListener("hashchange", onHashChange, false);
|
window.addEventListener("hashchange", onHashChange, false);
|
||||||
onHashChange(null);
|
onHashChange(null);
|
||||||
update_street_width();
|
|
||||||
|
Loading…
Reference in New Issue
Block a user