【问题标题】:MKCoordinateSpan in Meters?MKCoordinateSpan 以米为单位?
【发布时间】:2011-11-14 22:58:21
【问题描述】:

我需要创建一个大约 500 米的 MKCoordinateSpan

如何计算要传递给 MKCoordinateSpan 构造函数的值?

任何编程(Obj-C、.Net)语言的答案都可以。

【问题讨论】:

    标签: iphone ios geolocation xamarin.ios mkcoordinatespan


    【解决方案1】:

    另一种选择是使用 MapKit 的 MKCoordinateRegionMakeWithDistance 函数:

    MKCoordinateRegion rgn = MKCoordinateRegionMakeWithDistance(
        CLLocationCoordinate2DMake(someLatitude, someLongitude), 500, 500);
    

    MKCoordinateSpan 将位于rgn.span

    【讨论】:

      【解决方案2】:

      除非您需要很高的准确性,否则您可以使用近似值使其更容易。第一个问题是找到代表 500 米的纬度的分数。容易,因为纬度在任何位置都是常数,大约 111 公里。所以 500 米是 0.0045 度纬度。

      然后它会变得更难,因为经度的长度取决于您所在的位置。可以近似为

      其中 alpha 是地球的赤道半径,6,378,137 公里,b/a 是 0.99664719(所有 GPS 设备都使用的 WGC84 椭球模型的常数)和,其中 phi 是纬度。

      想象一下,您有幸身处南纬 37.783 度的墨尔本。在这里,南北无关紧要。 beta 的计算结果为 37.6899,其余部分求解得到长度为 88 公里的纵向度数。所以 500 米是 0.0057 度。

      墨尔本的结果 - MKCoordinateSpan melbourne500MeterSpan = MKCoordinateSpanMake(.0045, .0057);

      你可以检查你的答案和你的代码with this online calculator

      经度上的wiki article 对此有更多详细信息(以及此处图片的来源)

      代码:

      #define EARTH_EQUATORIAL_RADIUS (6378137.0)
      #define WGS84_CONSTANT (0.99664719)
      
      #define degreesToRadians(x) (M_PI * (x) / 180.0)
      
      // accepts decimal degrees. Convert from HMS first if that's what you have
      double spanOfMetersAtDegreeLongitude(double degrees, double meters) {
      
          double tanDegrees = tanf(degreesToRadians(degrees));
          double beta =  tanDegrees * WGS84_CONSTANT;
          double lengthOfDegree = cos(atan(beta)) * EARTH_EQUATORIAL_RADIUS * M_PI / 180.0;
          double measuresInDegreeLength = lengthOfDegree / meters;
          return 1.0 / measuresInDegreeLength;
      }
      

      【讨论】:

      • 请不要使用这个答案。获得积分虽然令人欣慰,但 MKCoordinateRegionMakeWithDistance 是正确的方法。
      【解决方案3】:

      在 MonoTouch 中,使用这个解决方案你可以使用这个辅助方法:

          public static void ZoomToCoordinateAndCenter (MKMapView mapView, CLLocationCoordinate2D coordinate, double meters, bool showUserLocationToo, bool animate)
          {
              if (!coordinate.IsValid ())
                  return;
      
              mapView.SetCenterCoordinate (coordinate, animate);
              mapView.SetRegion (MKCoordinateRegion.FromDistance (coordinate, meters, meters), animate);      
          }
      

      【讨论】:

        猜你喜欢
        • 2015-08-12
        • 2020-12-08
        • 1970-01-01
        • 2016-05-31
        • 2012-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多