28장의 요약 정보입니다. 위치 및 맵
참고 항목
이 책은 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
속성을 통해 표시하는 현재 영역을 가져올 수 있습니다. 이 속성은 바인딩 가능한 속성에서 지원되지 않으며, 변경되었을 때 그 사실을 알리는 알림 메커니즘이 없기 때문에 속성을 모니터링하려는 프로그램은 알림 목적으로 타이머를 사용해야 합니다.
VisibleRegion
은 MapSpan
형식이며, 다음 네 가지 읽기 전용 속성이 있는 클래스입니다.
Center
(Position
형식)- 표시된 맵 영역의 높이를 나타내는
double
형식의LatitudeDegrees
- 표시된 맵 영역의 너비를 나타내는
double
형식의LongitudeDegrees
- 맵에 표시되는 가장 큰 원형 영역을 나타내는
Distance
형식의Radius
Position
및 Distance
모두 구조체입니다. Position
은 Position
생성자를 통해 설정되는 다음 두 가지 읽기 전용 속성을 정의합니다.
Distance
는 미터법과 영국식 단위 사이에서 변환하여 단위 독립적 거리를 제공하는 데 사용됩니다. Distance
값은 다음과 같은 여러 가지 방법으로 만들 수 있습니다.
- 미터법 거리를 사용하는
Distance
생성자 Distance.FromMeters
정적 메서드Distance.FromKilometers
정적 메서드Distance.FromMiles
정적 메서드
값은 다음 세 가지 속성에서 얻을 수 있습니다.
Meters
(double
형식)Kilometers
(double
형식)Miles
(double
형식)
MapCoordinatesPage 파일에는 MapSpan
정보를 표시하는 데 사용되는 여러 Label
요소가 포함되어 있습니다. MapCoordinatesPage.xaml.cs 코드 숨김 파일은 사용자가 맵을 조작할 때 타이머를 사용하여 정보를 최신 상태로 유지합니다.
위치 확장
이 책의 새 라이브러리인 Xamarin.FormsBook.Toolkit.Maps에는 맵과 관련되지만 플랫폼과는 독립적인 형식이 포함되어 있습니다. PositionExtensions
클래스에는 Position
에 대한 ToString
메서드와 두 Position
값 사이의 거리를 계산하는 메서드가 포함되어 있습니다.
초기 위치 설정
Map
의 MoveToRegion
메서드를 호출하여 맵의 위치 및 확대/축소 수준을 프로그래밍 방식으로 설정할 수 있습니다. 이 인수는 MapSpan
형식입니다. 다음 중 하나를 사용하여 MapSpan
개체를 만들 수 있습니다.
Position
, 위도 및 경도 범위를 사용하는MapSpan
생성자Position
및 반지름을 사용하는MapSpan.FromCenterAndRadius
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 플랫폼에서 제대로 작동하지 않습니다.
휴대폰의 위치
Map
의 IsShowingUser
속성은 다음과 같이 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 파일과 이 데이터를 역직렬화하기 위한 Locations
및 Site
클래스가 포함되어 있습니다.
ScienceMuseumsPage.xaml 파일 및 ScienceMuseumsPage.xaml.cs 코드 숨김 파일은 이러한 과학 박물관을 나타내는 핀을 맵에 표시합니다. 사용자가 핀을 탭하면 해당 박물관의 주소와 웹 사이트가 표시됩니다.
두 지점 사이의 거리
PositionExtensions
클래스에는 두 지리적 위치 간의 거리를 단순화하는 DistanceTo
메서드가 포함되어 있습니다.
LocalMuseumsPage.xaml 파일 및 LocalMuseumsPage.xaml.cs 코드 숨김 파일에도 사용되어 사용자의 위치에서 박물관까지의 거리를 표시합니다.
이 프로그램은 맵의 위치를 기반으로 핀의 수를 동적으로 제한하는 방법도 보여줍니다.
지오코딩 및 돌아가기
입니다Xamarin.Forms. Maps 어셈블리에는 텍스트 주소를 0개 이상의 가능한 지리적 위치로 변환하는 메서드와 다른 방향으로 변환하는 다른 메서드 GetAddressesForPositionAsync
가 포함된 클래스 GetPositionsForAddressAsync
도 포함되어 Geocoder
있습니다.
GeocoderRoundTrip.xaml 파일 및 GeocoderRoundTrip.xaml.cs 코드 숨김 파일은 이 기능을 보여줍니다.