總覽
標準位置資訊資料可以告訴您附近有什麼,但通常無法回答更重要的問題:「這個區域適合我嗎?」使用者的需求各有不同,與年輕專業人士 (有養狗) 相比,有幼童的家庭優先考量的事項不同。為協助他們做出有把握的決定,您需要提供反映這些特定需求的洞察資料。自訂位置分數是強大的工具,可提供這項價值,並打造顯著差異化的使用者體驗。
本文說明如何使用 BigQuery 中的 Places Insights 資料集,建立自訂的多面向地點分數。將 POI 資料轉換為有意義的指標,即可豐富房地產、零售或旅遊應用程式,並為使用者提供所需的相關資訊。我們也提供使用 Gemini Developer API 的選項,做為計算位置分數的強大工具。
根據量身打造的分數提升業務價值
以下範例說明如何將原始位置資料轉換為以使用者為中心的強大指標,進而提升應用程式效能。
- 房地產開發人員可以建立「家庭友善分數」或「通勤族夢幻分數」,協助買家和租屋者選擇符合生活型態的完美社區,進而提高使用者參與度、優質待開發客戶和轉換速度。
- 旅遊和觀光業工程師可以建立「夜生活分數」或「觀光天堂分數」,協助旅客選擇符合度假風格的飯店,進而提高預訂率和顧客滿意度
- 零售分析師可以產生「健身與保健分數」,根據附近的互補商家找出新健身房或保健食品店的最佳地點,盡可能鎖定合適的使用者客層。
本指南將介紹靈活的三部分方法,協助您直接在 BigQuery 中使用地點資料,建構任何類型的自訂地點分數。我們會建立兩個不同的範例分數,說明這個模式:家庭友善分數和寵物主人天堂分數。這種做法可讓您擺脫地點計數,並充分運用 Places Insights 資料集中的豐富詳細屬性。您可以根據營業時間、是否適合兒童或是否允許攜帶寵物狗等資訊,為使用者建立精細且有意義的指標。
解決方案工作流程

本教學課程會使用單一強大的 SQL 查詢,建立可適用於任何用途的自訂分數。我們會逐步說明這個程序,並為假設的公寓房源組合建立兩個範例分數。
必要條件
開始之前,請按照這些操作說明設定地點洞察。
1. 奠定基礎:感興趣的地點
如要建立分數,您必須先列出要分析的地點。首先,請確認這項資料以資料表的形式存在於 BigQuery 中。重點是為每個地點提供專屬 ID,以及儲存座標的 GEOGRAPHY 欄。
您可以建立並填入位置資料表,然後使用類似下列的查詢來評估:
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
. . . ;
對位置資料執行 SELECT * 的結果如下。

2. 開發核心邏輯:評分查詢
建立地點後,下一步是尋找、篩選及計算與自訂分數相關的附近地點。這一切都在單一 SELECT 陳述式中完成。
使用地理空間搜尋功能尋找附近地點
首先,您需要從 Places Insights 資料集找出與各個地點距離在一定範圍內的所有地點。BigQuery 函式 ST_DWITHIN 非常適合這項工作。我們會對 apartment_listings 資料表和 places_insights 資料表執行 JOIN,找出 800 公尺半徑內的所有地點。LEFT JOIN 可確保結果中包含所有原始位置,即使附近找不到相符地點也一樣。
使用進階屬性篩選相關性
您可以在這裡將抽象的分數概念轉換為具體的資料篩選條件。以這兩個分數為例,評估標準如下:
- 「家庭友善分數」方面,我們重視明確適合兒童的公園、博物館和餐廳。
- 「寵物友善天堂分數」的評估依據包括公園、獸醫診所、寵物店,以及允許攜帶狗狗進入的餐廳或咖啡廳。
您可以在查詢的 WHERE 子句中直接篩選這些特定屬性。
彙整各個地點的洞察資料
最後,請計算每個公寓找到多少個相關地點。GROUP BY 子句會彙整結果,而 COUNTIF 函式會計算符合各項分數特定條件的地點。
下列查詢會合併這三個步驟,在單一傳遞中計算兩個分數的原始計數:
-- 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;
這項查詢的結果會類似於下列內容。

我們將在下一節中以這些結果為基礎。
3. 建立分數
現在您已取得每個地點類型在每個位置的數量和權重,可以產生自訂地點分數。本節將討論兩種做法:在 BigQuery 中使用自訂計算,或使用 Gemini 開發人員 API。
選項 1:在 BigQuery 中使用自訂計算
前一個步驟的原始計數很有參考價值,但我們的目標是提供單一、易於使用的分數。最後一個步驟是使用權重合併這些計數,然後將結果正規化為 0 到 10 的範圍。
套用自訂權重:選擇權重是一門藝術,也是一門科學。 這些目標必須反映您的業務優先事項,或是您認為對使用者最重要的事項。舉例來說,在「家庭友善」評分中,您可能會認為公園的重要性是博物館的兩倍。先根據最合理的假設開始,然後根據使用者意見回饋進行疊代。
將分數標準化:下列查詢會使用兩個一般資料表運算式 (CTE):第一個運算式會照常計算原始計數,第二個運算式則會計算加權分數。最後,SELECT 陳述式會對加權分數執行最小值-最大值正規化。系統會輸出範例表格的 location 欄 apartment_listings,以便在地圖上顯示資料。
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;
查詢結果會類似下方內容。最後兩欄是正規化分數。

瞭解正規化分數
瞭解最後的正規化步驟為何如此重要,是相當有幫助的。
原始加權分數的範圍可能從 0 到非常大的數字,具體取決於您所在位置的都市密度。如果使用者不瞭解背景資訊,500 分數就沒有意義。
正規化會將這些抽象數字轉換為相對排名。將結果從 0 到 10 分級,分數可清楚顯示每個地點與特定資料集中其他地點的比較結果:
- 原始分數最高的商家會獲得 10 分,並標示為目前組合中的最佳選項。
- 原始分數最低的地點會獲得 0 分,做為比較基準。這不代表該地點完全沒有設施,而是相較於其他評估選項,該地點最不適合。
- 其他分數則會按比例落在中間,讓使用者一目瞭然地比較各種選項。
方法 2:使用 Gemini Developer API
除了在 BigQuery 中使用固定的數學公式,Gemini Developer API 也提供強大的方式,可計算細微的自訂位置分數。
方法 1 非常適合根據設施數量進行純粹的量化評分,但無法輕鬆納入質性資料。使用 Gemini,您可以將 Places 洞察查詢中的數字與非結構化資料合併,例如公寓的文字說明 (例如這個地點適合家庭入住,晚上也很安靜」),或是特定使用者設定檔偏好設定 (例如這位使用者為家人預訂住宿,偏好位於中心位置的安靜區域」),以生成更細緻的分數。
準備 Gemini 適用的資料
如要使用這個方法,請將 BigQuery 匯總結果 (來自步驟 2) 轉換為 Markdown 格式,並與質性資料 (例如 Listing Description) 合併。
在本例中,我們有兩個特徵差異很大的房源。我們也會加入 Target User Profile,讓 Gemini 知道我們是為誰評分:
## 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.
系統指示
Gemini 需要系統指令,才能瞭解如何權衡這些不同的資料點。您可以明確告知模型特定設施的重要性,同時指示模型將文字說明的情緒納入考量。
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.
結構化輸出內容
為確保將 AI 整合至應用程式時的可靠性,您不應只依賴提示來決定輸出格式。請改用 Gemini 的結構化輸出功能。提供 responseSchema 可確保模型傳回符合確切系統需求的乾淨、可剖析的 JSON 陣列。
以我們的範例來說,我們可以強制執行下列結構定義:
{
"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"
}
}
}
}
輸出範例
傳送提示並定義 responseSchema 後,Gemini 會傳回結構化 JSON 陣列,可直接供應用程式使用。
請注意輸出內容中 Gemini 如何處理取捨。「The Downtowner」的公園數量非常多,但 Gemini 認為「週末很吵」的描述對幼兒來說是主要缺點。同時,「郊區綠洲」結合了優質的設施密度和適用的定性特徵 (例如「綠樹成蔭的寧靜街道」),因此獲得近乎完美的評分。
[
{
"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
}
]
這個方法可讓您提供高度個人化的評分,讓每位使用者都能瞭解並量身打造。
4. 在地圖上查看分數
如果查詢結果包含 GEOGRAPHY 資料欄,BigQuery Studio 會提供整合式地圖視覺化功能。由於查詢會輸出 location 欄,因此您可以立即以視覺化方式呈現分數。
按一下「Visualization」分頁標籤會顯示地圖,而「Data Column」下拉式選單則可控制要顯示的位置分數。在本例中,normalized_pet_score 是從「選項 1」範例視覺化。請注意,在這個範例中,apartment_listings 資料表新增了更多位置。

資料視覺化功能會顯示最適合建立分數的位置,深綠色圓圈代表 normalized_pet_score 較高的位置。如需更多地點洞察資料的視覺化選項,請參閱「將查詢結果視覺化」。
結論
您現在已掌握強大且可重複使用的方法,可建立細緻的店面分數。您從位置資訊開始,在 BigQuery 中建立單一 SQL 查詢,找出附近的地點 (使用 ST_DWITHIN),並依 good_for_children 和 allows_dogs 等進階屬性篩選地點,然後使用 COUNTIF 彙整結果。套用自訂權重並將結果標準化後,您就能產生單一易懂的分數,提供深入且可執行的洞察資料。您可以直接套用此模式,將原始位置資料轉換為重要的競爭優勢。
後續動作
現在輪到您大展身手了。本教學課程提供範本。您可以使用地點洞察架構中提供的豐富資料,建立最符合您用途的分數。您可以建立的其他分數包括:
- 「夜生活分數」:結合
primary_type(bar、night_club)、price_level和深夜營業時間的篩選條件,找出夜間最熱鬧的區域。 - 「健身與養生分數」:計算附近的
gyms、parks和health_food_stores,並篩選出有serves_vegetarian_food的餐廳,為注重健康的消費者提供地點評分。 - 「通勤族夢想分數」:找出附近有大量
transit_station和parking地點的位置,協助重視交通便利性的使用者。
貢獻者
Henrik Valve | DevX 工程師