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 # 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' # ] DATASET_COLUMNS = [ 'restaurant', 'bookstore', 'fast_food', 'clinic', 'school', 'bakery', 'convenience_store', 'shopping_mall', 'atm', 'bank', 'dentist', 'pharmacy', 'cafe', 'supermarket', 'hospital', 'gym', 'jewelry_store', 'charging_station', 'electronics_store', 'clothing_store', 'department_store', 'hotel', 'yoga', 'attraction', 'college', 'co_working', 'university', 'hostel', 'viewpoint' ] 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 GOOGLE_PLACE_TYPE_MAPPING = [ # Original Column: 'restaurant' ['restaurant'], # Original Column: 'bookstore' ['book_store'], # Original Column: 'fast_food' ['fast_food_restaurant'], # Original Column: 'clinic' ['dental_clinic', 'doctor', 'medical_lab', 'skin_care_clinic'], # Original Column: 'school' ['school', 'primary_school', 'secondary_school', 'preschool'], # Original Column: 'bakery' ['bakery'], # Original Column: 'convenience_store' ['convenience_store'], # Original Column: 'shopping_mall' ['shopping_mall'], # Original Column: 'atm' ['atm'], # Original Column: 'bank' ['bank'], # Original Column: 'dentist' ['dentist', 'dental_clinic'], # Original Column: 'pharmacy' ['pharmacy', 'drugstore'], # Original Column: 'cafe' ['cafe', 'coffee_shop'], # Original Column: 'supermarket' ['supermarket'], # Original Column: 'hospital' ['hospital'], # Original Column: 'gym' ['gym', 'wellness_center'], # Original Column: 'jewelry_store' ['jewelry_store'], # Original Column: 'charging_station' ['electric_vehicle_charging_station'], # Original Column: 'electronics_store' ['electronics_store'], # Original Column: 'clothing_store' ['clothing_store', 'department_store'], # Original Column: 'department_store' ['department_store'], # Original Column: 'hotel' ['hotel', 'motel', 'resort_hotel'], # Original Column: 'yoga' ['yoga_studio'], # Original Column: 'attraction' ['tourist_attraction', 'amusement_park', 'museum', 'cultural_landmark'], # Original Column: 'college' ['university'], # Original Column: 'co_working' (No direct Place Type exists, using closest fit) ['corporate_office'], # Original Column: 'university' ['university'], # Original Column: 'hostel' ['hostel', 'budget_japanese_inn'], # Original Column: 'viewpoint' (No direct Place Type exists, using closest fit) ['tourist_attraction', 'observation_deck'] ] 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