Przegląd
Standardowe dane o lokalizacji mogą Ci powiedzieć, co znajduje się w pobliżu, ale często nie odpowiadają na ważniejsze pytanie: „Jak dobra jest ta okolica dla mnie?”. Potrzeby użytkowników są zróżnicowane. Rodzina z małymi dziećmi ma inne priorytety niż młody pracownik z psem. Aby pomóc im w podejmowaniu trafnych decyzji, musisz dostarczać statystyki odzwierciedlające te konkretne potrzeby. Niestandardowy wynik lokalizacji to skuteczne narzędzie, które pozwala dostarczać tę wartość i zapewniać użytkownikom znacznie lepsze wrażenia.
Z tego dokumentu dowiesz się, jak tworzyć niestandardowe, wieloaspektowe oceny lokalizacji za pomocą zbioru danych Places Insights w BigQuery. Przekształcając dane o punktach POI w przydatne wskaźniki, możesz wzbogacić aplikacje z branży nieruchomości, handlu detalicznego lub turystyki i zapewnić użytkownikom potrzebne im informacje. Udostępniamy też opcję korzystania z interfejsu Gemini Developer API, który jest zaawansowanym sposobem obliczania wyników lokalizacji.
Zwiększanie wartości biznesowej dzięki dostosowanym wynikom
Poniższe przykłady pokazują, jak przekształcić surowe dane o lokalizacji w przydatne dane o użytkownikach, aby ulepszyć aplikację.
- Deweloperzy mogą utworzyć „ocenę przyjazności dla rodzin” lub „ocenę dla osób dojeżdżających do pracy”, aby pomóc kupującym i najemcom wybrać idealną okolicę, która odpowiada ich stylowi życia. Prowadzi to do zwiększenia zaangażowania użytkowników, uzyskiwania większej liczby potencjalnych klientów o wyższej jakości i szybszych konwersji.
- Inżynierowie z branży turystycznej i hotelarskiej mogą opracować „ocenę życia nocnego” lub „ocenę dla miłośników zwiedzania”, aby pomóc podróżnym wybrać hotel dopasowany do ich stylu wypoczynku, co zwiększy liczbę rezerwacji i zadowolenie klientów.
- Analitycy handlu detalicznego mogą generować „Wynik dotyczący fitnessu i zdrowia”, aby określić optymalną lokalizację nowej siłowni lub sklepu ze zdrową żywnością na podstawie pobliskich firm uzupełniających, co pozwala zmaksymalizować potencjał kierowania reklam na odpowiednią grupę demograficzną użytkowników.
Z tego przewodnika dowiesz się, jak za pomocą danych Miejsc bezpośrednio w BigQuery utworzyć dowolny rodzaj niestandardowego wyniku lokalizacji. Ten wzorzec zilustrujemy, tworząc 2 różne przykładowe oceny: ocenę przyjazności dla rodzin i ocenę przyjazności dla właścicieli zwierząt. To podejście pozwala wyjść poza liczbę miejsc i skorzystać z bogatych, szczegółowych atrybutów w zbiorze danych Statystyki miejsc. Możesz używać informacji takich jak godziny otwarcia, czy miejsce jest odpowiednie dla dzieci lub czy można wejść do niego z psem, aby tworzyć zaawansowane i przydatne dane dla użytkowników.
Przepływ pracy rozwiązania

W tym samouczku używamy jednego, zaawansowanego zapytania SQL do utworzenia niestandardowego wyniku, który możesz dostosować do dowolnego przypadku użycia. Przeprowadzimy Cię przez ten proces, tworząc 2 przykładowe wyniki dla hipotetycznego zestawu ofert mieszkań.
Wymagania wstępne
Zanim zaczniesz, wykonaj te instrukcje, aby skonfigurować Statystyki Miejsc.
1. Stwórz podstawy: lokalizacje interesujące użytkowników
Zanim utworzysz wyniki, musisz mieć listę lokalizacji, które chcesz analizować. Pierwszym krokiem jest sprawdzenie, czy te dane są dostępne w BigQuery w postaci tabeli.
Kluczem jest posiadanie unikalnego identyfikatora dla każdej lokalizacji i GEOGRAPHYkolumny, w której są przechowywane jej współrzędne.
Możesz utworzyć i wypełnić tabelę lokalizacji do oceny za pomocą zapytania takiego jak to:
CREATE OR REPLACE TABLE `your_project.your_dataset.apartment_listings`
(
id INT64,
name STRING,
location GEOGRAPHY
);
INSERT INTO `your_project.your_dataset.apartment_listings` VALUES
(1, 'The Downtowner', ST_GEOGPOINT(-74.0077, 40.7093)),
(2, 'Suburban Oasis', ST_GEOGPOINT(-73.9825, 40.7507)),
(3, 'Riverside Lofts', ST_GEOGPOINT(-73.9470, 40.8079))
-- More rows can be added here
. . . ;
Wykonanie SELECT * na danych o lokalizacji wyglądałoby podobnie do tego.

