Coğrafi konum
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(Android.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
.