28장의 요약 정보입니다. 위치 및 맵

Download Sample 샘플 다운로드

참고 항목

이 책은 2016년 봄에 출간되었으며, 그 후로 업데이트되지 않았습니다. 이 책의 많은 내용이 지금까지도 무척 유용하나, 일부 내용은 오래되었고 올바르지 않거나 완전하지 않은 주제도 있습니다.

Xamarin.Forms는 View에서 파생되는 Map 요소를 지원합니다. 맵을 사용하려면 특수 플랫폼이 필요하기 때문에 별도의 어셈블리 Xamarin.Forms.Maps에서 구현되며, 다른 네임스페이스 Xamarin.Forms.Maps가 사용됩니다.

지리 좌표계

지리 좌표계는 지구처럼 구형(또는 거의 구형) 개체의 위치를 식별합니다. 좌표는 위도경도로 표현됩니다.

equator라고 하는 대원은 지구의 축이 개념적으로 확장하는 두 극 지방 사이에 있습니다.

위도선 및 위도

지구의 중심에서 적도의 북쪽 또는 남쪽을 측정한 각도를 동일한 위선으로 표시한 것을 위도선이라 합니다. 위도선의 범위는 적도에서는 0도이고 북극 및 남극에서는 90도입니다. 관례에 따라 적도 북쪽의 위도는 양수 값, 적도 남쪽의 위도는 음수 값으로 표시합니다.

경도 및 자오선

북극에서 남극까지 이어지는 대원의 절반은 동일한 경도 선이며 이를 자오선이라고 합니다. 이러한 자오선은 영국 그리니치의 본초 자오선과 비례합니다. 규칙에 따라 프라임 자오선 동쪽의 경도는 0도에서 180도까지의 양수 값이며, 프라임 자오선 서쪽의 경도는 0도에서 -180도까지 음수 값입니다.

등장방형 도법

지구를 표시하는 모든 평면 맵에는 왜곡이 있습니다. 모든 위도 및 경도 선이 직선이고 위도 및 경도 각도의 차이를 맵에서 동일한 거리로 표시하는 기법이 등장방형 도법입니다. 이 맵은 가로로 확장되기 때문에 극 지방과 가까운 영역이 왜곡됩니다.

메르카토르 도법

널리 사용되는 메르카토르 도법은 가로 방향 확장을 보정하기 위해 이러한 영역을 세로 방향으로도 확장합니다. 그 결과로 극 지방 근처의 영역이 실제보다 훨씬 크게 표시되지만, 로컬 영역은 실제 영역과 거의 일치합니다.

맵 서비스 및 타일

맵 서비스에는 Web Mercator라고 하는 변형된 메르카토르 도법이 사용됩니다. 맵 서비스는 위치 및 확대/축소 수준에 따라 클라이언트에 비트맵 타일을 제공합니다.

사용자 위치 가져오기

클래스에는 Xamarin.FormsMap 사용자의 지리적 위치를 가져오는 기능이 포함되지 않지만 맵을 사용할 때는 바람직하므로 종속성 서비스에서 이를 처리해야 합니다.

참고 항목

Xamarin.Forms 애플리케이션에서 이 클래스 대신 Xamarin.Essentials에 포함된 Geolocation 클래스를 사용할 수 있습니다.

위치 추적기 API

Xamarin.FormsBook.Platform 솔루션에는 위치 추적기 API의 코드가 포함되어 있습니다. GeographicLocation 구조체는 위도 및 경도를 캡슐화합니다. ILocationTracker 인터페이스는 위치 추적기를 시작하고 일시 중지하는 두 가지 메서드, 그리고 새 위치를 사용할 수 있을 때의 이벤트를 정의합니다.

iOS 위치 관리자

iOS에서 구현되는 ILocationTracker는 iOS CLLocationManager를 사용하는 LocationTracker 클래스입니다.

Android 위치 관리자

Android에서 구현되는 ILocationTracker는 Android LocationManager 클래스를 사용하는 LocationTracker 클래스입니다.

UWP 지역 로케이터

유니버설 Windows 플랫폼에서 구현되는 ILocationTracker는 UWP Geolocator를 사용하는 LocationTracker 클래스입니다.

휴대폰의 위치 표시

WhereAmI 샘플은 위치 추적기를 사용하여 휴대폰의 위치를 텍스트와 등장방형 맵에 표시합니다.

필요한 오버헤드

WhereAmI에서 위치 추적기를 사용하려면 약간의 오버헤드가 필요합니다. 우선, WhereAmI 솔루션의 모든 프로젝트에는 Xamarin.FormsBook.Platform의 해당 프로젝트에 대한 참조가 있어야 하고, 각 WhereAmI 프로젝트는 Toolkit.Init 메서드를 호출해야 합니다.

위치 권한 형식으로 약간의 플랫폼별 추가 오버헤드가 필요합니다.

iOS의 위치 권한

iOS의 경우 info.plist 파일에는 사용자의 위치를 가져올 수 있도록 허용해 달라고 사용자에게 요청하는 질문 텍스트가 포함된 항목이 들어 있어야 합니다.

Android의 위치 권한

사용자 위치를 가져오는 Android 애플리케이션의 AndroidManifest.xml 파일에는 ACCESS_FILE_LOCATION 권한이 있어야 합니다.

UWP의 위치 권한

유니버설 Windows 플랫폼 애플리케이션은 Package.appxmanifest 파일에 표시된 location 디바이스 기능이 필요합니다.

Xamarin.Forms.Maps 사용

Map 클래스를 사용하려면 몇 가지 요구 사항을 충족해야 합니다.

NuGet 패키지

Xamarin.Forms.Maps NuGet 라이브러리를 애플리케이션 솔루션에 추가해야 합니다. 버전 번호는 현재 설치된 Xamarin.Forms 패키지와 동일해야 합니다.

Maps 패키지 초기화

애플리케이션 프로젝트는 Xamarin.Forms.Forms.Init를 호출한 후 Xamarin.FormsMaps.Init 메서드를 호출해야 합니다.

맵 서비스 사용

Map이 사용자의 위치를 가져올 수 있으므로, 애플리케이션은 이 챕터의 앞부분에서 설명한 방식으로 사용자에 대한 권한을 획득해야 합니다.

iOS 맵 사용

Map을 사용하는 iOS 애플리케이션의 info.plist 파일에 두 줄이 필요합니다.

Android 맵 사용

Google Map 서비스를 사용하려면 권한 부여 키가 필요합니다. 이 키는 AndroidManifest.xml 파일에 삽입됩니다. 또한 AndroidManifest.xml 파일은 사용자의 위치를 가져올 때 manifest 태그가 필요합니다.

UWP 맵 사용

유니버설 Windows 플랫폼 애플리케이션에서 Bing Maps를 사용하려면 권한 부여 키가 필요합니다. 이 키는 Xamarin.FormsMaps.Init 메서드에 인수로 전달됩니다. 또한 애플리케이션에서 위치 서비스를 사용하도록 설정해야 합니다.

아무 것도 없는 맵

MapDemos 샘플은 다양한 데모 프로그램으로 이동할 수 있는 MapsDemoHomePage.xaml 파일 및 MapsDemoHomePage.xaml.cs 코드 숨김 파일로 구성되어 있습니다.

BasicMapPage.xaml 파일은 Map 보기를 표시하는 방법을 보여줍니다. 이 파일은 기본적으로 로마를 표시하지만, 사용자가 맵을 조작할 수 있습니다.

가로 및 세로 스크롤을 사용하지 않도록 설정하려면 HasScrollEnabled 속성을 false로 설정합니다. 확대/축소를 사용하지 않도록 설정하려면 HasZoomEnabled 속성을 false로 설정합니다. 이러한 속성은 일부 플랫폼에서 작동하지 않을 수 있습니다.

거리 및 지형

MapType 형식의 Map 속성 MapType을 설정하여 다양한 형식의 맵을 표시할 수 있으며, 이 속성은 다음 세 가지 멤버가 있는 열거형입니다.

MapTypesPage.xaml 파일은 라디오 단추를 사용하여 맵 형식을 선택하는 방법을 보여줍니다. 이 파일은 Xamarin.FormsBook.Toolkit 라이브러리의 RadioButtonManager 클래스와 MapTypeRadioButton.xaml 파일 기반의 클래스를 사용합니다.

맵 좌표

프로그램은 Map에서 VisibleRegion 속성을 통해 표시하는 현재 영역을 가져올 수 있습니다. 이 속성은 바인딩 가능한 속성에서 지원되지 않으며, 변경되었을 때 그 사실을 알리는 알림 메커니즘이 없기 때문에 속성을 모니터링하려는 프로그램은 알림 목적으로 타이머를 사용해야 합니다.

VisibleRegionMapSpan 형식이며, 다음 네 가지 읽기 전용 속성이 있는 클래스입니다.

PositionDistance 모두 구조체입니다. PositionPosition 생성자를 통해 설정되는 다음 두 가지 읽기 전용 속성을 정의합니다.

Distance는 미터법과 영국식 단위 사이에서 변환하여 단위 독립적 거리를 제공하는 데 사용됩니다. Distance 값은 다음과 같은 여러 가지 방법으로 만들 수 있습니다.

값은 다음 세 가지 속성에서 얻을 수 있습니다.

MapCoordinatesPage 파일에는 MapSpan 정보를 표시하는 데 사용되는 여러 Label 요소가 포함되어 있습니다. MapCoordinatesPage.xaml.cs 코드 숨김 파일은 사용자가 맵을 조작할 때 타이머를 사용하여 정보를 최신 상태로 유지합니다.

위치 확장