2. Opracuj podstawową logikę: zapytanie dotyczące oceny
Po ustaleniu lokalizacji kolejnym krokiem jest znalezienie, filtrowanie i zliczenie pobliskich miejsc, które są istotne dla Twojego wyniku niestandardowego. Wszystko to odbywa się w ramach jednej instrukcji SELECT.
Znajdowanie tego, co jest w pobliżu, za pomocą wyszukiwania geoprzestrzennego
Najpierw musisz znaleźć wszystkie miejsca ze zbioru danych Places Insights, które znajdują się w określonej odległości od każdej z Twoich lokalizacji. Funkcja BigQuery
ST_DWITHIN idealnie się do tego nadaje. Wykonamy JOIN między naszą tabelą apartment_listings a tabelą places_insights, aby znaleźć wszystkie miejsca w promieniu 800 metrów. Symbol LEFT JOIN zapewnia, że w wynikach zostaną uwzględnione wszystkie Twoje pierwotne lokalizacje, nawet jeśli w pobliżu nie zostaną znalezione żadne pasujące miejsca.
Filtrowanie według trafności za pomocą atrybutów zaawansowanych
W tym miejscu przekształcasz abstrakcyjną koncepcję wyniku w konkretne filtry danych. W przypadku 2 przykładowych wyników kryteria są różne:
- W przypadku „oceny przyjazności dla rodzin” bierzemy pod uwagę parki, muzea i restauracje, które są szczególnie odpowiednie dla dzieci.
- W przypadku „oceny dla właścicieli zwierząt” bierzemy pod uwagę parki, kliniki weterynaryjne, sklepy zoologiczne oraz restauracje i kawiarnie, w których można przebywać z psami.
Te konkretne atrybuty możesz filtrować bezpośrednio w klauzuli WHERE zapytania.
Zbieranie statystyk dla każdej lokalizacji
Na koniec musisz policzyć, ile odpowiednich miejsc udało Ci się znaleźć w przypadku każdego mieszkania. Klauzula GROUP BY agreguje wyniki, a funkcja COUNTIF zlicza miejsca, które spełniają określone kryteria dla każdego z naszych wyników.
Poniższe zapytanie łączy te 3 kroki, obliczając surowe liczby dla obu wyników w jednym przebiegu:
-- This Common Table Expression (CTE) will hold the raw counts for each score component.
WITH insight_counts AS (
SELECT WITH AGGREGATION_THRESHOLD -- Correctly includes the mandatory aggregation threshold
apartments.id,
apartments.name,
COUNTIF(places.primary_type = 'park') AS park_count,
COUNTIF(places.primary_type = 'museum') AS museum_count,
COUNTIF(places.primary_type = 'restaurant' AND places.good_for_children = TRUE) AS family_restaurant_count,
COUNTIF(places.primary_type IN ('veterinary_care', 'pet_store')) AS pet_service_count,
COUNTIF(places.allows_dogs = TRUE) AS dog_friendly_place_count
FROM
`your_project.your_dataset.apartment_listings` AS apartments
LEFT JOIN
`your-project.places_insights___us.places` AS places -- Corrected table name for the US dataset
ON ST_DWITHIN(apartments.location, places.point, 800) -- Find places within 800 meters
GROUP BY
apartments.id, apartments.name
)
SELECT * FROM insight_counts;
Wynik tego zapytania będzie podobny do tego.

