两个坐标之间的纬度/纵向差异(以米为单位)?

时间:2017-03-23 12:19:25

标签: ios swift mapkit

我正在尝试创建一个MKCoordinateRegion,其中用户位置位于中心,另一个坐标应该在该区域内可见。简单地说,我正在尝试以可见的一定数量的注释为中心的用户位置。我的方法是查看N:最远的坐标所在的位置,并尝试计算距离或坐标区域到用户位置坐标的坐标。

    var topLeftCoord = CLLocationCoordinate2D(latitude: -90.0, longitude: 180.0)
    var bottomRightCoord = CLLocationCoordinate2D(latitude: 90.0, longitude: -180.0)

    topLeftCoord.longitude = fmin(topLeftCoord.longitude, outerLongitude)
    topLeftCoord.latitude = fmax(topLeftCoord.latitude, outerLatitude)
    bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, outerLongitude)
    bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, outerLatitude)

    topLeftCoord.longitude = fmin(topLeftCoord.longitude, userCoordinates.longitude)
    topLeftCoord.latitude = fmax(topLeftCoord.latitude, userCoordinates.latitude)
    bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, userCoordinates.longitude)
    bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, userCoordinates.latitude)

    let regionSpan = MKCoordinateSpanMake(fabs((topLeftCoord.latitude - bottomRightCoord.latitude)), fabs((bottomRightCoord.longitude - topLeftCoord.longitude)))
    var region = MKCoordinateRegion(center: userCoordinates, span: regionSpan)

    region = self.mapView.regionThatFits(region)
    self.mapView.setRegion(region, animated: true)

这种作品,但我有点讨厌。我认为问题在于,我不会考虑用户位置应位于中心,因此此代码只是确保用户和outerLatitudeouterLongitude的坐标位于跨度。但是当以用户坐标为中心时,外部坐标不再可见。

我不能为我的生活弄清楚这一点。我也尝试过这样做:

    let outerLocation = CLLocation(latitude: outerLatitude, longitude: outerLongitude)
    let userLocation = CLLocation(latitude: userCoordinates.latitude, longitude: userCoordinates.longitude)

    let distance = userLocation.distance(from: outerLocation)
    var region = MKCoordinateRegionMakeWithDistance(userCoordinates, distance, distance)

    region = self.mapView.regionThatFits(region)
    self.mapView.setRegion(region, animated: true)

但我最终得到了同样的结果,我真的不明白。我得到一个大约340米的距离(这是非常合理的)。但是MKCoordinateRegionMakeWithDistance要求latitudinalMeterslongitudinalMeters,我只需将distance从坐标A发送到B.我找不到将组件拆分为{的方法{1}}和latitudinalMeters,我可以在两者之间获得1个距离。

2 个答案:

答案 0 :(得分:0)

  

我找不到将组件拆分为纬度计和纵向计的方法,我可以简单地在两者之间获得1个距离

尝试使用与您的用户位置相同的纬度和与外部位置相同的经度创建一个新点,并使用它来获得“纬度距离”

然后创建一个与用户位置相同的逻辑点和与外部位置相同的纬度,并使用它来获得纵向距离。

注意:如果外部点比用户点更接近赤道,则可能需要通过使用两个新点的外部点的纬度来获得纬度距离。

答案 1 :(得分:0)

还有另一种方式

var region = MKCoordinateRegionMake(userLocation!, MKCoordinateSpanMake(4 * abs(destination.latitude - userLocation!.latitude), 4 * abs(destination.longitude - userLocation!.longitude)))
self.mapView.setRegion(region2, animated: true)

我必须稍微使用乘数才能得到正确的范围 - 但MKCoordinateSpanMake将适用于lat / lon差异,你可以使用它。如果你想让你的用户位置居中,看起来你需要至少加倍计算出的角度差,我们应该做一些事情,找出lat / lon中哪一个更大,并将其用于两者。

这应该让你朝着正确的方向前进。