android - 限制android map 标记拖动到折线

标签 android google-maps

我正在寻找一些关于如何解决我在使用 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/

相关文章:

android - Google Play 不会自动更新内部应用

android - 如何在android中取消一个事件

java - Holo 聚焦按钮可绘制的位置

google-maps - 谷歌地图 V3 div 位置固定变化相对

javascript - 在 JavaScript 中显示数百万个对象

javascript - 尽管同源政策,嵌入式谷歌地图如何发送数据?

android - 仅为特定市场启用功能

android - 游戏服务与应用的区别

android - 以编程方式设置 GoogleMapOptions

ios - 如何观察dealloc过程