在谷歌地图从浏览器,具有弯曲的虚线是这样的: 我可以在Google Maps Android中绘制弯曲的虚线吗?
但是,当我在自己的Android项目实现谷歌地图,它并没有显示这条线
如何绘制这条线?
在谷歌地图从浏览器,具有弯曲的虚线是这样的: 我可以在Google Maps Android中绘制弯曲的虚线吗?
但是,当我在自己的Android项目实现谷歌地图,它并没有显示这条线
如何绘制这条线?
您可以在两点之间实现弯曲的虚线折线。为此,您可以使用具有SphericalUtil类的Google Maps Android API Utility Library,并在代码中应用一些数学运算来创建多段线。
您必须在您的gradle这个实用程序库作为
compile 'com.google.maps.android:android-maps-utils:0.5'
。
请看看我的示例活动和功能showCurvedPolyline (LatLng p1, LatLng p2, double k)
它构造了两点之间的虚线弯曲多段线。最后一个参数k定义折线的曲率,它可以是> 0和< = 1。在我的例子中,我用K = 0.5
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
private LatLng sydney1;
private LatLng sydney2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.getUiSettings().setZoomControlsEnabled(true);
// Add a marker in Sydney and move the camera
sydney1 = new LatLng(-33.904438,151.249852);
sydney2 = new LatLng(-33.905823,151.252422);
mMap.addMarker(new MarkerOptions().position(sydney1)
.draggable(false).visible(true).title("Marker in Sydney 1"));
mMap.addMarker(new MarkerOptions().position(sydney2)
.draggable(false).visible(true).title("Marker in Sydney 2"));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney1, 16F));
this.showCurvedPolyline(sydney1,sydney2, 0.5);
}
private void showCurvedPolyline (LatLng p1, LatLng p2, double k) {
//Calculate distance and heading between two points
double d = SphericalUtil.computeDistanceBetween(p1,p2);
double h = SphericalUtil.computeHeading(p1, p2);
//Midpoint position
LatLng p = SphericalUtil.computeOffset(p1, d*0.5, h);
//Apply some mathematics to calculate position of the circle center
double x = (1-k*k)*d*0.5/(2*k);
double r = (1+k*k)*d*0.5/(2*k);
LatLng c = SphericalUtil.computeOffset(p, x, h + 90.0);
//Polyline options
PolylineOptions options = new PolylineOptions();
List<PatternItem> pattern = Arrays.<PatternItem>asList(new Dash(30), new Gap(20));
//Calculate heading between circle center and two points
double h1 = SphericalUtil.computeHeading(c, p1);
double h2 = SphericalUtil.computeHeading(c, p2);
//Calculate positions of points on circle border and add them to polyline options
int numpoints = 100;
double step = (h2 -h1)/numpoints;
for (int i=0; i < numpoints; i++) {
LatLng pi = SphericalUtil.computeOffset(c, r, h1 + i * step);
options.add(pi);
}
//Draw polyline
mMap.addPolyline(options.width(10).color(Color.MAGENTA).geodesic(false).pattern(pattern));
}
}
您可以从GitHub
下载示例项目,完整代码https://github.com/xomena-so/so43305664
只是你代替我的API密钥在app/src/debug/res/values/google_maps_api.xml
非常感谢,它解决了我的问题。我很抱歉发表评论,因为我在这个问题上的任务在很长一段时间之后又开始了,等待着再次开始。 –
感谢上述解决方案的@xomena。它在大多数情况下运行非常好。但需要一些改进:
当k == 1
,x是0和中点(P)将是相同的曲线中期(c)点。这意味着它应该是一条直线,但是当你计算该步时,它不是零,所以最终结果是一个半圆曲线,与上述条件不一致。
当曲线足够长,让说LIMIT = 1000km
,在h1 + i * step
每个计算循环内做一个微小的错误到正确的值(由于java的double
计算错误我猜)。然后,多段线的起点和终点与开始和结束坐标不完全匹配。此外,折线的曲率是不可预知的,基于我的研究,其原因可能是地球表面的曲率,这可能会使您的计算基于标题不正确。
我速战速决是重置,使之成为一条直线。对于第二个问题,如果两点之间的距离大于1000km的极限,则用k = 1
画一条直线对我来说将是一个更安全的选择。
感谢您分享此内容。请看看这个:stackoverflow.com/questions/46411266/draw-arc-polyline-in-google-map我可以有你最终为showCurvedPolyline(..)方法写的更新的解决方案 – Sonali
我认为这是可能的,我在这里找到一个[jsfiddle](http://jsfiddle.net/geocodezip/re6km2wp/3/)可以做到这一点。但问题是它使用[Google Maps JavaScript API](https://developers.google.com/maps/documentation/javascript/)来使其工作。有关更多信息,请尝试检查此[SO问题](http:// stackoverflow。com/questions/13721008 /如何绘制虚线 - 折线-with-android-google-map-sdk-v2)如果它可以帮助你。 – KENdi
@KENdi非常感谢,Google Maps Android API中的直线虚折线可以实现,但曲线虚线只出现在Javascript API中。我在iOS,Android上检查过Google Maps应用程序,它没有任何曲线,我猜这是不可能的(或者太难绘制) –