我们可以在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://code.google.com/p/gmaps-api-issues/issues/detail?id=5704
原来这个问题是Maps API v1.这个答案是针对v2,但是可以很容易地变成v1,所以…
没有简单的方法来做到这一点.
你可能想要request this feature on gmaps-api-issues.
等待这个在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.latitude + assumedLatDiffNorth,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.latitude - assumedLatDiffSouth,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南方计算的第三部分,并对经度进行操作:对于较小的latDistance值,这将是准确的(猜测您在100公里以下看不到差异)>代码是丑陋的,所以随便重构