2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  {  GeoOperations  }  from  "./GeoOperations"  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  Combine  from  "../UI/Base/Combine"  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  RelationsTracker  from  "./Osm/RelationsTracker"  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  BaseUIElement  from  "../UI/BaseUIElement"  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  List  from  "../UI/Base/List"  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  Title  from  "../UI/Base/Title"  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  {  BBox  }  from  "./BBox"  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  {  Feature ,  Geometry ,  MultiPolygon ,  Polygon  }  from  "@turf/turf"  
						 
					
						
							
								
									
										
										
										
											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 ,  . . . ] ,  . . . ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * / 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    getFeaturesWithin :  ( layerId : string ,  bbox : BBox )  = >  Feature < Geometry ,  {  id :  string  } > [ ] [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    memberships : RelationsTracker 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-29 20:04:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    getFeatureById :  ( id : string )  = >  Feature < Geometry ,  {  id :  string  } > 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								/ * *  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 *  Describes  a  function  that  is  added  to  a  geojson  object  in  order  to  calculate  calculated  tags 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								 * / 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								interface  ExtraFunction  {  
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    readonly  _name : string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    readonly  _args : string [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    readonly  _doc : string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    readonly  _f :  ( params : ExtraFuncParams ,  feat : Feature < Geometry ,  any > )  = >  any 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  EnclosingFunc  implements  ExtraFunction  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _name  =  "enclosingFeatures" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _doc  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "Gives a list of all features in the specified layers which fully contain this object. Returned features will always be (multi)polygons. (LineStrings and Points from the other layers are ignored)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "The result is a list of features: `{feat: Polygon}[]`" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "This function will never return the feature itself." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] . join ( "\n" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _args  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-29 20:04:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _f ( params : ExtraFuncParams ,  feat : Feature < Geometry ,  any > )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  ( . . . layerIds : string [ ] )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            const  result :  {  feat : any  } [ ]  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            const  bbox  =  BBox . get ( feat ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            const  seenIds  =  new  Set < string > ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            seenIds . add ( feat . properties . id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( const  layerId  of  layerIds )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                const  otherFeaturess  =  params . getFeaturesWithin ( layerId ,  bbox ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( otherFeaturess  ===  undefined )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    continue 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( otherFeaturess . length  ===  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    continue 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  ( const  otherFeatures  of  otherFeaturess )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    for  ( const  otherFeature  of  otherFeatures )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-29 20:04:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        if  ( seenIds . has ( otherFeature . properties . id ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        seenIds . add ( otherFeature . properties . id ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        if  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            otherFeature . geometry . type  !==  "Polygon"  && 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            otherFeature . geometry . type  !==  "MultiPolygon" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            continue 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        } 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        if  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            GeoOperations . completelyWithin ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                feat , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                < Feature < Polygon  |  MultiPolygon ,  any > > otherFeature 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            result . push ( {  feat : otherFeature  } ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  result 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  OverlapFunc  implements  ExtraFunction  {  
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _name  =  "overlapWith" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _doc  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "Gives a list of features from the specified layer which this feature (partly) overlaps with. A point which is embedded in the feature is detected as well." , 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-29 20:04:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "If the current feature is a point, all features that this point is embeded in are given." , 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-29 20:04:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "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." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "The resulting list is sorted in descending order by overlap. The feature with the most overlap will thus be the first in the list." , 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "For example to get all objects which overlap or embed from a layer, use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')`" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "Also see [enclosingFeatures](#enclosingFeatures) which can be used to get all objects which fully contain this feature" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ] . join ( "\n" ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _args  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
									
										
										
										
											2021-07-26 18:02:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _f ( params ,  feat )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  ( . . . layerIds : string [ ] )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            const  result :  {  feat : any ;  overlap : number  } [ ]  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-29 20:04:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            const  seenIds  =  new  Set < string > ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            const  bbox  =  BBox . get ( feat ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( const  layerId  of  layerIds )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                const  otherFeaturess  =  params . getFeaturesWithin ( layerId ,  bbox ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( otherFeaturess  ===  undefined )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    continue 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( otherFeaturess . length  ===  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    continue 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                for  ( const  otherFeatures  of  otherFeaturess )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-29 20:04:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    const  overlap  =  GeoOperations . calculateOverlap ( feat ,  otherFeatures ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    for  ( const  overlappingFeature  of  overlap )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        if  ( seenIds . has ( overlappingFeature . feat . properties . id ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-29 20:04:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        seenIds . add ( overlappingFeature . feat . properties . id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        result . push ( overlappingFeature ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            result . sort ( ( a ,  b )  = >  b . overlap  -  a . overlap ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  result 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-19 02:11:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  IntersectionFunc  implements  ExtraFunction  {  
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _name  =  "intersectionsWith" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _doc  = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "Gives the intersection points with selected features. Only works with (Multi)Polygons and LineStrings.\n\n"  + 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-19 02:11:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "Returns a `{feat: GeoJson, intersections: [number,number][]}` where `feat` is the full, original feature. This list is in random order.\n\n"  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "If the current feature is a point, this function will return an empty list.\n"  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "Points from other layers are ignored - even if the points are parts of the current linestring." 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _args  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "...layerIds - one or more layer ids of the layer from which every feature is checked for intersection)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-19 02:11:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _f ( params : ExtraFuncParams ,  feat )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  ( . . . layerIds : string [ ] )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            const  result :  {  feat : any ;  intersections :  [ number ,  number ] [ ]  } [ ]  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-19 02:11:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            const  bbox  =  BBox . get ( feat ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( const  layerId  of  layerIds )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                const  otherLayers  =  params . getFeaturesWithin ( layerId ,  bbox ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( otherLayers  ===  undefined )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    continue 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-19 02:11:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( otherLayers . length  ===  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    continue 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-19 02:11:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  ( const  tile  of  otherLayers )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    for  ( const  otherFeature  of  tile )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-22 00:43:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        const  intersections  =  GeoOperations . LineIntersections ( feat ,  otherFeature ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-26 21:40:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        if  ( intersections . length  ===  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-22 00:43:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        } 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        result . push ( {  feat : otherFeature ,  intersections  } ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-19 02:11:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  result 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-19 02:11:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  DistanceToFunc  implements  ExtraFunction  {  
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _name  =  "distanceTo" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _doc  = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "Calculates the distance between the feature and a specified point in meter. The input should either be a pair of coordinates, a geojson feature or the ID of an object" 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _args  =  [ "feature OR featureID OR longitude" ,  "undefined OR latitude" ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _f ( featuresPerLayer ,  feature )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  ( arg0 ,  lat )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( arg0  ===  undefined )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return  undefined 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( typeof  arg0  ===  "number" )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // Feature._lon and ._lat is conveniently place by one of the other metatags
 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return  GeoOperations . distanceBetween ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    [ arg0 ,  lat ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    GeoOperations . centerpointCoordinates ( feature ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( typeof  arg0  ===  "string" )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                // This is an identifier
 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-22 00:43:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                const  feature  =  featuresPerLayer . getFeatureById ( arg0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( feature  ===  undefined )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    return  undefined 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-28 03:15:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                arg0  =  feature 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-28 03:15:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-07 17:46:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // arg0 is probably a geojsonfeature
 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  GeoOperations . distanceBetween ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                GeoOperations . centerpointCoordinates ( arg0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                GeoOperations . centerpointCoordinates ( feature ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  ClosestObjectFunc  implements  ExtraFunction  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _name  =  "closest" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +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 loaded)" 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _args  =  [ "list of features or a layer name or '*' to get all features" ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _f ( params ,  feature )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  ( features )  = > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ClosestNObjectFunc . GetClosestNFeatures ( params ,  feature ,  features ) ? . [ 0 ] ? . feat 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-06-15 00:28:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								class  ClosestNObjectFunc  implements  ExtraFunction  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _name  =  "closestn" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +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. "  + 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "Returns a list of `{feat: geojson, distance:number}` the empty list if nothing is found (or not yet loaded)\n\n"  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "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)" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _args  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "list of features or layer name or '*' to get all features" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "amount of features" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "unique tag key (optional)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "maxDistanceInMeters (optional)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-22 00:43:00 +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 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								     * / 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    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 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            const  bbox  =  GeoOperations . bbox ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                GeoOperations . buffer ( GeoOperations . bbox ( feature ) ,  maxDistance ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            features  =  params . getFeaturesWithin ( name ,  new  BBox ( bbox . geometry . coordinates ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 20:10:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        }  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            features  =  [ features ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( features  ===  undefined )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 20:10:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        const  selfCenter  =  GeoOperations . centerpointCoordinates ( feature ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        let  closestFeatures :  {  feat : any ;  distance : number  } [ ]  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-22 00:43:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 20:10:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( const  featureList  of  features )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-12 02:59:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            // Features is provided by 'getFeaturesWithin' which returns a list of lists of features, hence the double loop here
 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            for  ( const  otherFeature  of  featureList )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    otherFeature  ===  feature  || 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    otherFeature . properties . id  ===  feature . properties . id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    continue  // We ignore self
 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-10 20:10:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                const  distance  =  GeoOperations . distanceBetween ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    GeoOperations . centerpointCoordinates ( otherFeature ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    selfCenter 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( distance  ===  undefined  ||  distance  ===  null  ||  isNaN ( distance ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    console . error ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        "Could not calculate the distance between" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        feature , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        "and" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        otherFeature 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    throw  "Undefined distance!" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-28 03:15:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( distance  ===  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    console . trace ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        "Got a suspiciously zero distance between" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        otherFeature , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        "and self-feature" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        feature 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-27 20:19:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-28 03:15:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( distance  >  maxDistance )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( closestFeatures . length  ===  0 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-12 02:59:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    // This is the first matching feature we find - always add it
 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    closestFeatures . push ( { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        feat : otherFeature , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        distance : distance , 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    } ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    continue 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    closestFeatures . length  >=  maxFeatures  && 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    closestFeatures [ maxFeatures  -  1 ] . distance  <  distance 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    // 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 ++ )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    const  closestFeature  =  closestFeatures [ i ] 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  ( uniqueTag  !==  undefined )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        const  uniqueTagsMatch  = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            otherFeature . properties [ uniqueTag ]  !==  undefined  && 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            closestFeature . feat . properties [ uniqueTag ]  === 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                otherFeature . properties [ uniqueTag ] 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        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
 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                closestFeatures [ i ]  =  {  feat : otherFeature ,  distance : distance  } 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            } 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                            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 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        } 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        break 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( targetIndex  ==  - 1 )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    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 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        distance : distance , 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  ( closestFeatures . length  >=  maxFeatures )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        closestFeatures . splice ( maxFeatures ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    // Overwrite the last element
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    closestFeatures [ targetIndex ]  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        feat : otherFeature , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        distance : distance , 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-21 02:10:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  closestFeatures 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-18 02:29:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-01-26 21:40:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _f ( params ,  feature )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  ( features ,  amount ,  uniqueTag ,  maxDistanceInMeters )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            let  distance : number  =  Number ( maxDistanceInMeters ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( isNaN ( distance ) )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                distance  =  undefined 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  ClosestNObjectFunc . GetClosestNFeatures ( params ,  feature ,  features ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                maxFeatures : Number ( amount ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                uniqueTag : uniqueTag , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                maxDistance : distance , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-26 21:40:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  Memberships  implements  ExtraFunction  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _name  =  "memberships" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _doc  = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "Gives a list of `{role: string, relation: Relation}`-objects, containing all the relations that this feature is part of. "  + 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "\n\n"  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "For example: `_part_of_walking_routes=feat.memberships().map(r => r.relation.tags.name).join(';')`" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _args  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _f ( params ,  feat )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  ( )  = >  params . memberships . knownRelations . data . get ( feat . properties . id )  ? ?  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  GetParsed  implements  ExtraFunction  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    _name  =  "get" 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _doc  = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "Gets the property of the feature, parses it (as JSON) and returns it. Might return 'undefined' if not defined, null, ..." 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _args  =  [ "key" ] 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-22 00:43:00 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    _f ( params ,  feat )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  ( key )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            const  value  =  feat . properties [ key ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ( value  ===  undefined )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return  undefined 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                const  parsed  =  JSON . parse ( value ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( parsed  ===  null )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    return  undefined 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                return  parsed 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            }  catch  ( e )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                console . warn ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    "Could not parse property "  +  key  +  " due to: "  +  e  +  ", the value is "  +  value 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  undefined 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								export  class  ExtraFunctions  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    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" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            "**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." , 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ] ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "To enable this feature,  add a field `calculatedTags` in the layer object, e.g.:" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "````" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        '"calculatedTags": [' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        '    "_someKey=javascript-expression",' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        '    "name=feat.properties.name ?? feat.properties.ref ?? feat.properties.operator",' , 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "    \"_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" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            "`lat` and `lon` contain the latitude and longitude" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ] ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "Some advanced functions are available on **feat** as well:" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        . SetClass ( "flex-col" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        . AsMarkdown ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    private  static  readonly  allFuncs : ExtraFunction [ ]  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new  DistanceToFunc ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new  OverlapFunc ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-07 19:48:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        new  EnclosingFunc ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-19 02:11:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        new  IntersectionFunc ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        new  ClosestObjectFunc ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new  ClosestNObjectFunc ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new  Memberships ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        new  GetParsed ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  static  FullPatchFeature ( params : ExtraFuncParams ,  feature )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-26 21:40:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  ( feature . _is_patched )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-01-07 17:31:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        feature . _is_patched  =  true 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  ( const  func  of  ExtraFunctions . allFuncs )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            feature [ func . _name ]  =  func . _f ( params ,  feature ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    public  static  HelpText ( ) :  BaseUIElement  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const  elems  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( const  func  of  ExtraFunctions . allFuncs )  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            elems . push ( new  Title ( func . _name ,  3 ) ,  func . _doc ,  new  List ( func . _args  ? ?  [ ] ,  true ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-12-05 02:06:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  new  Combine ( [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ExtraFunctions . intro , 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-08 21:40:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            new  List ( ExtraFunctions . allFuncs . map ( ( func )  = >  ` [ ${ func . _name } ](# ${ func . _name } ) ` ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            . . . elems , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-11 11:47:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}