from collections import Counter import pandas as pd import numpy as np # from scipy.spatial import cKDTree # df_amenities = pd.read_csv("df_indonesia.csv").rename( # columns={"latitude":"lat", "longitude":"lon"} # ) # df_banks = pd.read_csv("df_bank_indonesia.csv").rename( # columns={"latitude":"lat", "longitude":"lon"} # ) # df_amenities["fsq_category_labels"] = df_amenities["fsq_category_labels"].apply( # lambda x: eval(x) # ) # bank_coords = df_banks[['lat','lon']].values # tree_banks = cKDTree(bank_coords) # amenity_coords = df_amenities[['lat','lon']].values # tree_amenities = cKDTree(amenity_coords) DATASET_COLUMNS = [ 'Dining and Drinking', 'Community and Government', 'Retail', 'Business and Professional Services', 'Landmarks and Outdoors', 'Arts and Entertainment', 'Health and Medicine', 'Travel and Transportation', 'Sports and Recreation', 'Event' ] GOOGLE_PLACE_TYPE_MAPPING = [ # Dining and Drinking [ 'restaurant', 'bar', 'cafe', 'bakery', 'night_club' ], # Community and Government [ 'government_office', 'local_government_office', 'city_hall', 'courthouse', 'police', 'fire_station', 'post_office', 'library' ], # Retail [ 'store', 'shopping_mall', 'grocery_store', 'pharmacy', 'supermarket', 'drugstore' ], # Business and Professional Services [ 'bank', 'atm', 'corporate_office', 'accounting', 'lawyer', # 'establishment' ], # Landmarks and Outdoors [ 'park', 'tourist_attraction', 'national_park', 'historical_landmark', 'cultural_landmark' ], # Arts and Entertainment [ 'movie_theater', 'museum', 'art_gallery', 'performing_arts_theater', 'amusement_park', 'aquarium', 'zoo' ], # Health and Medicine [ 'hospital', 'doctor', 'dentist', 'pharmacy', 'physiotherapist', 'spa' ], # Travel and Transportation [ 'airport', 'bus_station', 'train_station', 'transit_station', 'subway_station', 'parking', 'lodging' ], # Sports and Recreation [ 'gym', 'stadium', 'bowling_alley', 'fitness_center', 'park', 'amusement_center' ], # Event (Mapped to common event venues) [ 'event_venue', 'convention_center', 'banquet_hall', 'stadium' ] ] import os from google.maps import areainsights_v1 from google.maps.areainsights_v1.types import ComputeInsightsRequest, Filter, LocationFilter, Insight from google.type import latlng_pb2 import asyncio async def compute_places_count_with_api_key(api_key, lat, lng, radius, places): try: client = areainsights_v1.AreaInsightsAsyncClient( client_options={"api_key": api_key} ) # 1. Define the geographic filter (a circle) location_filter = LocationFilter( circle=LocationFilter.Circle( lat_lng=latlng_pb2.LatLng(latitude=lat, longitude=lng), radius=radius ) ) # 2. Define the place type filter type_filter = areainsights_v1.TypeFilter( included_types=places ) # 3. Assemble the main request body request = ComputeInsightsRequest( # We want the total count of matching places insights=[Insight.INSIGHT_COUNT], filter=Filter( location_filter=location_filter, type_filter=type_filter ) ) response = await client.compute_insights(request=request) count = int(response.count) return count except Exception as e: print(f"An error occurred: {e}") return None def compute_features(candidate_point, api_key, radius=5000): lat, lon = candidate_point features = { 'num_banks_in_radius':0, # 'total_amenities':0, # 'category_diversity':0 } for i,places in enumerate(GOOGLE_PLACE_TYPE_MAPPING): total_count = asyncio.run(compute_places_count_with_api_key( api_key, lat, lon, radius, places )) features[f'num_{DATASET_COLUMNS[i]}'] = total_count n_banks = asyncio.run(compute_places_count_with_api_key( api_key, lat, lon, radius, ['atm'] )) features.update({ 'num_banks_in_radius': n_banks, # 'total_amenities': sum(v for v in features.values()), # 'category_diversity': sum(bool(v) for v in features.values()) }) print(features) return features