W następnej sekcji wykorzystamy te wyniki.
3. Tworzenie wyniku
Teraz masz liczbę miejsc i wagi dla każdego typu miejsca w każdej lokalizacji, więc możesz wygenerować niestandardowy wynik lokalizacji. W tej sekcji omówimy 2 opcje: użycie własnych obliczeń niestandardowych w BigQuery lub użycie Gemini Developer API.
Opcja 1. Użyj własnych obliczeń niestandardowych w BigQuery
Surowe dane z poprzedniego kroku są przydatne, ale celem jest uzyskanie jednego, łatwego w interpretacji wyniku. Ostatnim krokiem jest połączenie tych wartości za pomocą wag, a następnie znormalizowanie wyniku do skali 0–10.
Stosowanie wag niestandardowych Wybór wag to zarówno sztuka, jak i nauka. Powinny one odzwierciedlać priorytety Twojej firmy lub to, co Twoim zdaniem jest najważniejsze dla użytkowników. W przypadku oceny „Przyjazność dla rodzin” możesz uznać, że park jest 2 razy ważniejszy niż muzeum. Zacznij od najlepszych założeń i wprowadzaj zmiany na podstawie opinii użytkowników.
Normalizowanie wyniku Poniższe zapytanie używa dwóch zapytań CTE (Common Table Expression): pierwsze oblicza surowe liczby jak poprzednio, a drugie oblicza ważone wyniki. Ostateczna instrukcja SELECT przeprowadza normalizację min-max na ważonych wynikach. Wyświetlana jest kolumna location tabeli przykładowejapartment_listings, aby umożliwić wizualizację danych na mapie.
WITH
-- CTE 1: Count nearby amenities of interest for each apartment listing.
insight_counts AS (
SELECT WITH AGGREGATION_THRESHOLD
apartments.id,
apartments.name,
COUNTIF(places.primary_type = 'park') AS park_count,
COUNTIF(places.primary_type = 'museum') AS museum_count,
COUNTIF(places.primary_type = 'restaurant' AND places.good_for_children = TRUE) AS family_restaurant_count,
COUNTIF(places.primary_type IN ('veterinary_care', 'pet_store')) AS pet_service_count,
COUNTIF(places.allows_dogs = TRUE) AS dog_friendly_place_count
FROM
`your_project.your_dataset.apartment_listings` AS apartments
LEFT JOIN
`your-project.places_insights___us.places` AS places
ON ST_DWITHIN(apartments.location, places.point, 800)
GROUP BY
apartments.id,
apartments.name
),
-- CTE 2: Apply custom weighting to the amenity counts to generate raw scores.
raw_scores AS (
SELECT
id,
name,
(park_count * 3.0) + (museum_count * 1.5) + (family_restaurant_count * 2.5) AS family_friendliness_score,
(park_count * 2.0) + (pet_service_count * 3.5) + (dog_friendly_place_count * 2.5) AS pet_paradise_score
FROM
insight_counts
)
-- Final Step: Normalize scores to a 0-10 scale and rejoin to retrieve the location geometry.
SELECT
raw_scores.id,
raw_scores.name,
apartments.location,
raw_scores.family_friendliness_score,
raw_scores.pet_paradise_score,
-- Normalize Family Score using a MIN/MAX window function.
ROUND(
COALESCE(
SAFE_DIVIDE(
(raw_scores.family_friendliness_score - MIN(raw_scores.family_friendliness_score) OVER ()),
(MAX(raw_scores.family_friendliness_score) OVER () - MIN(raw_scores.family_friendliness_score) OVER ())
) * 10,
0
),
2
) AS normalized_family_score,
-- Normalize Pet Score using a MIN/MAX window function.
ROUND(
COALESCE(
SAFE_DIVIDE(
(raw_scores.pet_paradise_score - MIN(raw_scores.pet_paradise_score) OVER ()),
(MAX(raw_scores.pet_paradise_score) OVER () - MIN(raw_scores.pet_paradise_score) OVER ())
) * 10,
0
),
2
) AS normalized_pet_score
FROM
raw_scores
JOIN
`your_project.your_dataset.apartment_listings` AS apartments
ON raw_scores.id = apartments.id;
Wyniki zapytania będą podobne do tych poniżej. Dwie ostatnie kolumny zawierają znormalizowane wyniki.

