Xamarin.Essentials:位置情報Xamarin.Essentials: Geolocation

Geolocation クラスには、デバイスの現在の位置座標を取得する API が用意されています。The Geolocation class provides APIs to retrieve the device's current geolocation coordinates.

作業開始Get started

この API の使用を始めるには、Xamarin.Essentials の概要ガイドを読み、ライブラリが正しくインストールされてプロジェクトに設定されていることを確認してください。To start using this API, read the getting started guide for Xamarin.Essentials to ensure the library is properly installed and set up in your projects.

Geolocation の機能にアクセスするには、次のプラットフォーム固有の設定が必要です。To access the Geolocation functionality, the following platform-specific setup is required:

Coarse および Fine Location アクセス許可が必要であり、Android プロジェクトで構成する必要があります。Coarse and Fine Location permissions are required and must be configured in the Android project. さらに、アプリの対象が Android 5.0 (API レベル 21) 以降である場合は、アプリがマニフェスト ファイルのハードウェア機能を使用することを宣言する必要があります。Additionally, if your app targets Android 5.0 (API level 21) or higher, you must declare that your app uses the hardware features in the manifest file. これは次の方法で追加できます。This can be added in the following ways:

[プロパティ] フォルダーにある AssemblyInfo.cs ファイルを開き、以下を追加します。Open the AssemblyInfo.cs file under the Properties folder and add:

[assembly: UsesPermission(Android.Manifest.Permission.AccessCoarseLocation)]
[assembly: UsesPermission(Android.Manifest.Permission.AccessFineLocation)]
[assembly: UsesFeature("android.hardware.location", Required = false)]
[assembly: UsesFeature("android.hardware.location.gps", Required = false)]
[assembly: UsesFeature("android.hardware.location.network", Required = false)]

または、Android マニフェストを更新します。Or update the Android manifest:

[プロパティ] フォルダーにある AndroidManifest.xml ファイルを開き、manifest ノードの内部に以下を追加します。Open the AndroidManifest.xml file under the Properties folder and add the following inside of the manifest node:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
<uses-feature android:name="android.hardware.location.network" android:required="false" />

または、Android プロジェクトを右クリックし、プロジェクトのプロパティを開きます。Or right-click on the Android project and open the project's properties. [Android マニフェスト] の下で [必要なアクセス許可:] 領域を探し、[ACCESS_COARSE_LOCATION] および [ACCESS_FINE_LOCATION] アクセス許可をオンにします。Under Android Manifest find the Required permissions: area and check the ACCESS_COARSE_LOCATION and ACCESS_FINE_LOCATION permissions. これにより、AndroidManifest.xml ファイルが自動的に更新されます。This will automatically update the AndroidManifest.xml file.

Geolocation の使用Using Geolocation

自分のクラスの Xamarin.Essentials に参照を追加します。Add a reference to Xamarin.Essentials in your class:

using Xamarin.Essentials;

Geolocation API では、必要に応じてユーザーにアクセス許可も求められます。The Geolocation API will also prompt the user for permissions when necessary.

GetLastKnownLocationAsync メソッドを呼び出すことにより、デバイスの最後の既知の場所を取得できます。You can get the last known location of the device by calling the GetLastKnownLocationAsync method. 多くの場合、この方が完全なクエリを行うより速くわかりますが、精度が低下することがあります。This is often faster then doing a full query, but can be less accurate.

try
{
    var location = await Geolocation.GetLastKnownLocationAsync();

    if (location != null)
    {
        Console.WriteLine($"Latitude: {location.Latitude}, Longitude: {location.Longitude}, Altitude: {location.Altitude}");
    }
}
catch (FeatureNotSupportedException fnsEx)
{
    // Handle not supported on device exception
}
catch (FeatureNotEnabledException fneEx)
{
    // Handle not enabled on device exception
}
catch (PermissionException pEx)
{
    // Handle permission exception
}
catch (Exception ex)
{
    // Unable to get location
}

高度は常に使用できるとは限りません。The altitude isn't always available. 使用できない場合、Altitude プロパティは null または 0 になることがあります。If it is not available, the Altitude property might be null or the value might be zero. 高度を使用できる場合、値は海抜メートル単位です。If the altitude is available, the value is in meters above sea level.

現在のデバイスの場所の座標を照会するには、GetLocationAsync を使用できます。To query the current device's location coordinates, the GetLocationAsync can be used. デバイスの場所を取得するには時間がかかる場合があるので、完全な GeolocationRequestCancellationToken を渡すのが最善です。It is best to pass in a full GeolocationRequest and CancellationToken since it may take some time to get the device's location.

try
{
    var request = new GeolocationRequest(GeolocationAccuracy.Medium);
    var location = await Geolocation.GetLocationAsync(request);

    if (location != null)
    {
        Console.WriteLine($"Latitude: {location.Latitude}, Longitude: {location.Longitude}, Altitude: {location.Altitude}");
    }
}
catch (FeatureNotSupportedException fnsEx)
{
    // Handle not supported on device exception
}
catch (FeatureNotEnabledException fneEx)
{
    // Handle not enabled on device exception
}
catch (PermissionException pEx)
{
    // Handle permission exception
}
catch (Exception ex)
{
    // Unable to get location
}

Geolocation の精度Geolocation Accuracy

次の表では、プラットフォームごとの精度を示します。The following table outlines accuracy per platform:

最低Lowest

プラットフォームPlatform 距離 (メートル単位)Distance (in meters)
AndroidAndroid 500500
iOSiOS 30003000
UWPUWP 1000 ~ 50001000 - 5000

LowLow

プラットフォームPlatform 距離 (メートル単位)Distance (in meters)
AndroidAndroid 500500
iOSiOS 10001000
UWPUWP 300 ~ 3000300 - 3000

中 (既定値)Medium (Default)

プラットフォームPlatform 距離 (メートル単位)Distance (in meters)
AndroidAndroid 100 ~ 500100 - 500
iOSiOS 100100
UWPUWP 30 ~ 50030-500

HighHigh

プラットフォームPlatform 距離 (メートル単位)Distance (in meters)
AndroidAndroid 0 ~ 1000 - 100
iOSiOS 1010
UWPUWP 10 以下<= 10

最高Best

プラットフォームPlatform 距離 (メートル単位)Distance (in meters)
AndroidAndroid 0 ~ 1000 - 100
iOSiOS ~0~0
UWPUWP 10 以下<= 10

擬似ロケーションの検出Detecting Mock Locations

一部のデバイスは、プロバイダーからの擬似ロケーションを返します。擬似ロケーションを提供するアプリケーションによって擬似ロケーションを返すこともあります。Some devices may return a mock location from the provider or by an application that provides mock locations. LocationIsFromMockProvider を使用することでこれを検出できます。You can detect this by using the IsFromMockProvider on any Location.

var request = new GeolocationRequest(GeolocationAccuracy.Medium);
var location = await Geolocation.GetLocationAsync(request);

if (location != null)
{
    if(location.IsFromMockProvider)
    {
        // location is from a mock provider
    }
}

2 つの場所の間の距離Distance between Two Locations

Location クラスおよび LocationExtensions クラスでは、2 つの地理的な場所の間の距離を計算できる CalculateDistance メソッドが定義されています。The Location and LocationExtensions classes define CalculateDistance methods that allow you to calculate the distance between two geographic locations. この計算では道路またはその他の経路は考慮されず、あくまでも地球の表面に沿った 2 点間の最短距離なので、"大圏距離" または "直線距離" とも呼ばれます。This calculated distance does not take roads or other pathways into account, and is merely the shortest distance between the two points along the surface of the Earth, also known as the great-circle distance or colloquially, the distance "as the crow flies."

次に例を示します。Here's an example:

Location boston = new Location(42.358056, -71.063611);
Location sanFrancisco = new Location(37.783333, -122.416667);
double miles = Location.CalculateDistance(boston, sanFrancisco, DistanceUnits.Miles);

Location コンストラクターは、緯度引数と経度引数をこの順序で受け取ります。The Location constructor has latitude and longitude arguments in that order. 正の緯度値は北半球を示し、正の緯度値は東半球を示します。Positive latitude values are north of the equator, and positive longitude values are east of the Prime Meridian. マイルまたはキロメートルを指定するには、CalculateDistance に対する最後の引数を使用します。Use the final argument to CalculateDistance to specify miles or kilometers. UnitConverters クラスでは、2 つの単位の間で変換を行う KilometersToMiles および MilesToKilometers メソッドも定義されています。The UnitConverters class also defines KilometersToMiles and MilesToKilometers methods for converting between the two units.

APIAPI