@@ -46,6 +46,7 @@ def configure(
4646 use_look_at : bool = True ,
4747 use_folders : bool = True ,
4848 default : str = "" ,
49+ to_csv : Optional [str ] = None ,
4950 ) -> None :
5051 """
5152 :param kml: Path to the KML file containing the places
@@ -63,6 +64,15 @@ def configure(
6364 self .places = self ._load_file (kml , use_look_at , use_folders )
6465 self .default = default
6566
67+ if to_csv is not None :
68+ with open (to_csv , "w" ) as csv_file :
69+ csv_file .writelines (
70+ [
71+ f"{ p .latitude } , { p .longitude } , { p .radius / 1000 } , { p .name } \n "
72+ for p in self .places
73+ ]
74+ )
75+
6676 def _load_file (
6777 self , kml_path : str , use_look_at : bool , use_folders : bool
6878 ) -> List [Place ]:
@@ -76,7 +86,7 @@ def _collect_places(kml, prefix: List[str]) -> List[Place]:
7686 "/" .join (prefix + [kml .name ]),
7787 kml .view .latitude ,
7888 kml .view .longitude ,
79- radius = kml .view .range ,
89+ radius = kml .view .range / 2 ,
8090 )
8191 prefix = prefix + [kml .name ]
8292 return [folder_place ] + list (
@@ -92,13 +102,13 @@ def _collect_places(kml, prefix: List[str]) -> List[Place]:
92102 "/" .join (prefix + [kml .name ]),
93103 kml .view .latitude ,
94104 kml .view .longitude ,
95- radius = kml .view .range ,
105+ radius = kml .view .range / 2 ,
96106 )
97107 ]
98108 else :
99109 latitude = kml .kml_geometry .kml_coordinates .coords [0 ][0 ]
100110 longitude = kml .kml_geometry .kml_coordinates .coords [0 ][1 ]
101- radius = kml .view .range if kml .view is not None else None
111+ radius = kml .view .range if kml .view / 2 is not None else None
102112 return [
103113 Place (
104114 "/" .join (prefix + [kml .name ]),
@@ -135,10 +145,25 @@ def process(self, file: File, context: Optional[str]) -> str:
135145 @staticmethod
136146 def _find_best_match (places : List [Place ], point : Point ) -> Optional [Place ]:
137147 gc = great_circle ()
138- min_distance_place : Optional [Place ] = None
139- for place in places :
140- if min_distance_place is None or gc .measure (
141- place .position , point
142- ) < gc .measure (min_distance_place .position , point ):
143- min_distance_place = place
144- return min_distance_place
148+
149+ places_in_range = filter (
150+ lambda p : gc .measure (p .position , point ) < p .radius , places
151+ )
152+
153+ # FIXME: Fix the types
154+ smallest_place_in_range = next (
155+ sorted (places_in_range , key = lambda p : p .radius ), None
156+ )
157+ return smallest_place_in_range
158+
159+ # min_distance: float = -1
160+ # min_distance_place: Optional[Place] = None
161+ #
162+ # for place in places_in_range:
163+ # distance = gc.measure(place.position, point)
164+ # if distance > place.radius:
165+ # continue
166+ # if min_distance_place is None or distance < min_distance:
167+ # min_distance = distance
168+ # min_distance_place = place
169+ # return min_distance_place
0 commit comments