نظرة عامة
يمكن أن تخبرك بيانات الموقع الجغرافي العادية بالمناطق القريبة، ولكنّها غالبًا ما تعجز عن الإجابة عن السؤال الأكثر أهمية: "ما مدى ملاءمة هذه المنطقة لي؟". تتسم احتياجات المستخدمين لديك بالدقة. فالعائلة التي لديها أطفال صغار تختلف أولوياتها عن أولويات شاب يعمل ولديه كلب. لمساعدتهم في اتّخاذ قرارات واثقة، عليك تقديم إحصاءات تعكس هذه الاحتياجات المحدّدة. تُعدّ نتيجة الموقع الجغرافي المخصّصة أداة فعّالة لتقديم هذه القيمة وإنشاء تجربة مستخدم مختلفة بشكل كبير.
يوضّح هذا المستند كيفية إنشاء نتائج مخصّصة ومتعدّدة الأوجه بشأن الموقع الجغرافي باستخدام مجموعة بيانات إحصاءات الأماكن في BigQuery. من خلال تحويل بيانات نقاط الاهتمام إلى مقاييس مفيدة، يمكنك إثراء تطبيقاتك الخاصة بالعقارات أو البيع بالتجزئة أو السفر وتزويد المستخدمين بالمعلومات ذات الصلة التي يحتاجون إليها. نوفّر أيضًا خيار استخدام Gemini Developer API كطريقة فعّالة لاحتساب نتائجك المتعلقة بالموقع الجغرافي.
تعزيز القيمة التجارية باستخدام النتائج المخصّصة
توضّح الأمثلة التالية كيف يمكنك ترجمة بيانات الموقع الجغرافي الأولية إلى مقاييس فعّالة تركّز على المستخدمين لتحسين تطبيقك.
- يمكن لمطوّري العقارات إنشاء "مقياس مناسب للعائلات" أو "مقياس مثالي للتنقّل" لمساعدة المشترين والمستأجرين في اختيار الحي المثالي الذي يتوافق مع أسلوب حياتهم، ما يؤدي إلى زيادة تفاعل المستخدمين، واكتساب عملاء محتملين أفضل جودة، وتحقيق إحالات ناجحة أسرع.
- يمكن لمهندسي السفر والضيافة إنشاء "مؤشر الحياة الليلية" أو "مؤشر جنة محبي مشاهدة المعالم السياحية" لمساعدة المسافرين في اختيار فندق يناسب أسلوب عطلتهم، ما يؤدي إلى زيادة معدلات الحجز ورضا العملاء.
- يمكن لمحلّلي البيع بالتجزئة إنشاء "نتيجة اللياقة البدنية والصحة" لتحديد الموقع الجغرافي الأمثل لافتتاح صالة رياضية جديدة أو متجر للأطعمة الصحية استنادًا إلى الأنشطة التجارية التكميلية القريبة، ما يزيد من إمكانية استهداف الفئة الديمغرافية المناسبة من المستخدمين.
في هذا الدليل، ستتعرّف على منهجية مرنة من ثلاثة أجزاء لإنشاء أي نوع من نتائج المواقع الجغرافية المخصّصة باستخدام بيانات "أماكن Google" مباشرةً في BigQuery. سنوضّح هذا النمط من خلال إنشاء مثالَين مختلفَين للنتائج: نتيجة مدى ملاءمة المكان للعائلات ونتيجة مدى ملاءمة المكان لمحبي الحيوانات الأليفة. يتيح لك هذا الأسلوب تجاوز عدد الأماكن والاستفادة من السمات الغنية والمفصّلة ضمن مجموعة بيانات Places Insights. يمكنك استخدام معلومات مثل ساعات العمل أو ما إذا كان المكان مناسبًا للأطفال أو يسمح باصطحاب الكلاب، وذلك لإنشاء مقاييس متطورة ومفيدة للمستخدمين.
سير عمل الحل

