שדות תעופה הם מתחמים גדולים עם כמה טרמינלים, וניווט מדויק הוא חיוני כדי להגיע בזמן לטיסות ולצאת מהן בזמן. בדרך כלל, Google Maps Geocoding API מחזיר קואורדינטה (קו רוחב/קו אורך), שברוב המקרים תהיה מרכז המסה של מתחם שדה התעופה הגדול. האפליקציה הזו היא כלי אינטראקטיבי שנועד לעזור למשתמשים לאתר ולראות מיקומים מדויקים במתחם גדול ומורכב, כמו טרמינלים ספציפיים או נקודות איסוף והורדה בתוך שדה תעופה.
כך המערכת עושה זאת:
חיפוש שדה תעופה/מקום: המשתמשים מתחילים בחיפוש של מיקום מרכזי (למשל, "Indira Gandhi International Airport") באמצעות הקלט של ההשלמה האוטומטית של Google Places, שמוגבל להודו.
איתור מיקום משני: אחרי שבוחרים מיקום ראשי, הסקריפט משתמש ב-Google Places API כדי לאחזר פרטים, כולל כל 'יעד משני' שמשויך למקום הזה (כמו טרמינל 1, טרמינל 3, שערים ספציפיים וכו', אם הם זמינים בנתונים של Google).
מיפוי חזותי: הסקריפט משתמש ב-Geocoding API כדי למצוא את הקואורדינטות של המיקום הראשי ושל יעדי המשנה שלו.
לאחר מכן מוצג המיקום הראשי, ובמפה מופיעים סמנים נפרדים שאפשר ללחוץ עליהם (עיגולים כחולים) לכל יעד משנה שזוהה.
זיהוי מדויק: כשלוחצים על סמן של יעד משנה, הוא מודגש (הופך לירוק) ונפתח חלון מידע שבו מוצג השם שלו ופרטים נוספים שזמינים (כמו כתובת או סוג), כדי שהמשתמש יוכל לוודא שהוא בחר את הנקודה הספציפית הנכונה.
תצוגה לפי הקשר: המפה מתאימה את התצוגה שלה באופן אוטומטי (fitBounds
) כדי לוודא שכל הסמנים הרלוונטיים (המיקום הראשי + יעדי המשנה) גלויים בבירור.
ממשקי API של Google Maps Platform באפליקציית הניווט בשדה התעופה
במאמר הזה מוסברים ממשקי ה-API העיקריים של הפלטפורמה של מפות Google והפרמטרים שלהם, שמשמשים באפליקציית ההדגמה 'ניווט לשדה התעופה' שמופיעה כאן. האפליקציה משתמשת בכמה שירותים כדי להציג מפה, לחפש מקומות, לספק מידע מפורט על מקומות ותובנות מתקדמות לגבי מיקומים.
1. הפעלה והצגה של המפה
הבסיס של האפליקציה הוא המפה האינטראקטיבית עצמה.
- ה-API שבו נעשה שימוש:
google.maps.Map
(מ-Maps JavaScript API) - מטרה: ליצור ולהציג את המפה האינטראקטיבית בדף האינטרנט.
- פרמטרים מרכזיים:
-
center
: מגדיר את המרכז הגיאוגרפי הראשוני של המפה. באפליקציה הזו, ההגדרה הראשונית היא הקואורדינטות של דלהי ({ lat: 28.461835685621395, lng: 77.05004035761647 }
). -
zoom
: מגדיר את רמת הזום ההתחלתית של המפה. DEFAULT_ZOOM_LEVEL
(15) משמש לתצוגה מקרוב. -
mapId
: מזהה ייחודי של סגנון מפה שהוגדר במסוף Google Cloud.
-
2. חיפוש מקומות והשלמה אוטומטית
הפונקציונליות של סרגל החיפוש מבוססת על Places API.
- API Used:
google.maps.places.Autocomplete
(from the Places Library of the Maps JavaScript API) - מטרה: מספקת השלמה אוטומטית של טקסט חיזוי לחיפושים גיאוגרפיים בזמן שהמשתמש מקליד, ומציעה מקומות רלוונטיים כמו שדות תעופה.
- פרמטרים מרכזיים:
-
input
: רכיב הקלט של HTML (#search-input
) שבו המשתמש מקליד את השאילתה. -
componentRestrictions
: סינון תוצאות החיפוש למדינה ספציפית. בדוגמה הזו,{ country: 'in' }
מגביל את התוצאות להודו. -
fields
: מציין את שדות הנתונים שיוחזרו עבור המקום שנבחר.['place_id']
משמשת בהתחלה לאחזור רק של המזהה הייחודי של המקום, כדי לבצע אופטימיזציה של העברת הנתונים.
-
- איך משתמשים בהשלמה אוטומטית
// Initialize Autocomplete
const autocomplete = new google.maps.places.Autocomplete(input, {
componentRestrictions: { country: 'in' },
fields: ['place_id'],
});
// Add listener to the Autocomplete
autocomplete.addListener('place_changed', async () => {
const place = autocomplete.getPlace();
if (!place.place_id) {
return;
}
// Once a place is selected, fetch details
await getPlaceDetails(place.place_id);
});
3. אחזור מידע מפורט על מקומות וטיפול ביעדי משנה
אחרי שבוחרים מקום מתוך ההצעות להשלמה אוטומטית, המערכת מאחזרת פרטים מקיפים יותר.
- ה-API שנעשה בו שימוש: Places API (באמצעות קריאה ישירה ל-
fetch
אלhttps://places.googleapis.com/v1/places/{placeId}
) - מטרה: אחזור פרטים מפורטים על מקום ספציפי, כולל שם התצוגה, הכתובת, הסוגים שלו, וחשוב מכך,
subDestinations
(למשל, טרמינלים נפרדים או אזורים חשובים במתחם גדול יותר כמו שדה תעופה). - פרמטרים מרכזיים בכתובת ה-URL:
-
{placeId}
: המזהה הייחודי של המקום שנבחר. -
fields
: מציין את שדות הנתונים המדויקים שיש לאחזר. האפליקציה מבקשתid
,displayName
,subDestinations
,types
ו-formattedAddress
. השלב הזה חשוב מאוד כדי לשלוט בעלויות ולקבל רק את הנתונים הנחוצים.
-
- איך מקבלים את
subDestinations
בהינתן מיקום
async function getPlaceDetails(placeId) {
// Construct the URL for the Places API (v1) details endpoint
// The 'fields' parameter is crucial for requesting subDestinations
const url = `https://places.googleapis.com/v1/places/${placeId}?key=YOUR_API_KEY&fields=id,displayName,subDestinations,types,formattedAddress`;
const response = await fetch(url);
const data = await response.json();
// Accessing subDestinations from the Places API response
if (data.subDestinations && data.subDestinations.length > 0) {
for (const subDestination of data.subDestinations) {
// Each subDestination object contains an 'id' and 'displayName'
console.log(`Sub-destination ID: ${subDestination.id}`);
console.log(`Sub-destination Name: ${subDestination.displayName?.text}`);
// This subDestination.id is then used in a geocoding call (as shown in section 4)
}
}
}
**Handling `subDestinations`:** When the Places API returns
`subDestinations`, the application initiates a process for each one:
1. **Geocoding:** It uses the `google.maps.Geocoder` to convert
each `subDestination.id` into its precise geographical coordinates
(`lat`, `lng`).
1. **Marker Placement:** A distinct marker is added to the map for
each sub-destination. These markers are styled with a blue circle icon
to differentiate them.
1. **Map Bounds Adjustment:** The `google.maps.LatLngBounds` object
is used to dynamically expand the map's view to encompass all retrieved
sub-destinations, verifying they are all visible within the current map
frame.
1. **Interactive Information Window:** A `click` listener is
attached to each sub-destination marker. When clicked, the marker's
icon changes to green, and an `InfoWindow` appears, displaying the
sub-destination's name, address, and types. This provides immediate,
detailed context to the user.
4. המרת כתובות לקואורדינטות (geocoding) והמרת קואורדינטות לכתובות (reverse geocoding): אחזור פרטים של יעדי משנה
האפליקציה משתמשת בגיאו-קידוד לשתי מטרות עיקריות: המרת מזהי מקומות לקואורדינטות והמרת קואורדינטות בחזרה לפרטי מיקום. בקטע הזה אנחנו מסבירים איך משתמשים בגיאו-קידוד כדי לקבל מידע מפורט על יעדי משנה.
- ממשקי ה-API שנעשה בהם שימוש:
google.maps.Geocoder
(מ-Maps JavaScript API) ו-Geocoding API (דרך קריאה ישירה ל-fetch
אלhttps://maps.googleapis.com/maps/api/geocode/json
) - מטרה:
-
google.maps.Geocoder
: משמש להמרה שלplaceId
(שהתקבל מ-Autocomplete או מ-Places API) לקואורדינטות גיאוגרפיות (lat
,lng
) ולחלון תצוגה, כדי שהמפה תתמרכז ותבצע זום בצורה נכונה על המקום שנבחר ועל יעדי המשנה שלו. - Geocoding API (
fetch
): משמש להמרת קואורדינטות לכתובות (reverse geocoding) ולאחזור נתוני מיקום מתקדמים כמו מתארים של בניינים ונקודות ניווט.
-
- פרמטרים מרכזיים:
google.maps.Geocoder.geocode()
:-
placeId
: מזהה המקום לגיאו-קידוד. -
location
: אובייקטLatLng
להמרת קואורדינטות לכתובות (reverse geocoding).
-
- קריאה ל-Geocoding API
fetch
:-
latlng
: קואורדינטות של קו הרוחב וקו האורך למיקום גיאוגרפי הפוך. -
extra_computations=BUILDING_AND_ENTRANCES
: הפרמטר הקריטי הזה מבקש נתונים נוספים, במיוחד נתוני טביעות רגל של בניינים ומידע על כניסות, שמשמשים להצגת קווי מתאר של בניינים ונקודות ניווט.
-
איך משתמשים במזהה subDestination
כדי לאחזר פרטים נוספים (למשל מיקום, כתובת מעוצבת, סוגים)
function geocodeAndAddMarker(subDestination, bounds) {
return new Promise((resolve, reject) => {
const geocoder = new google.maps.Geocoder();
// Using the subDestination.id to geocode and get location details
geocoder.geocode({ placeId: subDestination.id }, (results, status) => {
if (status === "OK" && results[0]) {
const location = results[0].geometry.location;
const displayName = subDestination.displayName?.text || "Sub-destination";
const formattedAddress = results[0].formatted_address; // Further detail from Geocoding
const types = results[0].types; // Further detail from Geocoding
const marker = new google.maps.Marker({
map: map,
position: location,
title: displayName,
icon: {
path: google.maps.SymbolPath.CIRCLE,
fillColor: 'blue',
fillOpacity: 0.6,
strokeWeight: 0,
scale: 8
}
});
marker.addListener('click', () => {
marker.setIcon({
path: google.maps.SymbolPath.CIRCLE,
fillColor: 'green',
fillOpacity: 0.6,
strokeWeight: 0,
scale: 8
});
const infowindow = new google.maps.InfoWindow({
content: `<b>${displayName}</b><br><p>Address: ${formattedAddress}</p><p>Types: ${types.join(', ')}</p>`,
});
infowindow.open(map, marker);
});
bounds.extend(location);
resolve(true);
} else {
reject(new Error(`Geocoding failed for placeId: ${subDestination.id}`));
}
});
});
}
5. הצגת סמנים
סמנים משמשים להדגשת מיקומים ספציפיים במפה.
- ממשקי API שנעשה בהם שימוש:
google.maps.Marker
(מ-Maps JavaScript API) ו-google.maps.marker.AdvancedMarkerElement
עםgoogle.maps.marker.PinElement
(מספריית הסמנים של Maps JavaScript API) - מטרה:
-
google.maps.Marker
: משמש לסימון הראשוני שניתן להזזה (למרות שהערך שלdraggable
מוגדר כ-false
בקוד שסופק, הוא חלק מהיכולת שלו) ולסימון בסיסי של יעדי משנה, כפי שמתואר בקטע 3. -
AdvancedMarkerElement
ו-PinElement
: משמשים לסימון נקודות ניווט שקל יותר להבחין בהן מבחינה ויזואלית, ומאפשרים התאמה אישית של סגנון הסיכה של הסמן.
-
- פרמטרים מרכזיים:
-
position
: הקואורדינטות של המיקום שבו יוצב הסמן.LatLng
-
map
: מופע המפה שבו יוצג הסמן. title
: הטקסט שמוצג כשמעבירים את העכבר מעל הסמן.-
icon
: מאפשר להשתמש בסמלים מותאמים אישית עבורgoogle.maps.Marker
(למשל,google.maps.SymbolPath.CIRCLE
עם צבעים בהתאמה אישית). -
content
: עבורAdvancedMarkerElement
, מאפשר הטמעה של תוכן HTML מותאם אישית, כוללPinElement
לסיכות עם סגנון מוגדר מראש. - פרמטרים של
PinElement
: background
, borderColor
, glyphColor
, scale
להתאמה אישית של המראה.
-
6. הצגת קווי מתאר של מבנים
האפליקציה יכולה להציג באופן ויזואלי את טביעת הרגל של בניינים.
- ה-API שבו נעשה שימוש:
google.maps.Data
(מ-Maps JavaScript API) - מטרה: הצגת נתונים גיאוגרפיים, כמו קווי מתאר של בניינים (מוחזרים כ-GeoJSON
display_polygon
מ-extra_computations
של Geocoding API). - פרמטרים מרכזיים:
-
map
: מופע המפה שאליו מוחלת שכבת הנתונים. -
style
: הגדרה של המראה החזותי של תכונות GeoJSON (לדוגמה,strokeColor
,fillColor
,fillOpacity
). -
addGeoJson()
: שיטה להוספת נתוני GeoJSON לשכבה.
-
7. גבולות המפה ושינוי מרחק התצוגה
לוודא שתצוגת המפה כוללת את כל המיקומים הרלוונטיים.
- ה-API שבו נעשה שימוש:
google.maps.LatLngBounds
(מ-Maps JavaScript API) - מטרה: להתאים באופן דינמי את אזור התצוגה של המפה כך שיתאים לאוסף של נקודות גיאוגרפיות (למשל, המקום הראשי וכל יעדי המשנה שלו).
- שיטות עיקריות:
-
extend(location)
: מוסיף נקודהLatLng
לגבולות, מרחיב אותם אם צריך. -
fitBounds(bounds)
: משנה את מרכז המפה ואת רמת הזום כדי להציג את כל האזור שמוגדר באובייקטLatLngBounds
.
-
האפליקציה משלבת בין ממשקי ה-API של פלטפורמת מפות Google כדי לספק חוויה מקיפה ואינטראקטיבית של חיפוש מקומות, צפייה בפרטים שלהם והצגה חזותית של מידע גיאוגרפי קשור, כמו יעדי משנה ומתארים של בניינים.
הערות לגבי הטמעה שימו לב שהפתרון הזה לא פועל בכל אזורי שדות התעופה, והוא תלוי בזמינות הנתונים (של טרמינל שדה התעופה).
מקורות מידע Geocoding API Places API Maps Javascript API
מחברים: