java – 在Android的地图上绘制地理上准确的弧

前端之家收集整理的这篇文章主要介绍了java – 在Android的地图上绘制地理上准确的弧前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想画一个中心GPS点和两个终点GPS点的弧.我可以使用任何可以与 android搭配使用的地图软件.

到目前为止,我已经尝试过Google Maps for Android. Android的MapBox ARCGIS for Android.他们似乎都不能做这个简单的任务.

我猜想我需要一些叠加层?


解决方法

首先,您必须更改地理数据表示.

由此:

  1. 36°46'02.5"S 174°50'03.6"E GRC
  2. 36°56'18.3"S 174°33'09.7"E CWA 36°52'19.2"S 174°29'23.5"E 5.0' NM
  3. 36°48'19.8"S 174°25'37.7"E GRC
  4. 36°41'06.1"S 174°37'32.9"E CCA 36°39'54.5"S 174°38'40.7"E 1.5' NM
  5. 36°41'00.3"S 174°39'57.1"E GRC
  6. 36°39'49.4"S 174°41'32.3"E CCA 36°38'43.5"S 174°40'15.7"E 1.5' NM
  7. 36°39'17.5"S 174°41'59.7"E GRC
  8. 36°39'38.6"S 174°44'37.7"E GRC
  9. 36°37'08.8"S 174°47'27.4"E CWA 36°42'03.8"S 174°46'17.0"E 5.0' NM

为此:

  1. -36.76736 174.83433 GRC
  2. -36.93842 174.55269 CWA -36.87200 174.48986 0.08333 NM
  3. -36.80550 174.42714 GRC
  4. -36.68503 174.62581 CCA -36.66514 174.64464 0.02500 NM
  5. -36.68342 174.66586 GRC
  6. -36.66372 174.69231 CCA -36.64542 174.67103 0.02500 NM
  7. -36.65486 174.69992 GRC
  8. -36.66072 174.74381 GRC
  9. -36.61911 174.79094 CWA -36.70106 174.77139 0.08333 NM

然后,您可以使用它们来构建路径(例如,SVG path):

  1. <svg
  2. ...>
  3. <g
  4. transform="matrix(1250,1250,46206.909,-217995.49)"
  5. ...>
  6. <path
  7. d=" M -36.76736,174.83433 L -36.93842,174.55269 A 0.08333,0.08333 0 0,1 -36.80550,174.42714 L -36.68503,174.62581 A 0.02500,0.02500 0 0,0 -36.68342,174.66586 L -36.66372,174.69231 A 0.02500,0 -36.65486,174.69992 L -36.66072,174.74381 L -36.61911,174.79094 A 0.08333,1 -36.76736,174.83433 Z"
  8. .../>
  9. </g>
  10. </svg>

实际上,没有API可以在GMaps / OSMDroid中创建曲线,弧等,所以你应该画几条小线.这意味着做一些数学,但这个数学可以由GeographicLib library做出:

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.activity_main);
  5.  
  6.  
  7. MapView map = (MapView) findViewById(R.id.map);
  8. map.setTileSource(TileSourceFactory.MAPNIK);
  9. map.setBuiltInZoomControls(true);
  10. map.setMultiTouchControls(true);
  11.  
  12.  
  13. IMapController mapController = map.getController();
  14. mapController.setZoom(9);
  15. GeoPoint startPoint = new GeoPoint(-36.66372,174.69231);
  16. mapController.setCenter(startPoint);
  17.  
  18. Polygon polyline = new Polygon(this);
  19. List<GeoPoint> points = new LinkedList<>();
  20.  
  21. // I filled the data manually,but it can be done more clever,of course.
  22. GRC(points,new GeoPoint(-36.76736,174.83433));
  23. CWA(points,new GeoPoint(-36.93842,174.55269),new GeoPoint(-36.87200,174.48986),new GeoPoint(-36.80550,174.42714),0.08333);
  24. CCA(points,new GeoPoint(-36.68503,174.62581),new GeoPoint(-36.66514,174.64464),new GeoPoint(-36.68342,174.66586),0.02500);
  25. CCA(points,new GeoPoint(-36.66372,174.69231),new GeoPoint(-36.64542,174.67103),new GeoPoint(-36.65486,174.69992),0.02500);
  26. GRC(points,new GeoPoint(-36.66072,174.74381));
  27. CWA(points,new GeoPoint(-36.61911,174.79094),new GeoPoint(-36.70106,174.77139),174.83433),//close shape going to the start point
  28. 0.08333);
  29.  
  30. polyline.setPoints(points);
  31. polyline.setFillColor(0xA0FF00FF);
  32. polyline.setStrokeColor(Color.BLACK);
  33. polyline.setStrokeWidth(2f);
  34. map.getOverlays().add(polyline);
  35. map.invalidate();
  36. }
  37.  
  38. private void CCA(List<GeoPoint> points,GeoPoint startPoint,GeoPoint centerPoint,GeoPoint endPoint,double radius) {
  39. points.add(startPoint);
  40.  
  41. GeodesicData f = Geodesic.WGS84.Inverse(centerPoint.getLatitude(),centerPoint.getLongitude(),startPoint.getLatitude(),startPoint.getLongitude());
  42. GeodesicData t = Geodesic.WGS84.Inverse(centerPoint.getLatitude(),endPoint.getLatitude(),endPoint.getLongitude());
  43.  
  44. double ffaz = f.azi1;
  45. double tfaz = t.azi1;
  46.  
  47. final int decrement = 1;
  48. while (Math.abs((int)ffaz) != Math.abs((int)tfaz)) {
  49. GeodesicData llb = Geodesic.WGS84.Direct(centerPoint.getLatitude(),ffaz,f.s12);
  50. points.add(new GeoPoint(llb.lat2,llb.lon2));
  51. ffaz -= decrement;
  52. if (ffaz <0) {
  53. ffaz += 360;
  54. }
  55. }
  56.  
  57. points.add(endPoint);
  58. }
  59.  
  60. private void CWA(List<GeoPoint> points,endPoint.getLongitude());
  61.  
  62. double ffaz = f.azi1;
  63. double tfaz = t.azi1 > 0 ? t.azi1 : 360 + t.azi1;
  64.  
  65. final int increment = 1;
  66. while (Math.abs((int)ffaz) != Math.abs((int)tfaz)) {
  67. GeodesicData llb = Geodesic.WGS84.Direct(centerPoint.getLatitude(),llb.lon2));
  68. ffaz += increment;
  69. if (ffaz>360) {
  70. ffaz -= 360;
  71. }
  72. }
  73.  
  74. points.add(endPoint);
  75. }
  76.  
  77. private void GRC(List<GeoPoint> points,GeoPoint geoPoint) {
  78. points.add(geoPoint);
  79. }

我使用osmdroid OSMBonusPack,但代码是相当普遍的,可以轻松地与Google地图一起使用.

The full source code.

结果:

另外,你会介意告诉你发布了哪个地理数据?地图上的形状看起来像一个允许的飞行区域,我猜.

猜你在找的Android相关文章