2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  { BBox ,  GeoOperations }  from  "./GeoOperations" ;  
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  Combine  from  "../UI/Base/Combine" ;  
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  RelationsTracker  from  "./Osm/RelationsTracker" ;  
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  State  from  "../State" ;  
						 
					
						
							
								
									
										
										
										
											2021-06-15 00:28:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  BaseUIElement  from  "../UI/BaseUIElement" ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  List  from  "../UI/Base/List" ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  Title  from  "../UI/Base/Title" ;  
						 
					
						
							
								
									
										
										
										
											2021-07-26 20:21:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  { UIEventSourceTools }  from  "./UIEventSource" ;  
						 
					
						
							
								
									
										
										
										
											2021-07-27 12:11:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  AspectedRouting  from  "./Osm/aspectedRouting" ;  
						 
					
						
							
								
									
										
										
										
											2021-07-26 20:21:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								export  interface  ExtraFuncParams  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    / * * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Gets  all  the  features  from  the  given  layer  within  the  given  BBOX . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Note  that  more  features  then  requested  can  be  given  back . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  Format :  [  [  geojson ,  geojson ,  geojson ,  . . .  ] ,  [ geojson ,  . . . ] ,  . . . ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    getFeaturesWithin :  ( layerId : string ,  bbox : BBox )  = >  any [ ] [ ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    memberships : RelationsTracker 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								export  class  ExtraFunction  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-15 00:28:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    static  readonly  intro  =  new  Combine ( [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new  Title ( "Calculating tags with Javascript" ,  2 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "In some cases, it is useful to have some tags calculated based on other properties. Some useful tags are available by default (e.g. `lat`, `lon`, `_country`), as detailed above." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "It is also possible to calculate your own tags - but this requires some javascript knowledge." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "Before proceeding, some warnings:" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new  List ( [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            "DO NOT DO THIS AS BEGINNER" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            "**Only do this if all other techniques fail**  This should _not_ be done to create a rendering effect, only to calculate a specific value" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            "**THIS MIGHT BE DISABLED WITHOUT ANY NOTICE ON UNOFFICIAL THEMES** As unofficial themes might be loaded from the internet, this is the equivalent of injecting arbitrary code into the client. It'll be disabled if abuse occurs." 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ] ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "To enable this feature,  add a field `calculatedTags` in the layer object, e.g.:" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "````" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "\"calculatedTags\": [" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "    \"_someKey=javascript-expression\"," , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "    \"name=feat.properties.name ?? feat.properties.ref ?? feat.properties.operator\"," , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "    \"_distanceCloserThen3Km=feat.distanceTo( some_lon, some_lat) < 3 ? 'yes' : 'no'\" " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "  ]" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "````" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "The above code will be executed for every feature in the layer. The feature is accessible as `feat` and is an amended geojson object:" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new  List ( [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            "`area` contains the surface area (in square meters) of the object" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            "`lat` and `lon` contain the latitude and longitude" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ] ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "Some advanced functions are available on **feat** as well:" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] ) . SetClass ( "flex-col" ) . AsMarkdown ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 18:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    private  static  readonly  OverlapFunc  =  new  ExtraFunction ( 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 20:21:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            name :  "overlapWith" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            doc :  "Gives a list of features from the specified layer which this feature (partly) overlaps with. "  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                "If the current feature is a point, all features that embed the point are given. "  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                "The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature is a point.\n"  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                "\n"  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                "For example to get all objects which overlap or embed from a layer, use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')`" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 20:21:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            args :  [ "...layerIds - one or more layer ids  of the layer from which every feature is checked for overlap)" ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-22 13:30:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ( params ,  feat )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-26 03:24:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  ( . . . layerIds : string [ ] )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                const  result  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                const  bbox  =  BBox . get ( feat ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-03-26 03:24:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                for  ( const  layerId  of  layerIds )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    const  otherLayers  =  params . getFeaturesWithin ( layerId ,  bbox ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  ( otherLayers  ===  undefined )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-26 03:24:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  ( otherLayers . length  ===  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-26 03:24:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    for  ( const  otherLayer  of  otherLayers )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        result . push ( . . . GeoOperations . calculateOverlap ( feat ,  otherLayer ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-26 03:24:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  result ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    private  static  readonly  DistanceToFunc  =  new  ExtraFunction ( 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 20:21:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            name :  "distanceTo" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            doc :  "Calculates the distance between the feature and a specified point in kilometer. The input should either be a pair of coordinates, a geojson feature or the ID of an object" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-22 05:02:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            args :  [ "feature OR featureID OR longitude" ,  "undefined OR latitude" ] 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 20:21:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-26 03:24:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ( featuresPerLayer ,  feature )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  ( arg0 ,  lat )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( arg0  ===  undefined )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    return  undefined ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( typeof  arg0  ===  "number" )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    // Feature._lon and ._lat is conveniently place by one of the other metatags
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-12 19:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    return  GeoOperations . distanceBetween ( [ arg0 ,  lat ] ,  [ feature . _lon ,  feature . _lat ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( typeof  arg0  ===  "string" )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    // This is an identifier
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    const  feature  =  State . state . allElements . ContainingFeatures . get ( arg0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-15 00:28:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  ( feature  ===  undefined )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        return  undefined ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    arg0  =  feature ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                // arg0 is probably a feature
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  GeoOperations . distanceBetween ( GeoOperations . centerpointCoordinates ( arg0 ) ,  [ feature . _lon ,  feature . _lat ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    private  static  readonly  ClosestObjectFunc  =  new  ExtraFunction ( 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 20:21:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            name :  "closest" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            doc :  "Given either a list of geojson features or a single layer name, gives the single object which is nearest to the feature. In the case of ways/polygons, only the centerpoint is considered. Returns a single geojson feature or undefined if nothing is found (or not yet laoded)" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 20:21:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            args :  [ "list of features" ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-22 13:30:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ( params ,  feature )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  ( features )  = >  ExtraFunction . GetClosestNFeatures ( params ,  feature ,  features ) ? . [ 0 ] ? . feat 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    private  static  readonly  ClosestNObjectFunc  =  new  ExtraFunction ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            name :  "closestn" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-22 05:02:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            doc :  "Given either a list of geojson features or a single layer name, gives the n closest objects which are nearest to the feature (excluding the feature itself). In the case of ways/polygons, only the centerpoint is considered. "  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                "Returns a list of `{feat: geojson, distance:number}` the empty list if nothing is found (or not yet loaded)\n\n"  + 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                "If a 'unique tag key' is given, the tag with this key will only appear once (e.g. if 'name' is given, all features will have a different name)" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-22 05:02:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            args :  [ "list of features or layer name" ,  "amount of features" ,  "unique tag key (optional)" ,  "maxDistanceInMeters (optional)" ] 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ( params ,  feature )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-22 17:15:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								           
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  ( features ,  amount ,  uniqueTag ,  maxDistanceInMeters )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                let  distance  : number  =  Number ( maxDistanceInMeters ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if ( isNaN ( distance ) ) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    distance  =  undefined 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  ExtraFunction . GetClosestNFeatures ( params ,  feature ,  features ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    maxFeatures : Number ( amount ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    uniqueTag : uniqueTag , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    maxDistance : distance 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    private  static  readonly  Memberships  =  new  ExtraFunction ( 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 20:21:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            name :  "memberships" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            doc :  "Gives a list of `{role: string, relation: Relation}`-objects, containing all the relations that this feature is part of. "  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                "\n\n"  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                "For example: `_part_of_walking_routes=feat.memberships().map(r => r.relation.tags.name).join(';')`" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            args :  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ( params ,  feat )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  ( )  = > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                params . memberships . knownRelations . data . get ( feat . properties . id )  ? ?  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 18:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    private  static  readonly  AspectedRouting  =  new  ExtraFunction ( 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 20:21:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            name :  "score" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            doc :  "Given the path of an aspected routing json file, will calculate the score. This score is wrapped in a UIEventSource, so for further calculations, use `.map(score => ...)`"  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                "\n\n"  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                "For example: `_comfort_score=feat.score('https://raw.githubusercontent.com/pietervdvn/AspectedRouting/master/Examples/bicycle/aspects/bicycle.comfort.json')`" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            args :  [ "path" ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ( _ ,  feature )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  ( path )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  UIEventSourceTools . downloadJsonCached ( path ) . map ( config  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  ( config  ===  undefined )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-27 11:34:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    return  new  AspectedRouting ( config ) . evaluate ( feature . properties ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 20:21:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 18:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    private  static  readonly  allFuncs : ExtraFunction [ ]  =  [ 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 20:21:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ExtraFunction . DistanceToFunc , 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 18:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ExtraFunction . OverlapFunc , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ExtraFunction . ClosestObjectFunc , 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ExtraFunction . ClosestNObjectFunc , 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 18:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ExtraFunction . Memberships , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ExtraFunction . AspectedRouting 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    private  readonly  _name : string ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    private  readonly  _args : string [ ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    private  readonly  _doc : string ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    private  readonly  _f :  ( params : ExtraFuncParams ,  feat : any )  = >  any ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 20:21:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    constructor ( options :  {  name : string ,  doc : string ,  args : string [ ]  } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                f :  ( ( params : ExtraFuncParams ,  feat : any )  = >  any ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 20:21:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        this . _name  =  options . name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        this . _doc  =  options . doc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        this . _args  =  options . args ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        this . _f  =  f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  static  FullPatchFeature ( params : ExtraFuncParams ,  feature )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        for  ( const  func  of  ExtraFunction . allFuncs )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            func . PatchFeature ( params ,  feature ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-15 00:28:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  static  HelpText ( ) :  BaseUIElement  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const  elems  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( const  func  of  ExtraFunction . allFuncs )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            elems . push ( new  Title ( func . _name ,  3 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                func . _doc , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                new  List ( func . _args ,  true ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        return  new  Combine ( [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ExtraFunction . intro , 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-15 00:28:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            new  List ( ExtraFunction . allFuncs . map ( func  = >  func . _name ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            . . . elems 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    / * * 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     *  Gets  the  closes  N  features ,  sorted  by  ascending  distance . 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @param  params : The  link  to  mapcomplete  state 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @param  feature : The  central  feature  under  consideration 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @param  features : The  other  features 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @param  options : maxFeatures :  The  maximum  amount  of  features  to  be  returned .  Default : 1 ;  uniqueTag : returned  features  are  not  allowed  to  have  the  same  value  for  this  key ;  maxDistance : stop  searching  if  it  is  too  far  away  ( in  meter ) .  Default : 500m 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @constructor 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *  @private 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     * / 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    private  static  GetClosestNFeatures ( params : ExtraFuncParams , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                       feature : any , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                       features : string  |  any [ ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                       options ? :  {  maxFeatures? : number ,  uniqueTag? : string  |  undefined ,  maxDistance? : number  } ) :  {  feat : any ,  distance : number  } [ ]  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        const  maxFeatures  =  options ? . maxFeatures  ? ?  1 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        const  maxDistance  =  options ? . maxDistance  ? ?  500 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const  uniqueTag : string  |  undefined  =  options ? . uniqueTag 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( typeof  features  ===  "string" )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            const  name  =  features 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            const  bbox  =  GeoOperations . bbox ( GeoOperations . buffer ( GeoOperations . bbox ( feature ) ,  maxDistance ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            features  =  params . getFeaturesWithin ( name ,  new  BBox ( bbox . geometry . coordinates ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } else { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            features  =  [ features ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( features  ===  undefined )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        let  closestFeatures :  {  feat : any ,  distance : number  } [ ]  =  [ ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for ( const  featureList  of  features )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( const  otherFeature  of  featureList )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-26 17:36:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( otherFeature  ===  feature  ||  otherFeature . id  ===  feature . id )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    continue ;  // We ignore self
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                let  distance  =  undefined ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( otherFeature . _lon  !==  undefined  &&  otherFeature . _lat  !==  undefined )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    distance  =  GeoOperations . distanceBetween ( [ otherFeature . _lon ,  otherFeature . _lat ] ,  [ feature . _lon ,  feature . _lat ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    distance  =  GeoOperations . distanceBetween ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        GeoOperations . centerpointCoordinates ( otherFeature ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        [ feature . _lon ,  feature . _lat ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-26 17:36:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( distance  ===  undefined  ||  distance  ===  null )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    console . error ( "Could not calculate the distance between" ,  feature ,  "and" ,  otherFeature ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    throw  "Undefined distance!" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( distance  >  maxDistance )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( closestFeatures . length  ===  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    closestFeatures . push ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        feat : otherFeature , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        distance : distance 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( closestFeatures . length  >=  maxFeatures  &&  closestFeatures [ maxFeatures  -  1 ] . distance  <  distance )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    // The last feature of the list (and thus the furthest away is still closer
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    // No use for checking, as we already have plenty of features!
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                let  targetIndex  =  closestFeatures . length 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  ( let  i  =  0 ;  i  <  closestFeatures . length ;  i ++ )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    const  closestFeature  =  closestFeatures [ i ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  ( uniqueTag  !==  undefined )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        const  uniqueTagsMatch  =  otherFeature . properties [ uniqueTag ]  !==  undefined  && 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            closestFeature . feat . properties [ uniqueTag ]  ===  otherFeature . properties [ uniqueTag ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        if  ( uniqueTagsMatch )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            targetIndex  =  - 1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            if  ( closestFeature . distance  >  distance )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                // This is a very special situation:
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                // We want to see the tag `uniquetag=some_value` only once in the entire list (e.g. to prevent road segements of identical names to fill up the list of 'names of nearby roads')
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                // AT this point, we have found a closer segment with the same, identical tag
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                // so we replace directly
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                closestFeatures [ i ]  =  { feat : otherFeature ,  distance : distance } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            break ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  ( closestFeature . distance  >  distance )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        targetIndex  =  i 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        if  ( uniqueTag  !==  undefined )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            const  uniqueValue  =  otherFeature . properties [ uniqueTag ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            // We might still have some other values later one with the same uniquetag that have to be cleaned
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            for  ( let  j  =  i ;  j  <  closestFeatures . length ;  j ++ )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                if  ( closestFeatures [ j ] . feat . properties [ uniqueTag ]  ===  uniqueValue )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                    closestFeatures . splice ( j ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            } 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        } 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        break ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( targetIndex  ==  - 1 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    continue ;  // value is already swapped by the unique tag
 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( targetIndex  <  maxFeatures )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    // insert and drop one
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    closestFeatures . splice ( targetIndex ,  0 ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        feat : otherFeature , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        distance : distance 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  ( closestFeatures . length  >=  maxFeatures )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        closestFeatures . splice ( maxFeatures ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    // Overwrite the last element
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    closestFeatures [ targetIndex ]  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        feat : otherFeature , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        distance : distance 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  closestFeatures ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  PatchFeature ( params : ExtraFuncParams ,  feature : any )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        feature [ this . _name ]  =  this . _f ( params ,  feature ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-11 11:47:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}