Aracılığıyla paylaş


Coğrafi konum

Browse sample. Örneğe göz atın

Bu makalede .NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI) IGeolocation arabirimini nasıl kullanabileceğiniz açıklanmaktadır. Bu arabirim, cihazın geçerli coğrafi konum koordinatlarını almak için API'ler sağlar.

Arabirimin IGeolocation varsayılan uygulaması özelliği aracılığıyla Geolocation.Default kullanılabilir. IGeolocation Hem arabirim hem Geolocation de sınıf ad alanında Microsoft.Maui.Devices.Sensors yer alır.

Kullanmaya başlayın

Coğrafi Konum işlevine erişmek için aşağıdaki platforma özgü kurulum gereklidir:

Kaba veya ince konum izinleri veya her ikisi de Belirtilmeli ve Android projesinde yapılandırılmalıdır.

Ayrıca, uygulamanız Android 5.0 (API düzeyi 21) veya üzerini hedeflediyse, uygulamanızın bildirim dosyasındaki donanım özelliklerini kullandığını bildirmeniz gerekir. Bu, aşağıdaki yollarla eklenebilir:

  • Derleme tabanlı izni ekleyin:

    Platforms/Android/MainApplication.cs dosyasını açın ve yönergelerin ardından using aşağıdaki derleme özniteliklerini ekleyin:

    [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)]
    

    Uygulamanız Android 10 - Q (API Düzeyi 29 veya üzeri) hedefleiyorsa ve isteğindeyse LocationAlways, bu izin isteğini de eklemeniz gerekir:

    [assembly: UsesPermission(Manifest.Permission.AccessBackgroundLocation)]
    

    - veya -

  • Android Bildirimini güncelleştirin:

    Platformlar/Android/AndroidManifest.xml dosyasını açın ve düğüme manifest aşağıdakileri ekleyin:

    <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" />
    

    Uygulamanız Android 10 - Q (API Düzeyi 29 veya üzeri) hedefleiyorsa ve isteğindeyse LocationAlways, bu izin isteğini de eklemeniz gerekir:

    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    

    - veya -

  • Bildirim düzenleyicisinde Android Bildirimi'ni güncelleştirin:

    Visual Studio'da Platformlar/Android/AndroidManifest.xml dosyasına çift tıklayarak Android bildirim düzenleyicisini açın. Ardından, Gerekli izinler'in altında yukarıda listelenen izinleri denetleyin. Bu, AndroidManifest.xml dosyasını otomatik olarak güncelleştirir.

İpucu

Dikkate alınması gereken birçok kısıtlama olduğundan arka plan konumu güncelleştirmeleriyle ilgili Android belgelerini okuduğunuzdan emin olun.

Bilinen son konumu alma

Cihaz, cihazın en son konumunu önbelleğe almış olabilir. GetLastKnownLocationAsync() Varsa, önbelleğe alınmış konuma erişmek için yöntemini kullanın. Bu genellikle tam konum sorgusu yapmaktan daha hızlıdır, ancak daha az doğru olabilir. Önbelleğe alınmış bir konum yoksa, bu yöntem döndürür null.

Not

Gerektiğinde Coğrafi Konum API'si kullanıcıdan izin ister.

Aşağıdaki kod örneği, önbelleğe alınmış konumu denetlemeyi gösterir:

public async Task<string> GetCachedLocation()
{
    try
    {
        Location location = await Geolocation.Default.GetLastKnownLocationAsync();

        if (location != null)
            return $"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
    }

    return "None";
}

Cihaza bağlı olarak tüm konum değerleri kullanılamayabilir. Örneğin, Altitude özelliği 0 değerine veya deniz seviyesinin üzerindeki ölçümleri gösteren pozitif bir değere sahip olabilir null. Mevcut olmayabilecek diğer değerler ve Course özelliklerini içerirSpeed.

Geçerli konumu alma

Cihazın bilinen son konumunu denetlemek daha hızlı olabilir ancak yanlış olabilir. GetLocationAsync Geçerli konumun cihazını sorgulamak için yöntemini kullanın. Sorgunun doğruluğunu ve zaman aşımını yapılandırabilirsiniz. Cihazın konumunu almak biraz zaman alabileceğinden ve CancellationToken parametrelerini kullanan GeolocationRequest yöntemin aşırı yüklenmesi en iyisidir.

Not

Gerektiğinde Coğrafi Konum API'si kullanıcıdan izin ister.

Aşağıdaki kod örneği, iptali desteklerken cihazın konumunun nasıl isteneceklerini gösterir:

private CancellationTokenSource _cancelTokenSource;
private bool _isCheckingLocation;

public async Task GetCurrentLocation()
{
    try
    {
        _isCheckingLocation = true;

        GeolocationRequest request = new GeolocationRequest(GeolocationAccuracy.Medium, TimeSpan.FromSeconds(10));

        _cancelTokenSource = new CancellationTokenSource();

        Location location = await Geolocation.Default.GetLocationAsync(request, _cancelTokenSource.Token);

        if (location != null)
            Console.WriteLine($"Latitude: {location.Latitude}, Longitude: {location.Longitude}, Altitude: {location.Altitude}");
    }
    // Catch one of the following exceptions:
    //   FeatureNotSupportedException
    //   FeatureNotEnabledException
    //   PermissionException
    catch (Exception ex)
    {
        // Unable to get location
    }
    finally
    {
        _isCheckingLocation = false;
    }
}

public void CancelRequest()
{
    if (_isCheckingLocation && _cancelTokenSource != null && _cancelTokenSource.IsCancellationRequested == false)
        _cancelTokenSource.Cancel();
}

Cihaza bağlı olarak tüm konum değerleri kullanılamayabilir. Örneğin, Altitude özelliği 0 değerine veya deniz seviyesinin üzerindeki ölçümleri gösteren pozitif bir değere sahip olabilir null. Mevcut olmayabilecek diğer değerler ve Coursedeğerlerini içerirSpeed.

Uyarı

GetLocationAsync bazı senaryolarda döndürebilir null . Bu, temel alınan platformun geçerli konumu alamadığını gösterir.

Konum değişikliklerini dinleme

Cihazı geçerli konum için sorgulamaya ek olarak, bir uygulama ön plandayken konum değişikliklerini de dinleyebilirsiniz.

Uygulamanın şu anda konum değişikliklerini dinleyip dinlemediğini denetlemek için sorgulayabileceğiniz bir IsListeningForeground özellik vardır. Konum değişikliklerini dinlemeye hazır olduğunuzda yöntemini çağırmanız StartListeningForegroundAsync gerekir. Bu yöntem, konum güncelleştirmelerini dinlemeye başlar ve uygulamanın ön planda olması koşuluyla konum değiştiğinde olayı tetikler LocationChanged . GeolocationLocationChangedEventArgs Bu olaya eşlik eden nesne, algılanan yeni konumu temsil eden türünde Locationbir Location özelliğe sahiptir.

Not

Gerektiğinde Coğrafi Konum API'si kullanıcıdan izin ister.

Aşağıdaki kod örneği, konum değişikliğini dinlemeyi ve değiştirilen konumu işlemeyi gösterir:

async void OnStartListening()
{
    try
    {
        Geolocation.LocationChanged += Geolocation_LocationChanged;
        var request = new GeolocationListeningRequest((GeolocationAccuracy)Accuracy);
        var success = await Geolocation.StartListeningForegroundAsync(request);

        string status = success
            ? "Started listening for foreground location updates"
            : "Couldn't start listening";
    }
    catch (Exception ex)
    {
        // Unable to start listening for location changes
    }
}

void Geolocation_LocationChanged(object sender, GeolocationLocationChangedEventArgs e)
{
    // Process e.Location to get the new location
}

Hata işleme, olay için ListeningFailed bir olay işleyicisi kaydedilerek uygulanabilir. Bu GeolocationListeningFailedEventArgs olaya eşlik eden nesnenin, dinlemenin neden başarısız olduğunu gösteren türünde GeolocationErrorbir Error özelliği vardır. ListeningFailed Olay oluşturulduğunda, daha fazla konum değişikliğini dinlemek durur ve başka LocationChanged olay tetiklenmez.

Konum değişikliklerini dinlemeyi durdurmak için yöntemini çağırın StopListeningForeground :

void OnStopListening()
{
    try
    {
        Geolocation.LocationChanged -= Geolocation_LocationChanged;
        Geolocation.StopListeningForeground();
        string status = "Stopped listening for foreground location updates";
    }
    catch (Exception ex)
    {
        // Unable to stop listening for location changes
    }
}

Not

StopListeningForeground Uygulama konum değişikliklerini dinlemediğinde yönteminin hiçbir etkisi olmaz.

Doğruluk

Aşağıdaki bölümlerde platform başına konum doğruluğu uzaklığı özetlenmiştir:

Önemli

iOS'un doğrulukla ilgili bazı sınırlamaları vardır. Daha fazla bilgi için Platform farklılıkları bölümüne bakın.

En Düşük

Platform Mesafe (metre olarak)
Android 500
iOS 3000
Windows 1000 - 5000

Düşük

Platform Mesafe (metre olarak)
Android 500
iOS 1000
Windows 300 - 3000

Orta (Varsayılan)

Platform Mesafe (metre olarak)
Android 100 - 500
iOS 100
Windows 30-500

Yüksek

Platform Mesafe (metre olarak)
Android 0 - 100
iOS 10
Windows <= 10

En iyi

Platform Mesafe (metre olarak)
Android 0 - 100
iOS ~0
Windows <= 10

Sahte konumları algılama

Bazı cihazlar sağlayıcıdan veya sahte konumlar sağlayan bir uygulama tarafından sahte konum döndürebilir. Bunu herhangi bir Locationüzerinde kullanarak IsFromMockProvider algılayabilirsiniz:

public async Task CheckMock()
{
    GeolocationRequest request = new GeolocationRequest(GeolocationAccuracy.Medium);
    Location location = await Geolocation.Default.GetLocationAsync(request);

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

İki konum arasındaki uzaklık

yöntemi, CalculateDistance iki coğrafi konum arasındaki uzaklığı hesaplar. Bu hesaplanan mesafe yolları veya diğer yolları dikkate almaz ve dünya yüzeyindeki iki nokta arasındaki en kısa mesafedir. Bu hesaplama, büyük daire uzaklık hesaplaması olarak bilinir.

Aşağıdaki kod, Amerika'nın Boston ve San Francisco şehirlerinin Birleşik Devletler arasındaki mesafeyi hesaplar:

Location boston = new Location(42.358056, -71.063611);
Location sanFrancisco = new Location(37.783333, -122.416667);

double miles = Location.CalculateDistance(boston, sanFrancisco, DistanceUnits.Miles);

Oluşturucu Location(Double, Double, Double) sırasıyla enlem ve boylam bağımsız değişkenlerini kabul eder. Pozitif enlem değerleri ekvatorun kuzeyinde, pozitif boylam değerleri ise Prime Meridian'ın doğusundadır. Mil veya kilometre belirtmek için CalculateDistance son bağımsız değişkeni kullanın. UnitConverters sınıfı ayrıca ve MilesToKilometers iki birim arasında dönüştürme yöntemlerini tanımlarKilometersToMiles.

Platform farklılıkları

Bu bölümde, coğrafi konum API'siyle platforma özgü farklılıklar açıklanmaktadır.

Yükseklik her platformda farklı şekilde hesaplanır.

Android'de, varsa rakım WGS 84 referans elipsoidinin metreler içinde döndürülür. Bu konumun yüksekliği yoksa, 0.0 döndürülür.

Location.ReducedAccuracy özelliği yalnızca iOS tarafından kullanılır ve diğer tüm platformlarda döndürürfalse.