Interpretowanie znormalizowanej oceny
Warto zrozumieć, dlaczego ten ostatni krok normalizacji jest tak cenny.
Surowe ważone wyniki mogą się wahać od 0 do potencjalnie bardzo dużej liczby w zależności od gęstości zaludnienia w Twoich lokalizacjach. Wynik 500 jest bez kontekstu bez znaczenia dla użytkownika.
Normalizacja przekształca te abstrakcyjne liczby w ranking względny. Skalując wyniki od 0 do 10, wynik wyraźnie pokazuje, jak poszczególne lokalizacje wypadają na tle innych w Twoim konkretnym zbiorze danych:
- Wynik 10 jest przypisywany do lokalizacji z najwyższym wynikiem surowym, co oznacza, że jest to najlepsza opcja w bieżącym zbiorze.
- Wynik 0 jest przypisywany do lokalizacji z najniższym wynikiem pierwotnym, co czyni ją punktem odniesienia do porównania. Nie oznacza to, że w tej lokalizacji nie ma żadnych udogodnień, ale że jest ona najmniej odpowiednia w porównaniu z innymi rozważanymi opcjami.
- Wszystkie inne wyniki są proporcjonalnie rozłożone pomiędzy tymi wartościami, co pozwala użytkownikom szybko i intuicyjnie porównać dostępne opcje.
Opcja 2. Użyj interfejsu Gemini Developer API
Interfejs Gemini Developer API to zaawansowany sposób obliczania niuansowanych niestandardowych wyników lokalizacji, który może zastąpić stałą formułę matematyczną w BigQuery.
Sposób 1 doskonale sprawdza się w przypadku czysto ilościowej oceny na podstawie liczby udogodnień, ale nie uwzględnia danych jakościowych. Korzystając z Gemini, możesz łączyć liczby z zapytania Statystyk miejsc z danymi nieustrukturyzowanymi, takimi jak tekstowy opis oferty mieszkania (np. „Ta lokalizacja jest odpowiednia dla rodzin, a w nocy jest tu cicho”) lub preferencje konkretnego profilu użytkownika (np. „Ten użytkownik rezerwuje pobyt dla rodziny i woli spokojną okolicę w centralnej lokalizacji”), aby wygenerować bardziej szczegółową ocenę.
Przygotowywanie danych dla Gemini
Aby użyć tej metody, przekształć wyniki agregacji BigQuery (z kroku 2) do formatu Markdown i połącz je z danymi jakościowymi, np. z Listing Description.
W tym przykładzie mamy 2 wizytówki o bardzo różnych cechach. Dodajemy też symbol Target User Profile, aby poinformować Gemini, dla kogo oceniamy te treści:
## Listing 1: The Downtowner
* **ID:** 1
* **Amenity Counts:**
* Parks: 70
* Museums: 34
* Family-Friendly Restaurants: 141
* **Listing Description:** A vibrant apartment in the heart of the city.
Great for nightlife, but can be noisy on weekends. Close to several
small playgrounds.
* **Target User Profile:** Young family with a toddler, looking for a
balance of activity and quiet.
---
## Listing 2: Suburban Oasis
* **ID:** 2
* **Amenity Counts:**
* Parks: 34
* Museums: 30
* Family-Friendly Restaurants: 318
* **Listing Description:** Quiet, tree-lined street. Large backyard and easy
walking distance to a major park and elementary school.
* **Target User Profile:** Young family with a toddler, looking for a
balance of activity and quiet.
Instrukcje systemowe
Gemini potrzebuje instrukcji systemowych, aby wiedzieć, jak traktować te różne punkty danych. Możesz wyraźnie określić, jak ważne są poszczególne udogodnienia, a także poinstruować model, aby uwzględniał nastawienie w opisach tekstowych.
You are an expert real estate analyst. Your goal is to generate a
"Family-Friendliness Score" between 0.0 and 10.0 for a list of apartment
locations.
For each location, you will be given quantitative data (amenity counts)
and qualitative data (descriptions and user profiles).
Scoring Criteria:
- High importance: Proximity to parks and a high count of family-friendly
restaurants.
- Medium importance: Proximity to museums.
- Negative modifiers: Descriptions indicating excessive noise, lack of
safe play areas, or mismatch with the user profile.
- Positive modifiers: Descriptions indicating quiet areas, safe streets,
or extra space (e.g., backyards).
Analyze the provided data and generate scores based on these criteria.
Uporządkowane dane wyjściowe
Aby zapewnić niezawodność podczas integrowania AI z aplikacją, nie polegaj wyłącznie na promptach w zakresie formatu danych wyjściowych. Zamiast tego użyj funkcji danych strukturalnych w Gemini. Podając responseSchema, masz pewność, że model zwróci czystą, możliwą do przeanalizowania tablicę JSON, która spełnia Twoje wymagania systemowe.
W naszym przykładzie możemy wymusić ten schemat:
{
"type": "ARRAY",
"items": {
"type": "OBJECT",
"required": ["location_id", "name", "score", "reasoning"],
"properties": {
"location_id": {"type": "STRING"},
"name": {"type": "STRING"},
"score": {
"type": "NUMBER"
},
"reasoning": {
"type": "STRING"
}
}
}
}
Przykładowe dane wyjściowe
Gdy wyślesz prompta z określonym responseSchema, Gemini zwróci uporządkowaną tablicę JSON, która jest gotowa do bezpośredniego użycia w Twojej aplikacji.
Zwróć uwagę na to, jak Gemini radzi sobie z kompromisami. „The Downtowner” ma bardzo dużo parków, ale Gemini uznaje opis „głośno w weekendy” za duży minus dla małego dziecka. Z kolei „Suburban Oasis” uzyskał niemal idealny wynik, ponieważ łączy doskonałą gęstość udogodnień z odpowiednimi cechami jakościowymi, takimi jak „cicha ulica z drzewami”.
[
{
"id": 1,
"location_name": "The Downtowner",
"analysis_notes": "Excellent amenity counts (parks, restaurants, museums), fulfilling
quantitative metrics. However, the qualitative data indicates excessive weekend
noise and a strong nightlife focus, conflicting directly with the target
user's need for quiet and suitability for a toddler. This mismatch
significantly lowers the final score.",
"family_friendliness_score": 5.5
},
{
"id": 2,
"location_name": "Suburban Oasis",
"analysis_notes": "Outstanding quantitative data, especially the very high count of
family-friendly restaurants. The qualitative description (quiet, tree-lined street,
large backyard, proximity to elementary school and major park) aligns perfectly with
and exceeds the needs of the target family profile. High positive modifiers
result in a near-perfect score.",
"family_friendliness_score": 9.8
}
]
Ta metoda umożliwia dostarczanie wysoce spersonalizowanych wyników, które są zrozumiałe i dostosowane do każdego użytkownika.
4. Wizualizacja wyników na mapie
BigQuery Studio zawiera zintegrowaną wizualizację mapy
dla każdego wyniku zapytania, który zawiera kolumnę GEOGRAPHY. Ponieważ zapytanie zwraca kolumnę location, możesz od razu wizualizować wyniki.
Kliknięcie karty Visualization spowoduje wyświetlenie mapy, a menu Data Column
umożliwia kontrolowanie wyniku lokalizacji, który ma być wizualizowany. W tym przykładzie normalized_pet_score jest wizualizowany na podstawie przykładu opcji 1. Zwróć uwagę, że w tym przykładzie do tabeli apartment_listings dodano więcej lokalizacji.

