我想画一个中心GPS点和两个终点GPS点的弧.我可以使用任何可以与
android搭配使用的地图软件.
到目前为止,我已经尝试过Google Maps for Android. Android的MapBox ARCGIS for Android.他们似乎都不能做这个简单的任务.
我猜想我需要一些叠加层?
解决方法
首先,您必须更改地理数据表示.
由此:
36°46'02.5"S 174°50'03.6"E GRC 36°56'18.3"S 174°33'09.7"E CWA 36°52'19.2"S 174°29'23.5"E 5.0' NM 36°48'19.8"S 174°25'37.7"E GRC 36°41'06.1"S 174°37'32.9"E CCA 36°39'54.5"S 174°38'40.7"E 1.5' NM 36°41'00.3"S 174°39'57.1"E GRC 36°39'49.4"S 174°41'32.3"E CCA 36°38'43.5"S 174°40'15.7"E 1.5' NM 36°39'17.5"S 174°41'59.7"E GRC 36°39'38.6"S 174°44'37.7"E GRC 36°37'08.8"S 174°47'27.4"E CWA 36°42'03.8"S 174°46'17.0"E 5.0' NM
为此:
-36.76736 174.83433 GRC -36.93842 174.55269 CWA -36.87200 174.48986 0.08333 NM -36.80550 174.42714 GRC -36.68503 174.62581 CCA -36.66514 174.64464 0.02500 NM -36.68342 174.66586 GRC -36.66372 174.69231 CCA -36.64542 174.67103 0.02500 NM -36.65486 174.69992 GRC -36.66072 174.74381 GRC -36.61911 174.79094 CWA -36.70106 174.77139 0.08333 NM
然后,您可以使用它们来构建路径(例如,SVG path):
<svg ...> <g transform="matrix(1250,1250,46206.909,-217995.49)" ...> <path 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" .../> </g> </svg>
实际上,没有API可以在GMaps / OSMDroid中创建曲线,弧等,所以你应该画几条小线.这意味着做一些数学,但这个数学可以由GeographicLib library做出:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MapView map = (MapView) findViewById(R.id.map); map.setTileSource(TileSourceFactory.MAPNIK); map.setBuiltInZoomControls(true); map.setMultiTouchControls(true); IMapController mapController = map.getController(); mapController.setZoom(9); GeoPoint startPoint = new GeoPoint(-36.66372,174.69231); mapController.setCenter(startPoint); Polygon polyline = new Polygon(this); List<GeoPoint> points = new LinkedList<>(); // I filled the data manually,but it can be done more clever,of course. GRC(points,new GeoPoint(-36.76736,174.83433)); CWA(points,new GeoPoint(-36.93842,174.55269),new GeoPoint(-36.87200,174.48986),new GeoPoint(-36.80550,174.42714),0.08333); CCA(points,new GeoPoint(-36.68503,174.62581),new GeoPoint(-36.66514,174.64464),new GeoPoint(-36.68342,174.66586),0.02500); CCA(points,new GeoPoint(-36.66372,174.69231),new GeoPoint(-36.64542,174.67103),new GeoPoint(-36.65486,174.69992),0.02500); GRC(points,new GeoPoint(-36.66072,174.74381)); CWA(points,new GeoPoint(-36.61911,174.79094),new GeoPoint(-36.70106,174.77139),174.83433),//close shape going to the start point 0.08333); polyline.setPoints(points); polyline.setFillColor(0xA0FF00FF); polyline.setStrokeColor(Color.BLACK); polyline.setStrokeWidth(2f); map.getOverlays().add(polyline); map.invalidate(); } private void CCA(List<GeoPoint> points,GeoPoint startPoint,GeoPoint centerPoint,GeoPoint endPoint,double radius) { points.add(startPoint); GeodesicData f = Geodesic.WGS84.Inverse(centerPoint.getLatitude(),centerPoint.getLongitude(),startPoint.getLatitude(),startPoint.getLongitude()); GeodesicData t = Geodesic.WGS84.Inverse(centerPoint.getLatitude(),endPoint.getLatitude(),endPoint.getLongitude()); double ffaz = f.azi1; double tfaz = t.azi1; final int decrement = 1; while (Math.abs((int)ffaz) != Math.abs((int)tfaz)) { GeodesicData llb = Geodesic.WGS84.Direct(centerPoint.getLatitude(),ffaz,f.s12); points.add(new GeoPoint(llb.lat2,llb.lon2)); ffaz -= decrement; if (ffaz <0) { ffaz += 360; } } points.add(endPoint); } private void CWA(List<GeoPoint> points,endPoint.getLongitude()); double ffaz = f.azi1; double tfaz = t.azi1 > 0 ? t.azi1 : 360 + t.azi1; final int increment = 1; while (Math.abs((int)ffaz) != Math.abs((int)tfaz)) { GeodesicData llb = Geodesic.WGS84.Direct(centerPoint.getLatitude(),llb.lon2)); ffaz += increment; if (ffaz>360) { ffaz -= 360; } } points.add(endPoint); } private void GRC(List<GeoPoint> points,GeoPoint geoPoint) { points.add(geoPoint); }
我使用osmdroid OSMBonusPack,但代码是相当普遍的,可以轻松地与Google地图一起使用.
结果:
另外,你会介意告诉你发布了哪个地理数据?地图上的形状看起来像一个允许的飞行区域,我猜.