如何在谷歌地图上的折线上方添加文本?

8
我有2个标记,我想在它们之间画一条线,并显示距离文本在线的上方,就像Google地图Web版中一样。
我已经找到了一个示例,可以在2个标记之间画一条线:这里,但是如何在线的上方添加文本呢?
2个回答

9
我有一个需要展示两个标记点之间距离的情况,且这两个标记点在折线图上方。
以下是我的需求:

enter image description here

我用另一种方式成功地实现了它,这种方式非常有趣,您可以根据需要自定义它以实现任何功能。
步骤: 1. 使用Location.distanceBetween()方法计算标记之间的距离。 2. 创建一个新的“Layout XML”文件,并创建您想要显示文本的任何类型的UI。在我的情况下,它只包含一个TextView。 3. 在TextView中设置计算出的距离。 4. 将XML布局转换为位图。 5. 从该位图对象创建BitmapDescriptor。 6. 找到所需标记之间的中点,并使用上一步创建的BitmapDescriptor添加自定义标记,完成。
代码: 计算两个标记之间的距离:
float[] distance1 = new float[1];
Location.distanceBetween(userMarker.getPosition().latitude, userMarker.getPosition().longitude, positionMarker.getPosition().latitude, positionMarker.getPosition().longitude, distance1);

从XML布局文件创建位图。
LinearLayout distanceMarkerLayout = (LinearLayout) getLayoutInflater().inflate(R.layout.distance_marker_layout, null);

distanceMarkerLayout.setDrawingCacheEnabled(true);
distanceMarkerLayout.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
distanceMarkerLayout.layout(0, 0, distanceMarkerLayout.getMeasuredWidth(), distanceMarkerLayout.getMeasuredHeight()); 
distanceMarkerLayout.buildDrawingCache(true);

TextView positionDistance = (TextView) distanceMarkerLayout.findViewById(R.id.positionDistance);

positionDistance.setText(distance1[0]+" meters");           

Bitmap flagBitmap = Bitmap.createBitmap(distanceMarkerLayout.getDrawingCache());
                distanceMarkerLayout.setDrawingCacheEnabled(false);
                BitmapDescriptor flagBitmapDescriptor = BitmapDescriptorFactory.fromBitmap(flagBitmap);

要找到两个标记之间的中点,请执行以下操作:
double dLon = Math.toRadians(flagMarker.getPosition().longitude - positionMarker.getPosition().longitude);

double lat1 = Math.toRadians(positionMarker.getPosition().latitude);
double lat2 = Math.toRadians(flagMarker.getPosition().latitude);
double lon1 = Math.toRadians(positionMarker.getPosition().longitude);

double Bx = Math.cos(lat2) * Math.cos(dLon);
double By = Math.cos(lat2) * Math.sin(dLon);
double lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + Bx) * (Math.cos(lat1) + Bx) + By * By));
double lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx);

lat3 = Math.toDegrees(lat3);
lon3 = Math.toDegrees(lon3);

使用我们在前面步骤中创建的位图描述符添加新的自定义标记。
Marker centerOneMarker = mMap.addMarker(new MarkerOptions()
                .position(new LatLng(lat3, lon3))
                .icon(flagBitmapDescriptor));

希望它能帮到你。

正是我所需要的,你救了我的一天@gprathour,谢谢你。 - Amitabh Sarkar
@AmitabhSarkar 欢迎 :) - gprathour
1
你是怎么想到的?!你真是个天才。 - Steve Moretz
所有这些计算是为什么?只需使用(lat1 + lat2)/2,lon1和lon2同理。 - Steve Moretz
@stevemoretz 谢谢伙计!当时我刚刚找到了一种方法,并想分享出来,以便可能帮助其他人。除此之外,目前为止,我不记得这些计算是为什么以及为什么需要它们。如果你有更好的方法,请随意分享。 - gprathour
显示剩余2条评论

3

一种想法是使用标记的纬度和经度坐标计算它们之间的中点,然后放置一个信息窗口并显示您想要展示的任何信息。或者像以下链接所示的内容可能会有帮助:链接


1
好主意,但根据文档,一次只能显示一个信息窗口,并且它必须绑定到标记。因此,我必须使用一个不可见的标记,并且不使用任何其他信息窗口。 - Tamas
另一个想法是使用自定义覆盖层。将文本作为自定义覆盖层放置在线条上方。但我怀疑这是否更容易实现。不幸的是,目前似乎还没有支持将文本附加到折线的方法。 - so_jin_ee
同时,我已经尝试了infowindow hack,但它非常缓慢。我需要在每次拖动事件中更新它,以便它位于正确的位置,即使只有一个textview,它也非常缓慢。在拖动期间(在Galaxy Tab GT-P5200上)大约只有1-2fps。 - Tamas
请告诉我如果你最终找到了更好的解决方案。我也一直在寻找更好的答案。 - so_jin_ee
我可能会坚持使用你的(甚至只是每5次拖动更新infowindow位置):) - Tamas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接