Google Maps Geometry Library:如何创建处于拖动状态的标记

Posted

技术标签:

【中文标题】Google Maps Geometry Library:如何创建处于拖动状态的标记【英文标题】:Google Maps Geometry Library: how do I create a marker that is in a state of being dragged 【发布时间】:2019-01-09 08:23:21 【问题描述】:

我的意图是在 dragstart 事件中将一条折线(具有两个坐标)一分为二。

下面的代码发生了什么:

    折线正在等待拖动开始 当用户开始拖动折线时,两条新的折线和它们之间的标记会替换旧的折线 拖动停止在当前鼠标位置而不释放鼠标

实际意图:

在第 3 步中,继续拖动,但拖动的元素是新的标记,而不是删除的折线。

如何将“拖动”从折线转移到标记?

const path = new google.maps.MVCArray([
  new google.maps.LatLng(0, 0),
  new google.maps.LatLng(10, 10),
])

const polyline = new google.maps.Polyline(
  map,
  path,
  draggable: true
)

let marker, newPolylineA, newPolylineB

const dragstartListener = polyline.addListener('dragstart', ( latLng ) => 
  google.maps.event.removeListener(dragstartListener)
  polyline.setMap(null)

  marker = new google.maps.Marker(
    map,
    position: latLng,
    draggable: true,
  )

  newPolylineA = new google.maps.Polyline(
    map,
    path: [ path.getAt(0), latLng ],
  )

  newPolylineB = new google.maps.Polyline(
    map,
    path: [ latLng, path.getAt(1) ],
  )
)

【问题讨论】:

为什么不添加一个可拖动的标记并将其绑定到折线的新顶点? 我正在创建新的标记并将折线绑定到它。但是由于 UX 的原因(单次点击比点击 2 次更好),我想将拖动目标从初始折线更改为新的标记。 请提供minimal reproducible example 来证明问题 【参考方案1】:

我通过使用 strokeOpacity 隐藏原始折线并使用拖动和拖动事件来解决它。

这不是拖动目标的实际交换,但它至少模仿了结果。

const coordinateA = new google.maps.LatLng(0, 0)
const coordinateB = new google.maps.LatLng(10, 10)
const path = new google.maps.MVCArray([
  coordinateA,
  coordinateB,
])

const polyline = new google.maps.Polyline(
  map,
  path,
  draggable: true
)

let marker, newPolylineA, newPolylineB

const dragstartListener = polyline.addListener('dragstart', ( latLng ) => 
  polyline.setOptions(
    strokeOpacity: 0
  )

  marker = new google.maps.Marker(
    map,
    position: latLng,
    draggable: true,
  )

  newPolylineA = new google.maps.Polyline(
    map,
    path: [ path.getAt(0), latLng ],
  )

  newPolylineB = new google.maps.Polyline(
    map,
    path: [ latLng, path.getAt(1) ],
  )

  google.maps.event.removeListener(dragstartListener)
)

const dragListener = polyline.addListener('drag', ( latLng ) => 
  marker.setPosition(latLng)  
  newPolylineA.setPath([ coordinateA, latLng ])
  newPolylineB.setPath([ latLng, coordinateB ])
)

const dragendListener = polyline.addListener('dragend', ( latLng ) => 
  google.maps.event.removeListener(dragendListener)
  google.maps.event.removeListener(dragListener)

  marker.setPosition(latLng)  
  newPolylineA.setPath([ coordinateA, latLng ])
  newPolylineB.setPath([ latLng, coordinateB ])

  polyline.setMap(null)
)

【讨论】:

以上是关于Google Maps Geometry Library:如何创建处于拖动状态的标记的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.ClassCastException:com.google.android.gms.maps.model.LatLng 无法转换为 com.mapbox.mapboxsdk.geo

请教GOOGLE MAP API国内能访问的地址

Google Maps LatLng 的 Typescript 类型问题

Unversioned Javascript Google Maps API参考拉(破)实验版

如何使用谷歌地图检测一个点在多边形内?

谷歌地图 v3 可拖动标记