يستخدم هذا البرنامج التعليمي استعلام SQL واحدًا وفعّالاً لإنشاء نتيجة مخصّصة يمكنك تكييفها مع أي حالة استخدام. سنشرح هذه العملية من خلال إنشاء مثالَين على النتائج لمجموعة افتراضية من بيانات الشقق المتاحة للاستئجار.
المتطلبات الأساسية
قبل البدء، اتّبِع هذه التعليمات لإعداد "إحصاءات الأماكن".
1. وضع الأساس: المواقع الجغرافية محلّ الاهتمام
قبل إنشاء نتائج، يجب أن تتوفّر لديك قائمة بالمواقع الجغرافية التي تريد تحليلها. الخطوة الأولى هي التأكّد من توفّر هذه البيانات كجدول في 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 * على بيانات موقعك الجغرافي مشابهًا لما يلي.

2. تطوير المنطق الأساسي: استعلام تسجيل النقاط
بعد تحديد المواقع الجغرافية، تتمثّل الخطوة التالية في العثور على الأماكن القريبة ذات الصلة بالنتيجة المخصّصة وتصفيتها واحتسابها. يتم تنفيذ كل ذلك ضمن عبارة SELECT واحدة.
العثور على أماكن قريبة باستخدام البحث الجغرافي المكاني
أولاً، عليك العثور على جميع الأماكن من مجموعة بيانات "إحصاءات الأماكن" التي تقع على مسافة معيّنة من كل موقع جغرافي. الدالة
ST_DWITHIN في BigQuery مناسبة تمامًا لهذا الغرض. سنُجري عملية JOIN بين جدول apartment_listings وجدول places_insights للعثور على جميع الأماكن ضمن دائرة نصف قطرها 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 Developer 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، يمكنك الجمع بين الأرقام من طلب بحثك في "إحصاءات الأماكن" والبيانات غير المنظَّمة، مثل الوصف النصي الخاص ببيانات الشقق (على سبيل المثال، "هذا الموقع الجغرافي مناسب للعائلات، والمنطقة هادئة في الليل") أو تفضيلات ملفات المستخدمين المحدّدة (مثل "يحجز هذا المستخدم لعائلة ويفضّل الإقامة في منطقة هادئة في موقع مركزي")، وذلك لإنشاء نتيجة أكثر دقة.
تجهيز البيانات لاستخدامها في 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.
الناتج المنظَّم
لضمان الموثوقية عند دمج الذكاء الاصطناعي في تطبيقك، يجب عدم الاعتماد على الطلبات وحدها لتحديد تنسيق الإخراج. يمكنك بدلاً من ذلك استخدام ميزة النتائج المنظَّمة في 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. عرض نتائجك على الخريطة
يتضمّن BigQuery Studio تصوّرًا متكاملاً للخريطة لأي نتيجة طلب بحث تحتوي على عمود GEOGRAPHY. بما أنّ طلب البحث يعرض العمود location، يمكنك على الفور إنشاء عرض مرئي لنتائجك.
سيؤدي النقر على علامة التبويب Visualization إلى عرض الخريطة، بينما تتحكّم القائمة المنسدلة Data Column في درجة الموقع الجغرافي التي تريد عرضها. في هذا المثال، يتم عرض normalized_pet_score من المثال 1. يُرجى العِلم أنّه تمت إضافة المزيد من المواقع الجغرافية إلى جدول apartment_listings في هذا المثال.

يؤدي عرض البيانات إلى الكشف بنظرة سريعة عن المواقع الجغرافية الأنسب للنتيجة التي تم إنشاؤها، حيث تمثّل الدوائر الخضراء الداكنة المواقع الجغرافية التي تتضمّن normalized_pet_score أعلى في هذه الحالة. للاطّلاع على المزيد من خيارات عرض بيانات Places Insights، يُرجى الاطّلاع على عرض نتائج طلب البحث.
الخاتمة
أصبحت الآن تمتلك منهجية فعّالة ومتكررة لإنشاء نتائج دقيقة خاصة بالموقع الجغرافي. بدأت باستخدام مواقعك الجغرافية، وأنشأت طلب بحث واحدًا بلغة 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لمساعدة المستخدمين الذين يهمّهم سهولة الوصول إلى وسائل النقل.
المساهمون
Henrik Valve | مهندس DevX