Wizualizacja danych pozwala na pierwszy rzut oka określić najbardziej odpowiednie lokalizacje dla utworzonego wyniku. Ciemniejsze zielone kółka oznaczają lokalizacje o wyższym wskaźniku normalized_pet_score w tym przypadku. Więcej opcji wizualizacji danych Statystyk Miejsc znajdziesz w artykule Wizualizacja wyników zapytania.
Podsumowanie
Masz teraz do dyspozycji skuteczną i powtarzalną metodę tworzenia szczegółowych wyników lokalizacji. Na podstawie lokalizacji utworzono w BigQuery jedno zapytanie SQL, które wyszukuje pobliskie miejsca z ST_DWITHIN, filtruje je według zaawansowanych atrybutów, takich jak good_for_children i allows_dogs, oraz agreguje wyniki za pomocą funkcji COUNTIF. Dzięki zastosowaniu niestandardowych wag i normalizacji wyniku udało Ci się uzyskać jeden, łatwy w użyciu wynik, który dostarcza szczegółowych i przydatnych informacji. Możesz bezpośrednio zastosować ten wzorzec, aby przekształcić surowe dane o lokalizacji w znaczącą przewagę konkurencyjną.
Następne działania
Teraz Twoja kolej na budowanie. Ten samouczek zawiera szablon. Możesz używać bogatych danych dostępnych w schemacie Statystyk miejsc, aby tworzyć wyniki, które są najbardziej potrzebne w Twoim przypadku użycia. Możesz też utworzyć inne oceny:
- „Ocena życia nocnego”: połącz filtry
primary_type(bar,night_club),price_leveli godziny otwarcia w nocy, aby znaleźć najbardziej tętniące życiem miejsca po zmroku. - „Ocena fitnessu i dobrego samopoczucia”: zlicz pobliskie
gyms,parksihealth_food_storesoraz filtruj restauracje pod kątem tych, które mająserves_vegetarian_food, aby oceniać lokalizacje pod kątem użytkowników dbających o zdrowie. - „Ocena dla dojeżdżających do pracy”: znajdź miejsca z dużą liczbą pobliskich miejsc
transit_stationiparking, aby pomóc użytkownikom, którzy cenią sobie dostęp do transportu.
Współtwórcy
Henrik Valve | Inżynier DevX