MKCoordinateRegionMakeWithDistance相当于Android

前端之家收集整理的这篇文章主要介绍了MKCoordinateRegionMakeWithDistance相当于Android前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们可以在iPhone上为地图上的特定位置设置周边地区,如下所示
  1. CLLocationCoordinate2D coord = {latitude:37.09024,longitude:-95.712891};
  2. CLLocationDistance latitudinalMeters;
  3. latitudinalMeters =NoOfMiles * 1609.344;
  4. CLLocationDistance longitudinalMeters;
  5. longitudinalMeters = NoOfMiles * 1609.344;
  6. 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方面实施可能需要几个月的时间,所以这就是我会做的:

  1. private static final double ASSUMED_INIT_LATLNG_DIFF = 1.0;
  2. private static final float ACCURACY = 0.01f;
  3.  
  4. public static LatLngBounds boundsWithCenterAndLatLngDistance(LatLng center,float latDistanceInMeters,float lngDistanceInMeters) {
  5. latDistanceInMeters /= 2;
  6. lngDistanceInMeters /= 2;
  7. LatLngBounds.Builder builder = LatLngBounds.builder();
  8. float[] distance = new float[1];
  9. {
  10. boolean foundMax = false;
  11. double foundMinLngDiff = 0;
  12. double assumedLngDiff = ASSUMED_INIT_LATLNG_DIFF;
  13. do {
  14. Location.distanceBetween(center.latitude,center.longitude,center.latitude,center.longitude + assumedLngDiff,distance);
  15. float distanceDiff = distance[0] - lngDistanceInMeters;
  16. if (distanceDiff < 0) {
  17. if (!foundMax) {
  18. foundMinLngDiff = assumedLngDiff;
  19. assumedLngDiff *= 2;
  20. } else {
  21. double tmp = assumedLngDiff;
  22. assumedLngDiff += (assumedLngDiff - foundMinLngDiff) / 2;
  23. foundMinLngDiff = tmp;
  24. }
  25. } else {
  26. assumedLngDiff -= (assumedLngDiff - foundMinLngDiff) / 2;
  27. foundMax = true;
  28. }
  29. } while (Math.abs(distance[0] - lngDistanceInMeters) > lngDistanceInMeters * ACCURACY);
  30. LatLng east = new LatLng(center.latitude,center.longitude + assumedLngDiff);
  31. builder.include(east);
  32. LatLng west = new LatLng(center.latitude,center.longitude - assumedLngDiff);
  33. builder.include(west);
  34. }
  35. {
  36. boolean foundMax = false;
  37. double foundMinLatDiff = 0;
  38. double assumedLatDiffNorth = ASSUMED_INIT_LATLNG_DIFF;
  39. do {
  40. Location.distanceBetween(center.latitude,center.latitude + assumedLatDiffNorth,distance);
  41. float distanceDiff = distance[0] - latDistanceInMeters;
  42. if (distanceDiff < 0) {
  43. if (!foundMax) {
  44. foundMinLatDiff = assumedLatDiffNorth;
  45. assumedLatDiffNorth *= 2;
  46. } else {
  47. double tmp = assumedLatDiffNorth;
  48. assumedLatDiffNorth += (assumedLatDiffNorth - foundMinLatDiff) / 2;
  49. foundMinLatDiff = tmp;
  50. }
  51. } else {
  52. assumedLatDiffNorth -= (assumedLatDiffNorth - foundMinLatDiff) / 2;
  53. foundMax = true;
  54. }
  55. } while (Math.abs(distance[0] - latDistanceInMeters) > latDistanceInMeters * ACCURACY);
  56. LatLng north = new LatLng(center.latitude + assumedLatDiffNorth,center.longitude);
  57. builder.include(north);
  58. }
  59. {
  60. boolean foundMax = false;
  61. double foundMinLatDiff = 0;
  62. double assumedLatDiffSouth = ASSUMED_INIT_LATLNG_DIFF;
  63. do {
  64. Location.distanceBetween(center.latitude,center.latitude - assumedLatDiffSouth,distance);
  65. float distanceDiff = distance[0] - latDistanceInMeters;
  66. if (distanceDiff < 0) {
  67. if (!foundMax) {
  68. foundMinLatDiff = assumedLatDiffSouth;
  69. assumedLatDiffSouth *= 2;
  70. } else {
  71. double tmp = assumedLatDiffSouth;
  72. assumedLatDiffSouth += (assumedLatDiffSouth - foundMinLatDiff) / 2;
  73. foundMinLatDiff = tmp;
  74. }
  75. } else {
  76. assumedLatDiffSouth -= (assumedLatDiffSouth - foundMinLatDiff) / 2;
  77. foundMax = true;
  78. }
  79. } while (Math.abs(distance[0] - latDistanceInMeters) > latDistanceInMeters * ACCURACY);
  80. LatLng south = new LatLng(center.latitude - assumedLatDiffSouth,center.longitude);
  81. builder.include(south);
  82. }
  83. return builder.build();
  84. }

用法

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

笔记:

>这段代码还没有被完全测试,可能不适用于边缘情况>您可能需要调整私有常量以使其执行得更快>您可以删除LatLng南方计算的第三部分,并对经度进行操作:对于较小的latDistance值,这将是准确的(猜测您在100公里以下看不到差异)>代码是丑陋的,所以随便重构

猜你在找的Android相关文章