MKCoordinateRegionMakeWithDistance等效于Android

我们可以在iPhone中为地图上的特定位置设置周围域,如下所示

CLLocationCoordinate2D coord = {latitude:37.09024, longitude:-95.712891}; CLLocationDistance latitudinalMeters; latitudinalMeters =NoOfMiles * 1609.344; CLLocationDistance longitudinalMeters; longitudinalMeters = NoOfMiles * 1609.344; mapViewHome.region = MKCoordinateRegionMakeWithDistance(coord, latitudinalMeters, longitudinalMeters); 

有没有Android的等效方法?

此代码不是生产质量。 请在此处使用来自评论的Chris建议: https : //issuetracker.google.com/issues/35823607#comment4


此问题最初是针对Maps API v1提出的。 这个答案适用于v2,但可以很容易地改为v1,所以……

没有简单的方法来做到这一点。

您可能想要在gmaps-api-issues上请求此function 。

等待在Google端实施此操作可能需要几个月的时间,所以我会这样做:

 private static final double ASSUMED_INIT_LATLNG_DIFF = 1.0; private static final float ACCURACY = 0.01f; public static LatLngBounds boundsWithCenterAndLatLngDistance(LatLng center, float latDistanceInMeters, float lngDistanceInMeters) { latDistanceInMeters /= 2; lngDistanceInMeters /= 2; LatLngBounds.Builder builder = LatLngBounds.builder(); float[] distance = new float[1]; { boolean foundMax = false; double foundMinLngDiff = 0; double assumedLngDiff = ASSUMED_INIT_LATLNG_DIFF; do { Location.distanceBetween(center.latitude, center.longitude, center.latitude, center.longitude + assumedLngDiff, distance); float distanceDiff = distance[0] - lngDistanceInMeters; if (distanceDiff < 0) { if (!foundMax) { foundMinLngDiff = assumedLngDiff; assumedLngDiff *= 2; } else { double tmp = assumedLngDiff; assumedLngDiff += (assumedLngDiff - foundMinLngDiff) / 2; foundMinLngDiff = tmp; } } else { assumedLngDiff -= (assumedLngDiff - foundMinLngDiff) / 2; foundMax = true; } } while (Math.abs(distance[0] - lngDistanceInMeters) > lngDistanceInMeters * ACCURACY); LatLng east = new LatLng(center.latitude, center.longitude + assumedLngDiff); builder.include(east); LatLng west = new LatLng(center.latitude, center.longitude - assumedLngDiff); builder.include(west); } { boolean foundMax = false; double foundMinLatDiff = 0; double assumedLatDiffNorth = ASSUMED_INIT_LATLNG_DIFF; do { Location.distanceBetween(center.latitude, center.longitude, center.latitude + assumedLatDiffNorth, center.longitude, distance); float distanceDiff = distance[0] - latDistanceInMeters; if (distanceDiff < 0) { if (!foundMax) { foundMinLatDiff = assumedLatDiffNorth; assumedLatDiffNorth *= 2; } else { double tmp = assumedLatDiffNorth; assumedLatDiffNorth += (assumedLatDiffNorth - foundMinLatDiff) / 2; foundMinLatDiff = tmp; } } else { assumedLatDiffNorth -= (assumedLatDiffNorth - foundMinLatDiff) / 2; foundMax = true; } } while (Math.abs(distance[0] - latDistanceInMeters) > latDistanceInMeters * ACCURACY); LatLng north = new LatLng(center.latitude + assumedLatDiffNorth, center.longitude); builder.include(north); } { boolean foundMax = false; double foundMinLatDiff = 0; double assumedLatDiffSouth = ASSUMED_INIT_LATLNG_DIFF; do { Location.distanceBetween(center.latitude, center.longitude, center.latitude - assumedLatDiffSouth, center.longitude, distance); float distanceDiff = distance[0] - latDistanceInMeters; if (distanceDiff < 0) { if (!foundMax) { foundMinLatDiff = assumedLatDiffSouth; assumedLatDiffSouth *= 2; } else { double tmp = assumedLatDiffSouth; assumedLatDiffSouth += (assumedLatDiffSouth - foundMinLatDiff) / 2; foundMinLatDiff = tmp; } } else { assumedLatDiffSouth -= (assumedLatDiffSouth - foundMinLatDiff) / 2; foundMax = true; } } while (Math.abs(distance[0] - latDistanceInMeters) > latDistanceInMeters * ACCURACY); LatLng south = new LatLng(center.latitude - assumedLatDiffSouth, center.longitude); builder.include(south); } return builder.build(); } 

用法:

 LatLngBounds bounds = AndroidMapsExtensionsUtils.boundsWithCenterAndLatLngDistance(new LatLng(51.0, 19.0), 1000, 2000); map.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0)); 

笔记:

  • 此代码尚未经过全面测试,可能不适用于边缘情况
  • 您可能希望调整私有常量以使其执行得更快
  • 你可以删除LatLng south计算的第3个部分并像经度那样去做:这对于latDistance的小值是准确的(猜测你不会看到100km以下的差异)
  • 代码很难看,所以请随意重构

虽然上述答案可能有效,但正如作者已经提到的那样,它并没有真正直截了当。 这是一些适合我的代码。 请注意,代码假定地球是一个完美的球体。

 double latspan = (latMeters/111325); double longspan = (longMeters/111325)*(1/ Math.cos(Math.toRadians(location.latitude))); LatLngBounds bounds = new LatLngBounds( new LatLng(location.latitude-latspan, location.longitude-longspan), new LatLng(location.latitude+latspan, location.longitude+longspan));