קואורדינטות מפה ואריחים

בחירת פלטפורמה: Android iOS JavaScript

ב-SDK של מפות Google ל-Android נעשה שימוש במערכות הקואורדינטות הבאות:

  • ערכים של קו רוחב וקו אורך, שמפנים נקודה בעולם באופן ייחודי. (Google משתמשת בתקן World Geodetic System WGS84).
  • קואורדינטות עולמיות, שמפנות לנקודה במפה באופן ייחודי.
  • קואורדינטות של Pixel, שמפנות לפיקסל ספציפי במפה ברמת זום ספציפית.
  • קואורדינטות של משבצות, שמפנות למשבצת ספציפית במפה ברמת זום ספציפית.

קואורדינטות עולמיות

בכל פעם ש-API צריך לתרגם מיקום בעולם למיקום במפה, קודם צריך לתרגם את הערכים של קו הרוחב וקו האורך לקואורדינטה בעולם. כדי לבצע את התרגום הזה ב-API נעשה שימוש בהיטל Mercator.

כדי להקל על חישוב קואורדינטות הפיקסלים (ראו בהמשך), אנחנו מניחים שמפה ברמת זום 0 היא אריח יחיד בגודל אריח הבסיס. לאחר מכן אנחנו מגדירים קואורדינטות עולמיות ביחס לקואורדינטות של פיקסלים ברמת זום 0, באמצעות ההיטל כדי להמיר קווי רוחב וקווי אורך למיקומי פיקסלים באריח הבסיס הזה. הקואורדינטה עולמית הזו היא ערך של נקודה צפה (floating-point) שנמדד ממקור של היטל המפה אל המיקום הספציפי. חשוב לשים לב שמכיוון שהערך הזה הוא ערך של נקודה צפה (floating-point), הוא עשוי להיות מדויק הרבה יותר מהרזולוציה הנוכחית של תמונת המפה שמוצגת. קואורדינטה עולמית לא תלויה ברמת הזום הנוכחית, כלומר.

הקואורדינטות העולמיות במפות Google נמדדות במקור ההיטל של Mercator (בפינה הצפון-מערבית של המפה בקו אורך של 180 מעלות ובקו רוחב של כ-85 מעלות), והן עולות בכיוון x לכיוון מזרח (ימינה) ועולה בכיוון y לכיוון דרום (למטה). מכיוון שהמשבצת הבסיסית במפות Google של Mercator היא בגודל 256 x 256 פיקסלים, שטח הקואורדינטות העולמי שניתן לשימוש הוא {0-256}, {0-256}.

חשוב לשים לב שלהיטל Mercator יש רוחב סופי לאורך זמן, אבל גובה אינסופי עם קו רוחב. חתכנו את תמונות מפת הבסיס באמצעות ההיטל של Mercator בערך ב-85 מעלות +/- כדי ליצור ריבוע של צורת המפה, מה שמאפשר לוגיקה קלה יותר לבחירת משבצת. חשוב לשים לב שהיטל עשוי ליצור קואורדינטות עולמיות מחוץ לשטח הקואורדינטות שניתן להשתמש בו במפה הבסיסית, למשל אם מציבים את הסמן ליד הקטבים.

קואורדינטות של פיקסלים

קואורדינטות ב-Pixel מפנות לפיקסל ספציפי במפה ברמת זום ספציפית, ואילו קואורדינטות העולם משקפות מיקומים מוחלטים בהיטל נתון. הקואורדינטות של Pixel מחושבות לפי הנוסחה הבאה:

pixelCoordinate = worldCoordinate * 2zoomLevel

מהמשוואה שלמעלה, חשוב לשים לב שכל רמת זום הגדלה גדולה פי שניים גם במסלול x וגם במסלול y. לכן, כל רמת זום גבוהה יותר תוביל לרזולוציה גבוהה פי ארבעה מהרמה הקודמת. לדוגמה, ברמת זום 1, המפה מורכבת מ-4 משבצות בגודל 256x256 פיקסלים, ולכן שטח הפיקסלים הוא 512x512. ברמת זום 19, אפשר להפנות לכל פיקסל של x ו-y במפה באמצעות ערך בין 0 לבין 256 * 219.

מאחר שאנחנו מבססים קואורדינטות עולמיות על גודל המשבצת של המפה, לחלק השלם של קואורדינטת הפיקסלים יש השפעה על זיהוי הפיקסל המדויק במיקום הזה ברמת הזום הנוכחית. שימו לב שברמת הזום 0, הקואורדינטות של הפיקסלים שוות לקואורדינטות בעולם.

עכשיו יש לנו דרך לציין בצורה מדויקת כל מיקום במפה, בכל רמת זום. ה-SDK של מפות Google ל-Android בונה אזור תצוגה על סמך מרכז רמת הזום של המפה (כ-LatLng) וגודל רכיב ה-DOM שמכיל את התיבה התוחמת הזו, ומתרגם את התיבה התוחמת הזו לקואורדינטות פיקסלים. לאחר מכן ה-API קובע באופן לוגי את כל משבצות המפה שנמצאות בתוך גבולות הפיקסלים הנתונים. מתבצעת הפניה לכל אחד מפרטי המפה האלה באמצעות קואורדינטות של משבצות, שמפשטות את ההצגה של תמונות המפה.

קואורדינטות של משבצות

ה-API לא יכול לטעון את כל תמונות המפה בבת אחת עבור רמות הזום הגבוהות יותר. במקום זאת, ה-API מפרק את התמונות בכל רמת זום לקבוצה של משבצות מפה, שמסודרות בצורה לוגית לפי הסדר שהאפליקציה מבינה. כשגוללים במפה למיקום חדש, או לרמת זום חדשה, ה-API קובע אילו משבצות יש צורך באמצעות קואורדינטות של פיקסלים, ומתרגם את הערכים האלה לקבוצה של משבצות שצריך לאחזר. הקואורדינטות של המשבצות האלה מוקצות באמצעות סכמה, וכך קל באופן לוגי לקבוע איזה משבצת מכילה את התמונות בכל נקודה נתונה.

כרטיסי מידע במפות Google ממוספרים מאותו המקור כמו מספר הפיקסלים. לצורך ההטמעה של היטל Mercator על ידי Google, משבצת המקור נמצאת תמיד בפינה הצפון-מערבית של המפה, כאשר ערכי x עולים ממערב למזרח והערכים של y עולים מצפון לדרום. המשבצות נוספות לאינדקס באמצעות קואורדינטות x,y מהמקור הזה. לדוגמה, ברמת זום 2, כשכדור הארץ מחולק ל-16 משבצות, אפשר להפנות לכל משבצת באמצעות צמד x,y ייחודי:

מפת העולם מחולקת לארבע שורות ו-4 עמודות של אריחים.

חשוב לשים לב שכשמחלקים את קואורדינטות הפיקסלים בגודל המשבצת (256) ומחלקים את החלקים השלמים של התוצאה, נוצר קואורדינטת המשבצת ברמת המרחק מהתצוגה הנוכחית בתור תוצר לוואי.

דוגמה

בדוגמה הבאה מוצגות הקואורדינטות של שיקגו, אילינוי: ערכי קו רוחב/אורך, קואורדינטות בעולם, קואורדינטות של פיקסלים וקואורדינטות של משבצות. אפשר להשתמש בבקרת הזום כדי לראות את ערכי הקואורדינטות ברמות מרחק שונות של מרחק.

כדי לראות איך הקואורדינטות מחושבות, צריך לעיין בקוד.