]> ToastFreeware Gitweb - philipp/winterrodeln/wrpylib.git/commitdiff
Reduce number of queries to get the car distance list.
authorPhilipp Spitzer <philipp@spitzer.priv.at>
Mon, 10 Oct 2022 06:14:47 +0000 (08:14 +0200)
committerPhilipp Spitzer <philipp@spitzer.priv.at>
Mon, 10 Oct 2022 06:14:47 +0000 (08:14 +0200)
scripts/update_car_distances.py

index 85fdd0669d383ef9e3845706268d2b2eb7146f45..43092537552468c44c54970b823e8e9acfc1885e 100644 (file)
@@ -55,6 +55,25 @@ def vao_car_distance(vao: Vao, parking_lon: float, parking_lat: float, city: Fea
     print('Unexpected result from VAO')
 
 
+def distance_meter(a: Geometry, b: Geometry) -> float:
+    spatial_reference_ll = SpatialReference()
+    spatial_reference_ll.ImportFromEPSG(4326)
+    spatial_reference_ll.SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER)
+
+    spatial_reference_m = SpatialReference()
+    spatial_reference_m.ImportFromProj4(f'+proj=merc +lat_ts={(a.GetY() + b.GetY()) / 2}')
+
+    ll_to_m = CoordinateTransformation(spatial_reference_ll, spatial_reference_m)
+
+    a_m = a.Clone()
+    a_m.Transform(ll_to_m)
+
+    b_m = b.Clone()
+    b_m.Transform(ll_to_m)
+
+    return a_m.Distance(b_m)
+
+
 def dist_info_to_dict(dist_info: DistInfo) -> dict:
     return {
         'km': round(dist_info.dist_m / 1000, 1),
@@ -109,26 +128,31 @@ def update_sledrun(vao: Vao, db_cities: Layer, site: WikiSite, title: str):
 
     spatial_reference_m = SpatialReference()
     spatial_reference_m.ImportFromProj4(f'+proj=merc +lat_ts={parking_lat}')
-    # spatial_reference_m.ImportFromProj4(f'+proj=merc')
 
     ll_to_m = CoordinateTransformation(spatial_reference_ll, spatial_reference_m)
     m_to_ll = CoordinateTransformation(spatial_reference_m, spatial_reference_ll)
 
-    loc_ll = Geometry(wkbPoint)
-    loc_ll.AddPoint(parking_lon, parking_lat)
+    parking_ll = Geometry(wkbPoint)
+    parking_ll.AddPoint(parking_lon, parking_lat)
 
-    loc_m = loc_ll.Clone()
-    loc_m.Transform(ll_to_m)
+    parking_m = parking_ll.Clone()
+    parking_m.Transform(ll_to_m)
     max_dist_m = 60000
-    bound_m = loc_m.Buffer(max_dist_m)
+    bound_m = parking_m.Buffer(max_dist_m)
     bound_ll = bound_m.Clone()
     bound_ll.Transform(m_to_ll)
 
     db_cities.SetSpatialFilter(bound_ll)
     db_cities.SetAttributeFilter('level<=2')
+    close_cities = [city for city in db_cities]
+    close_cities = sorted(close_cities, key=lambda city: distance_meter(city.GetGeometryRef(), parking_ll))
 
+    max_number_distances = 3
     car_distances_to_append: List[dict] = []
-    for city in db_cities:
+    for city in close_cities:
+        if len(car_distances_to_append) >= max_number_distances:
+            if car_distances_to_append[2]['km'] * 1000 < distance_meter(city.GetGeometryRef(), parking_ll):
+                break
         print(city['name'])
         car_distance = next((cd for cd in car_distance_list if cd.get('geonames_id') == city['geonames_id']), None)
         if car_distance is None:
@@ -137,7 +161,9 @@ def update_sledrun(vao: Vao, db_cities: Layer, site: WikiSite, title: str):
                 car_distance = dist_info_to_dict(car_distance)
         if car_distance is not None:
             car_distances_to_append.append(car_distance)
-    car_distances_to_append = sorted(car_distances_to_append, key=lambda di: di['km'])[:3]
+        car_distances_to_append = sorted(car_distances_to_append, key=lambda di: di['km'])
+
+    car_distances_to_append = sorted(car_distances_to_append, key=lambda di: di['km'])[:max_number_distances]
 
     for car_distance in car_distances_to_append:
         if len([cd for cd in car_distance_list if cd.get('geonames_id') == car_distance['geonames_id']]) == 0:
@@ -185,6 +211,8 @@ def update_car_distances(ini_files: List[str]):
     for result in site.query(list='categorymembers', cmtitle='Kategorie:Rodelbahn', cmlimit='max'):
         for page in result['categorymembers']:
             print(page['title'])
+            if page['title'] in ['Anzère']:
+                continue
             update_sledrun(vao, db_cities, site, page['title'])