File size: 3,176 Bytes
4662da0
 
 
bede559
4662da0
 
bede559
 
 
 
 
 
4662da0
bede559
 
 
4662da0
bede559
 
4662da0
bede559
 
4662da0
 
 
 
 
 
 
 
 
bede559
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4662da0
 
 
bede559
 
 
4662da0
 
bede559
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4662da0
bede559
 
 
 
 
 
4662da0
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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'
]

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, place_type):
    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=[place_type]
            included_types=place
        )

        # 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,place in enumerate(GOOGLE_PLACE_TYPE_MAPPING):
      total_count = await compute_places_count_with_api_key(
          api_key,
          lat,
          lon,
          radius,
          place
     )

     features[f'num_{DATASET_COLUMNS[i]}'] = total_count


    n_banks = 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())
    })

    return features