이 책의 새 라이브러리인 Xamarin.FormsBook.Toolkit.Maps에는 맵과 관련되지만 플랫폼과는 독립적인 형식이 포함되어 있습니다. PositionExtensions 클래스에는 Position에 대한 ToString 메서드와 두 Position 값 사이의 거리를 계산하는 메서드가 포함되어 있습니다.

초기 위치 설정

MapMoveToRegion 메서드를 호출하여 맵의 위치 및 확대/축소 수준을 프로그래밍 방식으로 설정할 수 있습니다. 이 인수는 MapSpan 형식입니다. 다음 중 하나를 사용하여 MapSpan 개체를 만들 수 있습니다.

ClampLatitude 또는 WithZoom 메서드를 사용하여 기존 항목에서 새 MapSpan을 만들 수도 있습니다.

WyomingPage.xaml 파일 및 WyomingPage.xaml.cs 코드 숨김 파일은 MoveToRegion 메서드를 사용하여 와이오밍 상태를 표시하는 방법을 보여줍니다.

또는 Map 생성자MapSpan 개체를 사용하여 맵의 위치를 초기화할 수도 있습니다. XamarinHQPage.xaml 파일은 이 작업을 전적으로 XAML로 수행하여 샌프란시스코에 Xamarin 본사를 표시하는 방법을 보여줍니다.

동적 확대/축소

Slider를 사용하여 맵을 동적으로 확대/축소할 수 있습니다. RadiusZoomPage.xaml 파일 및 RadiusZoomPage.xaml.cs 코드 숨김 파일은 Slider 값에 따라 맵의 반경을 변경하는 방법을 보여줍니다.

LongitudeZoomPage.xaml 파일 및 LongitudeZoomPage.xaml.cs 코드 숨김 파일은 Android에서 더 잘 작동하는 대안을 보여주지만, 두 방법 모두 Windows 플랫폼에서 제대로 작동하지 않습니다.

휴대폰의 위치

MapIsShowingUser 속성은 다음과 같이 ShowLocationPage.xaml 파일이 보여주는 것처럼 각 플랫폼에서 약간 다르게 작동합니다.

  • iOS에서 파란색 점은 휴대폰의 위치를 나타내지만 수동으로 이동해야 합니다.
  • Android에서는 푸시하면 맵을 휴대폰 위치로 이동하는 아이콘이 표시됩니다.
  • UWP는 iOS와 유사하지만 종종 자동으로 휴대폰 위치로 이동합니다.

MapDemos 프로젝트는 먼저 MyLocationButton.xaml 파일 및 MyLocationButton.xaml.cs 코드 숨김 파일을 기반으로 아이콘 기반 단추를 정의하여 Android 방식을 모방하려고 시도합니다.

GoToLocationPage.xaml 파일 및 GoToLocationPage.xaml.cs 코드 숨김 파일은 이 단추를 사용하여 휴대폰의 위치로 이동합니다.

핀 및 과학 박물관

마지막으로 Map 클래스는 IList<Pin> 형식의 Pins 속성을 정의합니다. Pin 클래스는 다음 네 가지 속성을 정의합니다.

  • string 형식의 Label. 필수 속성입니다.
  • string 형식의 Address. 사람이 읽을 수 있는 주소이며 선택 사항입니다.
  • Position 형식의 Position. 맵에서 핀이 표시되는 위치를 나타냅니다.
  • PinType 형식의 Type. 사용되지 않는 열거형입니다.

MapDemos 프로젝트에는 미국의 과학 박물관을 나열하는 ScienceMuseums.xml 파일과 이 데이터를 역직렬화하기 위한 LocationsSite 클래스가 포함되어 있습니다.

ScienceMuseumsPage.xaml 파일 및 ScienceMuseumsPage.xaml.cs 코드 숨김 파일은 이러한 과학 박물관을 나타내는 핀을 맵에 표시합니다. 사용자가 핀을 탭하면 해당 박물관의 주소와 웹 사이트가 표시됩니다.

두 지점 사이의 거리

PositionExtensions 클래스에는 두 지리적 위치 간의 거리를 단순화하는 DistanceTo 메서드가 포함되어 있습니다.

LocalMuseumsPage.xaml 파일 및 LocalMuseumsPage.xaml.cs 코드 숨김 파일에도 사용되어 사용자의 위치에서 박물관까지의 거리를 표시합니다.

Triple screenshot of Local Museums Page

이 프로그램은 맵의 위치를 기반으로 핀의 수를 동적으로 제한하는 방법도 보여줍니다.

지오코딩 및 돌아가기

Xamarin.Forms.지도 어셈블리에는 텍스트 주소를 0개 이상의 가능한 지리적 위치로 GetPositionsForAddressAsync 변환하는 메서드와 다른 방향으로 변환하는 다른 메서드 GetAddressesForPositionAsync 가 포함된 클래스도 포함되어 Geocoder 있습니다.

GeocoderRoundTrip.xaml 파일 및 GeocoderRoundTrip.xaml.cs 코드 숨김 파일은 이 기능을 보여줍니다.