Automatically cluster maps with more then 250 elements

This commit is contained in:
pietervdvn 2021-01-05 00:21:00 +01:00
parent 46b05d7410
commit 4dacfd157a
5 changed files with 19 additions and 13 deletions

View file

@ -25,7 +25,8 @@ export default class LayoutConfig {
public readonly defaultBackgroundId?: string; public readonly defaultBackgroundId?: string;
public readonly layers: LayerConfig[]; public readonly layers: LayerConfig[];
public readonly clustering?: { public readonly clustering?: {
maxZoom: number maxZoom: number,
minNeededElements: number
}; };
public readonly hideFromOverview: boolean; public readonly hideFromOverview: boolean;
@ -89,21 +90,22 @@ export default class LayoutConfig {
}); });
this.clustering = undefined; this.clustering = {
maxZoom: 16,
minNeededElements: 250
};
if(json.clustering){ if(json.clustering){
this.clustering = { this.clustering = {
maxZoom : json.clustering.maxZoom ?? 18 maxZoom : json.clustering.maxZoom ?? 18,
minNeededElements: json.clustering.minNeededElements ?? 1
} }
}
if(this.clustering){
for (const layer of this.layers) { for (const layer of this.layers) {
if(layer.wayHandling !== LayerConfig.WAYHANDLING_CENTER_ONLY){ if(layer.wayHandling !== LayerConfig.WAYHANDLING_CENTER_ONLY){
console.error("WARNING: In order to allow clustering, every layer must be set to CENTER_ONLY. Layer", layer.id,"does not respect this for layout",this.id); console.error("WARNING: In order to allow clustering, every layer must be set to CENTER_ONLY. Layer", layer.id,"does not respect this for layout",this.id);
} }
} }
} }
this.hideFromOverview = json.hideFromOverview ?? false; this.hideFromOverview = json.hideFromOverview ?? false;
this.enableUserBadge = json.enableUserBadge ?? true; this.enableUserBadge = json.enableUserBadge ?? true;

View file

@ -128,9 +128,15 @@ export interface LayoutConfigJson {
*/ */
clustering?: { clustering?: {
/** /**
* All zoom levels above 'maxzoom' are not clustered anymore * All zoom levels above 'maxzoom' are not clustered anymore.
* Defaults to 18
*/ */
maxZoom?: number maxZoom?: number,
/**
* The number of elements that should be showed (in total) before clustering starts to happen.
* If clustering is defined, defaults to 0
*/
minNeededElements?: number
}, },
/** /**

View file

@ -1,7 +1,7 @@
import { Utils } from "../Utils"; import { Utils } from "../Utils";
export default class Constants { export default class Constants {
public static vNumber = "0.2.7-rc5"; public static vNumber = "0.2.7-rc6";
// The user journey states thresholds when a new feature gets unlocked // The user journey states thresholds when a new feature gets unlocked
public static userJourney = { public static userJourney = {

View file

@ -76,13 +76,11 @@ export default class State {
This message is shown full screen on mobile devices This message is shown full screen on mobile devices
*/ */
public readonly fullScreenMessage = new UIEventSource<UIElement>(undefined) public readonly fullScreenMessage = new UIEventSource<UIElement>(undefined)
.addCallback(fs => console.log("Fullscreen message is", fs));
/** /**
The latest element that was selected - used to generate the right UI at the right place The latest element that was selected - used to generate the right UI at the right place
*/ */
public readonly selectedElement = new UIEventSource<any>(undefined) public readonly selectedElement = new UIEventSource<any>(undefined)
.addCallback(selected => console.log("Selected element is", selected));
public readonly featureSwitchUserbadge: UIEventSource<boolean>; public readonly featureSwitchUserbadge: UIEventSource<boolean>;
public readonly featureSwitchSearch: UIEventSource<boolean>; public readonly featureSwitchSearch: UIEventSource<boolean>;

View file

@ -42,7 +42,7 @@ export default class ShowDataLayer {
const feats = features.data.map(ff => ff.feature); const feats = features.data.map(ff => ff.feature);
let geoLayer = self.CreateGeojsonLayer(feats) let geoLayer = self.CreateGeojsonLayer(feats)
if (layoutToUse.clustering !== undefined) { if (layoutToUse.clustering.minNeededElements <= features.data.length) {
const cl = window["L"]; const cl = window["L"];
const cluster = cl.markerClusterGroup({ disableClusteringAtZoom: layoutToUse.clustering.maxZoom }); const cluster = cl.markerClusterGroup({ disableClusteringAtZoom: layoutToUse.clustering.maxZoom });
cluster.addLayer(geoLayer); cluster.addLayer(geoLayer);