forked from MapComplete/MapComplete
Performance: speed up loading of the NSI
This commit is contained in:
parent
a5b3342415
commit
4b05acf338
1 changed files with 37 additions and 5 deletions
|
@ -261,6 +261,15 @@ export default class NameSuggestionIndex {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Caching for the resolved sets, as they can take a while
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
private static resolvedSets: Record<string, any> = {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all suggestions for the given type (brand|operator) and main tag.
|
||||||
|
* Can optionally be filtered by countries and location set
|
||||||
|
*
|
||||||
*
|
*
|
||||||
* @param country: a string containing one or more country codes, separated by ";"
|
* @param country: a string containing one or more country codes, separated by ";"
|
||||||
* @param location: center point of the feature, should be [lon, lat]
|
* @param location: center point of the feature, should be [lon, lat]
|
||||||
|
@ -274,24 +283,47 @@ export default class NameSuggestionIndex {
|
||||||
): NSIItem[] {
|
): NSIItem[] {
|
||||||
const path = `${type}s/${key}/${value}`
|
const path = `${type}s/${key}/${value}`
|
||||||
const entry = NameSuggestionIndex.nsiFile.nsi[path]
|
const entry = NameSuggestionIndex.nsiFile.nsi[path]
|
||||||
|
const countries = country?.split(";") ?? []
|
||||||
return entry?.items?.filter((i) => {
|
return entry?.items?.filter((i) => {
|
||||||
if (i.locationSet.include.indexOf("001") >= 0) {
|
if (i.locationSet.include.indexOf("001") >= 0) {
|
||||||
|
// this brand is spread globally
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (country === undefined) {
|
||||||
|
// IF the country is not set, we are probably in some international area, it isn't loaded yet,
|
||||||
|
// or we are in a code path where we need everything (e.g. a script)
|
||||||
|
// We just allow everything
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
country === undefined ||
|
i.locationSet.include.some((c) => countries.indexOf(c) >= 0)
|
||||||
// We prefer the countries provided by lonlat2country, they are more precise
|
|
||||||
// Country might contain multiple countries, separated by ';'
|
|
||||||
i.locationSet.include.some((c) => country.indexOf(c) >= 0)
|
|
||||||
) {
|
) {
|
||||||
|
// We prefer the countries provided by lonlat2country, they are more precise and are loaded already anyway (cheap)
|
||||||
|
// Country might contain multiple countries, separated by ';'
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (i.locationSet.exclude?.some(c => countries.indexOf(c) >= 0)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
if (location === undefined) {
|
if (location === undefined) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
const resolvedSet = NameSuggestionIndex.loco.resolveLocationSet(i.locationSet)
|
|
||||||
|
const hasSpecial = i.locationSet.include?.some(i => i.endsWith(".geojson") || Array.isArray(i)) || i.locationSet.exclude?.some(i => i.endsWith(".geojson") || Array.isArray(i))
|
||||||
|
if (!hasSpecial) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
const key = i.locationSet.include?.join(";") + "-" + i.locationSet.exclude?.join(";")
|
||||||
|
const fromCache = NameSuggestionIndex.resolvedSets[key]
|
||||||
|
const resolvedSet = fromCache ?? NameSuggestionIndex.loco.resolveLocationSet(i.locationSet)
|
||||||
|
if (!fromCache) {
|
||||||
|
NameSuggestionIndex.resolvedSets[key] = resolvedSet
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (resolvedSet) {
|
if (resolvedSet) {
|
||||||
// We actually have a location set, so we can check if the feature is in it, by determining if our point is inside the MultiPolygon using @turf/boolean-point-in-polygon
|
// We actually have a location set, so we can check if the feature is in it, by determining if our point is inside the MultiPolygon using @turf/boolean-point-in-polygon
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue