نمای کلی

دادههای استاندارد موقعیت مکانی میتوانند به شما بگویند چه چیزهایی در نزدیکی شما هستند ، اما اغلب نمیتوانند به سوال مهمتر پاسخ دهند: "این منطقه چقدر برای من خوب است؟" نیازهای کاربران شما متنوع است. یک خانواده با فرزندان خردسال در مقایسه با یک متخصص جوان با سگ، اولویتهای متفاوتی دارند. برای کمک به آنها در تصمیمگیریهای مطمئن، باید بینشهایی ارائه دهید که منعکس کننده این نیازهای خاص باشد. امتیاز موقعیت مکانی سفارشی ابزاری قدرتمند برای ارائه این ارزش و ایجاد یک تجربه کاربری متمایز و قابل توجه است.
این سند نحوه ایجاد امتیازهای مکانی سفارشی و چندوجهی را با استفاده از مجموعه دادههای Places Insights در BigQuery شرح میدهد. با تبدیل دادههای POI به معیارهای معنادار، میتوانید برنامههای املاک، خردهفروشی یا مسافرتی خود را غنیسازی کرده و اطلاعات مرتبط مورد نیاز کاربران را در اختیار آنها قرار دهید. ما همچنین گزینهای را برای استفاده از Gemini Developer API به عنوان روشی قدرتمند برای محاسبه امتیازهای مکانی شما ارائه میدهیم.
با امتیازهای متناسب، ارزش کسب و کار را افزایش دهید
مثالهای زیر نشان میدهند که چگونه میتوانید دادههای خام موقعیت مکانی را به معیارهای قدرتمند و کاربرمحور تبدیل کنید تا برنامه خود را بهبود بخشید.
- توسعهدهندگان املاک میتوانند «امتیاز سازگاری با خانواده» یا «امتیاز رویایی رفت و آمد» ایجاد کنند تا به خریداران و مستاجران کمک کنند محلهی ایدهآلی را که با سبک زندگیشان مطابقت دارد، انتخاب کنند و این امر منجر به افزایش تعامل کاربر، افزایش کیفیت سرنخها و افزایش سرعت تبدیل میشود.
- مهندسان سفر و هتلداری میتوانند «امتیاز تفریحات شبانه» یا «امتیاز بهشت گردشگران» را ایجاد کنند تا به مسافران در انتخاب هتلی که با سبک تعطیلات آنها مطابقت دارد، کمک کنند و نرخ رزرو و رضایت مشتری را افزایش دهند.
- تحلیلگران خردهفروشی میتوانند یک «امتیاز تناسب اندام و سلامتی» ایجاد کنند تا مکان بهینه برای یک باشگاه ورزشی جدید یا فروشگاه مواد غذایی سالم را بر اساس کسبوکارهای مکمل مجاور شناسایی کنند و پتانسیل هدف قرار دادن جمعیت مناسب کاربر را به حداکثر برسانند.
در این راهنما، شما یک روش انعطافپذیر و سهقسمتی برای ساخت هر نوع امتیاز مکانی سفارشی با استفاده از دادههای Places مستقیماً در BigQuery خواهید آموخت. ما این الگو را با ساخت دو امتیاز نمونه متمایز نشان خواهیم داد: امتیاز سازگاری با خانواده و امتیاز بهشت صاحبان حیوانات خانگی . این رویکرد به شما امکان میدهد فراتر از تعداد مکانها حرکت کنید و از ویژگیهای غنی و دقیق موجود در مجموعه دادههای Places Insights بهره ببرید. میتوانید از اطلاعاتی مانند ساعات کاری، اینکه آیا یک مکان برای کودکان مناسب است یا اینکه آیا اجازه نگهداری سگ را میدهد، برای ایجاد معیارهای پیچیده و معنادار برای کاربران خود استفاده کنید.
گردش کار راهکار

این آموزش از یک کوئری SQL قدرتمند برای ساخت یک امتیاز سفارشی استفاده میکند که میتوانید آن را با هر موردی تطبیق دهید. ما این فرآیند را با ساخت دو امتیاز نمونه برای یک مجموعه فرضی از لیست آپارتمانها طی خواهیم کرد.
پیشنیازها
قبل از شروع، برای تنظیم Places Insights این دستورالعملها را دنبال کنید.
۱. پایه و اساس خود را بنا کنید: مکانهای مورد علاقهتان
قبل از اینکه بتوانید امتیازها را ایجاد کنید، به لیستی از مکانهایی که میخواهید تجزیه و تحلیل کنید نیاز دارید. اولین قدم این است که مطمئن شوید این دادهها به عنوان یک جدول در BigQuery وجود دارند. نکته کلیدی این است که برای هر مکان یک شناسه منحصر به فرد و یک ستون 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 * روی دادههای موقعیت مکانی شما چیزی شبیه به این خواهد بود.

۲. منطق اصلی را توسعه دهید: پرس و جوی امتیازدهی
با مشخص شدن مکانهایتان، مرحله بعدی پیدا کردن، فیلتر کردن و شمارش مکانهای نزدیک مرتبط با امتیاز سفارشی شما است. همه این کارها در یک دستور SELECT انجام میشود.
با جستجوی مکانی، مکانهای نزدیک را پیدا کنید
ابتدا، باید تمام مکانهایی را از مجموعه دادههای Places Insights که در فاصله مشخصی از هر یک از مکانهای شما قرار دارند، پیدا کنید. تابع ST_DWITHIN در BigQuery برای این کار عالی است. ما یک JOIN بین جدول apartment_listings و جدول places_insights انجام میدهیم تا تمام مکانها را در شعاع ۸۰۰ متری پیدا کنیم. یک 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;
نتیجه این کوئری مشابه این خواهد بود.

ما در بخش بعدی بر اساس این نتایج کار خواهیم کرد.
۳. امتیاز را ایجاد کنید
حالا که تعداد مکانها و وزن هر نوع مکان را برای هر مکان دارید، میتوانید امتیاز مکان سفارشی را ایجاد کنید. در این بخش دو گزینه را بررسی خواهیم کرد: استفاده از محاسبه سفارشی خودتان در BigQuery یا استفاده از Gemini Developer API .
گزینه ۱: از محاسبه سفارشی خود در BigQuery استفاده کنید
شمارشهای خام از مرحله قبل مفید هستند، اما هدف، یک امتیاز واحد و کاربرپسند است. مرحله آخر، ترکیب این شمارشها با استفاده از وزنها و سپس نرمالسازی نتیجه در مقیاس ۰ تا ۱۰ است.
اعمال وزنهای سفارشی انتخاب وزنها هم هنر و هم علم است. آنها باید منعکسکننده اولویتهای تجاری شما یا آنچه که برای کاربرانتان مهمتر میدانید، باشند. برای امتیاز «دوستی خانوادگی» ممکن است تصمیم بگیرید که یک پارک دو برابر یک موزه اهمیت دارد. با بهترین فرضیات خود شروع کنید و بر اساس بازخورد کاربران ما، این کار را تکرار کنید.
نرمالسازی امتیاز پرسوجوی زیر از دو عبارت جدولی مشترک (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;
نتایج کوئری مشابه زیر خواهد بود. دو ستون آخر نمرات نرمال شده هستند.

نمره نرمال شده را درک کنید
درک این نکته مهم است که چرا این مرحله نهایی نرمالسازی بسیار ارزشمند است. امتیازهای وزنی خام میتوانند بسته به تراکم شهری مکانهای شما، از ۰ تا یک عدد بالقوه بسیار بزرگ متغیر باشند. امتیاز 500 برای کاربری که اطلاعات زمینهای ندارد، بیمعنی است.
نرمالسازی، این اعداد انتزاعی را به یک رتبهبندی نسبی تبدیل میکند. با مقیاسبندی نتایج از ۰ تا ۱۰، امتیاز به وضوح نشان میدهد که هر مکان در مجموعه دادههای خاص شما چگونه با مکانهای دیگر مقایسه میشود:
- امتیاز ۱۰ به مکانی با بالاترین امتیاز خام اختصاص داده میشود و آن را به عنوان بهترین گزینه در مجموعه فعلی مشخص میکند.
- امتیاز ۰ به مکانی با کمترین امتیاز خام اختصاص داده میشود و آن را به عنوان مبنای مقایسه قرار میدهد. این بدان معنا نیست که مکان هیچ امکانات رفاهی ندارد، بلکه به این معنی است که نسبت به سایر گزینههای مورد ارزیابی، نامناسبترین است.
- تمام امتیازات دیگر به طور متناسب در بین این دو قرار میگیرند و به کاربران شما روشی واضح و شهودی برای مقایسه گزینههایشان در یک نگاه ارائه میدهند.
گزینه ۲: استفاده از رابط برنامهنویسی کاربردی توسعهدهندگان Gemini
به عنوان جایگزینی برای استفاده از یک فرمول ریاضی ثابت در BigQuery، رابط برنامهنویسی کاربردی توسعهدهندگان Gemini روشی قدرتمند برای محاسبه امتیازهای مکانی سفارشی و ظریف ارائه میدهد.
اگرچه گزینه ۱ برای امتیازدهی صرفاً کمی بر اساس تعداد امکانات رفاهی عالی است، اما نمیتواند به راحتی دادههای کیفی را در نظر بگیرد. با استفاده از Gemini، میتوانید اعداد حاصل از جستجوی Places Insights خود را با دادههای بدون ساختار، مانند توضیحات متنی آگهی آپارتمان (مثلاً "این مکان برای خانوادهها مناسب است و منطقه در شب ساکت است") یا تنظیمات خاص پروفایل کاربر (مثلاً "این کاربر برای یک خانواده رزرو میکند و یک منطقه آرام در یک مکان مرکزی را ترجیح میدهد") ترکیب کنید تا امتیاز دقیقتری ایجاد کنید.
آمادهسازی دادهها برای جمینی
برای استفاده از این روش، نتایج تجمیع 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.
دستورالعملهای سیستم
جمینی برای اینکه بداند چگونه این نقاط داده مختلف را وزن کند، به دستورالعملهای سیستمی نیاز دارد. شما میتوانید به صراحت به مدل بگویید که امکانات خاص چقدر مهم هستند، در عین حال به آن دستور دهید که احساسات موجود در توضیحات متنی را نیز در نظر بگیرد.
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.
خروجی ساختاریافته
برای اطمینان از قابلیت اطمینان هنگام ادغام هوش مصنوعی در برنامه خود، نباید فقط به فرم خروجی متکی باشید. در عوض، از ویژگی خروجی ساختار یافته 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) بدهبستانها را مدیریت میکند. «صاحب مرکز شهر» تعداد پارک فوقالعاده بالایی دارد، اما جمینی توصیف «سروصدا در آخر هفتهها» را به عنوان یک نکته منفی بزرگ برای یک کودک نوپا معرفی میکند. در همین حال، «سابربن اوسیس» (Suburban Oasis) با ترکیب تراکم امکانات عالی با ویژگیهای کیفی قابل اجرا مانند «خیابان آرام و درختکاری شده» تقریباً امتیاز کامل را کسب میکند.
[
{
"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
}
]
این روش به شما امکان میدهد امتیازدهی بسیار شخصیسازیشدهای ارائه دهید که برای هر کاربر قابل فهم و متناسب با او باشد.
۴. نمرات خود را روی نقشه تجسم کنید
BigQuery Studio شامل یک نمایش نقشه یکپارچه برای هر نتیجه پرسوجویی است که شامل ستون GEOGRAPHY باشد. از آنجایی که پرسوجوی ما ستون location را نمایش میدهد، میتوانید بلافاصله امتیازات خود را نمایش دهید.
با کلیک بر روی تب Visualization ، نقشه نمایش داده میشود و منوی کشویی Data Column امتیاز مکانی را که باید نمایش داده شود، کنترل میکند. در این مثال، normalized_pet_score از مثال Option 1 نمایش داده شده است. توجه داشته باشید که برای این مثال، مکانهای بیشتری به جدول apartment_listings اضافه شدهاند.

تجسم دادهها در یک نگاه، مناسبترین مکانها برای امتیاز ایجاد شده را نشان میدهد، که در این مورد دایرههای سبز تیرهتر نشاندهنده مکانهایی با امتیاز normalized_pet_score بالاتر هستند. برای گزینههای تجسم بیشتر دادههای Places Insights، به Visualize query results مراجعه کنید.
نتیجهگیری
اکنون شما یک روش قدرتمند و تکرارپذیر برای ایجاد امتیازهای مکانی دقیق دارید. با شروع از مکانهای خود، یک کوئری SQL واحد در BigQuery ایجاد کردید که مکانهای نزدیک را با ST_DWITHIN پیدا میکند، آنها را با ویژگیهای پیشرفتهای مانند good_for_children و allows_dogs فیلتر میکند و نتایج را با COUNTIF جمع میکند. با اعمال وزنهای سفارشی و نرمالسازی نتیجه، یک امتیاز واحد و کاربرپسند ایجاد کردید که بینش عمیق و کاربردی ارائه میدهد. میتوانید مستقیماً از این الگو برای تبدیل دادههای خام مکانی به یک مزیت رقابتی قابل توجه استفاده کنید.
اقدامات بعدی
حالا نوبت شماست که بسازید. این آموزش یک الگو ارائه میدهد. میتوانید از دادههای غنی موجود در طرحواره Places Insights برای ایجاد امتیازهایی که برای مورد استفاده شما ضروریتر هستند استفاده کنید. این امتیازهای دیگری را که میتوانید بسازید در نظر بگیرید:
- «امتیاز تفریحات شبانه»: فیلترهای
primary_type(bar،night_club)،price_levelو ساعات کاری آخر شب را ترکیب کنید تا پرجنبوجوشترین مناطق بعد از تاریکی هوا را پیدا کنید. - «امتیاز تناسب اندام و سلامتی»:
gyms،parksوhealth_food_storesنزدیک را بشمارید و رستورانهایی را که دارایserves_vegetarian_foodهستند فیلتر کنید تا مکانها را برای کاربرانی که به سلامتی خود اهمیت میدهند، امتیازدهی کنید. - «امتیاز رویایی رفت و آمد»: مکانهایی با تراکم بالای
transit_stationوparkingنزدیک را پیدا کنید تا به کاربرانی که برای دسترسی به حمل و نقل ارزش قائل هستند، کمک کنید.
مشارکتکنندگان
هنریک والو | مهندس DevX