המרת קו רוחב ואורך לנקודה דו-ממדית בג'אווה

1. סקירה כללית

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

במדריך זה נסקור את הקרנת Mercator ונלמד כיצד ליישם את שתי הגרסאות שלה.

2. הקרנת מרקטור

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

ישנן שתי דרכים ליישם את השלכת מרקטור. הקרנת פסאדו מרקטור מתייחסת לכדור הארץ כאל כדור. הקרנת Mercator האמיתית מדגמנת את כדור הארץ כאליפסואיד. אנו ניישם את שתי הגרסאות.

נתחיל בשיעור בסיס לשתי יישומי הקרנת Mercator:

מחלקה מופשטת Mercator {סופי כפול סטטי RADIUS_MAJOR = 6378137.0; כפול סטטי סופי RADIUS_MINOR = 6356752.3142; מופשט כפול yAxisProjection (קלט כפול); מופשט כפול xAxisProjection (קלט כפול); }

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

2.1. הקרנת Mercator כדורית

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

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

זה נקרא גם הקרנת Web Mercator - הנפוצה ביישומי אינטרנט כולל מפות גוגל.

בואו ליישם גישה זו:

מחלקה ציבורית SphericalMercator מרחיב את Mercator {@Override xAxisProjection כפול (קלט כפול) {להחזיר Math.toRadians (קלט) * RADIUS_MAJOR; } @Override כפול yAxisProjection (קלט כפול) {החזר Math.log (Math.tan (Math.PI / 4 + Math.toRadians (קלט) / 2)) * RADIUS_MAJOR; }}

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

בואו נבדוק המרה פשוטה:

Assert.assertEquals (2449028.7974520186, sphericalMercator.xAxisProjection (22)); Assert.assertEquals (5465442.183322753, sphericalMercator.yAxisProjection (44));

ראוי לציין כי השלכה זו תמפה נקודות לתיבה תוחמת (שמאל, תחתון, ימין, עליון) של (-20037508.34, -23810769.32, 20037508.34, 23810769.32).

2.2. הקרנת מרקטור אליפטית

ההקרנה האמיתית מדגמנת את כדור הארץ כאליפסואיד. השלכה זו נותנתיחסים מדויקיםלאובייקטים בכל מקום על פני כדור הארץ. בְּהֶחלֵט, זה מכבד אובייקטים במפה אבללא מדויק ב 100%. עם זאת, גישה זו אינה הנפוצה ביותר משום שהיא מורכבת מבחינה חישובית.

בואו ליישם גישה זו:

class EllipticalMercator מרחיב את Mercator {@Override כפול yAxisProjection (כניסה כפולה) {קלט = Math.min (Math.max (קלט, -89.5), 89.5); earth earthDimensionalRateNormalized כפול = 1.0 - Math.pow (RADIUS_MINOR / RADIUS_MAJOR, 2); כניסה כפולהOnEarthProj = Math.sqrt (earthDimensionalRateNormalized) * Math.sin (Math.toRadians (קלט)); inputOnEarthProj = Math.pow (((1.0 - inputOnEarthProj) / (1.0 + inputOnEarthProj)), 0.5 * Math.sqrt (earthDimensionalRateNormalized)); inputOnEarthProjNormalized כפול = Math.tan (0.5 * ((Math.PI * 0.5) - Math.toRadians (קלט)) / inputOnEarthProj; החזר (-1) * RADIUS_MAJOR * Math.log (inputOnEarthProjNormalized); } @Override כפול xAxisProjection (קלט כפול) {החזר RADIUS_MAJOR * Math.toRadians (קלט); }}

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

בואו נבדוק המרה פשוטה:

Assert.assertEquals (2449028.7974520186, ellipticalMercator.xAxisProjection (22)); Assert.assertEquals (5435749.887511954, ellipticalMercator.yAxisProjection (44));

הקרנה זו תמפה נקודות לתיבה תוחמת של (-20037508.34, -34619289.37, 20037508.34, 34619289.37).

3. סיכום

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

כמו תמיד, אנו יכולים למצוא את הקוד של מאמר זה ב- GitHub.