gpt4 book ai didi

android - 将 android map 标记拖动限制为多段线

转载 作者:行者123 更新时间:2023-11-29 01:23:24 24 4
gpt4 key购买 nike

我正在寻找一些关于如何解决我在使用 android SupportMapFragment 时遇到的问题的建议。我正在使用存储在我的应用程序数据库中的 LatLng 坐标在 SupportMapFragment 上绘制折线。我还在第一个和最后一个 LatLng 坐标处添加了一个 map 标记,以表示路线的起点和终点。我想为我的用户提供通过将开始和结束标记拖动到折线上他们想要的点来修剪路线的能力。我面临的问题是限制标记可以拖动的路径,因此它们只能沿着折线移动。

最佳答案

这个问题有点老了,但我希望其他人会觉得这个答案有用。

boolean PolyUtil.isLocationOnEdge 将帮助您确定一个点是否与 map 上的多边形或折线重叠。

public class RestrictedMarkerDragActivity extends FragmentActivity implements
OnMapReadyCallback,
GoogleMap.OnMarkerDragListener {

private static final float WIDTH = 4;
private static final double TOLERANCE_IN_METERS = 3.0;

private GoogleMap map;
private SupportMapFragment mapFragment;
private Polyline polyline;
private Marker marker;
private LatLng positionOnPolyline;

@Override
protected void onCreate(Bundle savedInstance) {
super.onCreate(savedInstance);
setContentView(R.layout.activity_maps);

mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {
this.map = googleMap;

List<LatLng> points = new ArrayList<>();
points.add(new LatLng(19.35853391311947, -99.15182696733749));
points.add(new LatLng(19.34384275931999, -99.1546209261358));

PolylineOptions polylineOptions = new PolylineOptions();
polylineOptions.color(Color.CYAN);
polylineOptions.width(WIDTH);
polyline = map.addPolyline(polylineOptions);
polyline.setPoints(points);

MarkerOptions markerOptions = new MarkerOptions();
markerOptions.draggable(true);
markerOptions.position(points.get(0));
marker = map.addMarker(markerOptions);

positionOnPolyline = new LatLng(marker.getPosition().latitude, marker.getPosition().longitude);

map.setOnMarkerDragListener(this);

map.animateCamera(CameraUpdateFactory.newLatLngZoom(points.get(0), 15));
}

@Override
public void onMarkerDragStart(Marker marker) {
//Nothing to do here

}

@Override
public void onMarkerDrag(Marker marker) {
//If the marker overlaps the polyline, polyline width gets bigger and marker position gets updated,
//else, polyline width remains the same
if(PolyUtil.isLocationOnEdge(marker.getPosition(), polyline.getPoints(), true, TOLERANCE_IN_METERS)) {
polyline.setWidth(WIDTH * 3);
positionOnPolyline = new LatLng(marker.getPosition().latitude, marker.getPosition().longitude);
} else {
polyline.setWidth(WIDTH);
}
}

@Override
public void onMarkerDragEnd(Marker marker) {
//We set the marker to its last known position over the polyline
marker.setPosition(positionOnPolyline);
//We set polyline width to its original
polyline.setWidth(WIDTH);
}

}

关于android - 将 android map 标记拖动限制为多段线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35466568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com