2017-02-09 4 views
1

Я загружаю и добавляю булавки на карту форм Xamarin.Карта Xamarin Forms - обновление центра и расстояния Несколько штифтов

Используя следующий метод, чтобы получить центр широта/долгота:

public static Position GetCenter(List<Position> geoCoordinates) 
    { 
     if (geoCoordinates.Count == 1) 
     { 
      return geoCoordinates.Single(); 
     } 

     double x = 0; 
     double y = 0; 
     double z = 0; 

     foreach (var geoCoordinate in geoCoordinates) 
     { 
      var latitude = geoCoordinate.Latitude * Math.PI/180; 
      var longitude = geoCoordinate.Longitude * Math.PI/180; 

      x += Math.Cos(latitude) * Math.Cos(longitude); 
      y += Math.Cos(latitude) * Math.Sin(longitude); 
      z += Math.Sin(latitude); 
     } 

     var total = geoCoordinates.Count; 

     x = x/total; 
     y = y/total; 
     z = z/total; 

     var centralLongitude = Math.Atan2(y, x); 
     var centralSquareRoot = Math.Sqrt(x * x + y * y); 
     var centralLatitude = Math.Atan2(z, centralSquareRoot); 

     var dtoReturn = new Position(centralLatitude * 180/Math.PI, centralLongitude * 180/Math.PI); 

     return dtoReturn; 
    } 

Это заставляет меня ЦЕНТР:

 map.MoveToRegion(MapSpan.FromCenterAndRadius(CENTER, Distance.FromMiles(X)); 

Мой вопрос о втором параметре для Radius. Каков наилучший способ рассчитать радиус в милях?

Distance.FromMiles(X) 
+0

У вас есть центр местоположений, поэтому ради радиуса вы не хотите находить точку, расположенную дальше всего от центра, и уходите с расстояния между этой точкой и центром? Насколько велика ваша потенциальная база данных? –

+0

Эй, @ deckertron_9000, это именно то, что я делаю сейчас! Однако, похоже, что он не работает правильно, когда точки находятся в нескольких сотнях миль друг от друга. Не знал, был ли более точный способ. – aherrick

ответ

1

Вы можете создать MapSpan от центра, latitudeDegrees и longitudeDegrees, как показано ниже.

private static MapSpan FromPositions(IEnumerable<Position> positions) 
{ 
    double minLat = double.MaxValue; 
    double minLon = double.MaxValue; 
    double maxLat = double.MinValue; 
    double maxLon = double.MinValue; 

    foreach (var p in positions) 
    { 
     minLat = Math.Min(minLat, p.Latitude); 
     minLon = Math.Min(minLon, p.Longitude); 
     maxLat = Math.Max(maxLat, p.Latitude); 
     maxLon = Math.Max(maxLon, p.Longitude); 
    } 

    return new MapSpan(
     new Position((minLat + maxLat)/2d, (minLon + maxLon)/2d), 
     maxLat - minLat, 
     maxLon - minLon); 
} 
Смежные вопросы