如何在 180° 子午线附近显示 Leaflet 标记?

IT技术 javascript leaflet
2021-03-13 08:41:49

我正在使用传单 1.0.0-rc.2+e02b5c9。我知道默认是渲染所有标记、折线......从经度 -180 到 180 作为这里的屏幕截图:

默认渲染图像

但是,我想将地图显示为我此时要显示的经度(这是日本和美国之间的中海):

我想在这一点上展示

但是您会看到所有标记都未在右侧呈现。即使,如果我设置

worldCopyJump: true

当我向右拖动时,所有标记都出现在右侧,但它们在左侧消失,反之亦然。实际上,我希望它们同时出现。

任何想法来解决这个问题?

4个回答

只需确保标记的经度在 range0..360而不是 range 中-180..180请参阅一个工作示例

即代替

L.marker([0,170]).addTo(map);
L.marker([0,-180]).addTo(map);
L.marker([0,-170]).addTo(map);

做类似的事情

L.marker([0,170]).addTo(map);
L.marker([0,180]).addTo(map);
L.marker([0,190]).addTo(map);

换句话说,如果经度小于零,则向其添加 360。L.Util.wrapNum(lng, [0,360], true)如果您打算一次过滤所有经度,您可能想改用它

该链接不再有效
2021-05-11 08:41:49
我提供了一个新的例子。
2021-05-21 08:41:49

曾经遇到过类似的问题,并在Leaflet Github上报告

解决方案是增加标记的经度,如果它们的初始经度低于 0。

var totalMarkers = markerPositions.length;
for(var i = 0; i<totalMarkers; i++){
    var mData = markerPositions[i];
    if (mData.lon < 0) {
        mData.lon += 360;
    }
    L.marker([mData.lat, mData.lon]).addTo(map);
}
@SHEKHARSHETE 2.5 年前!感谢您的“+1”。我很欣赏
2021-04-29 08:41:49
嘿@Weedoze 这对我有帮助。Jst 对代码稍作改动 if (mData.lon < 0) { mData.lon =parseInt(mData.lon) +360; +1 :)
2021-05-04 08:41:49

另一种方法是利用Leaflet.RepeatedMarkers 插件,它将显示每 360 度经度的每个标记的副本:

Leaflet.repeatedmarkers 截图

将此应用于反子午线附近的标记也有效,例如:

var myRepeatingMarkers = L.gridLayer.repeatedMarkers().addTo(map);

L.polyline([[-85,180],[85,180]]).addTo(map);
L.polyline([[-85,-180],[85,-180]]).addTo(map);

myRepeatingMarkers.addMarker(L.marker([0,140]));
myRepeatingMarkers.addMarker(L.marker([0,150]));
myRepeatingMarkers.addMarker(L.marker([0,160]));
myRepeatingMarkers.addMarker(L.marker([0,170]));
myRepeatingMarkers.addMarker(L.marker([0,180]));
myRepeatingMarkers.addMarker(L.marker([0,-170]));
myRepeatingMarkers.addMarker(L.marker([0,-160]));
myRepeatingMarkers.addMarker(L.marker([0,-150]));
myRepeatingMarkers.addMarker(L.marker([0,-140]));

将显示如下内容:

Leaflet.repeatedmarkers 截图,在反子午线附近有标记 查看使用 Leaflet.repeatedMarkers 和 antimeridian 附近的标记实时示例

谢谢大家的帮助。实际上,我没有使用您建议的代码,但我想到了修复它。

这是我的解决方案,希望对其他寻求相同解决方案的人有所帮助: 已解决的截图

始终在地图上显示图标及其副本(在您想要的经度范围内,在我的情况下,它是从 0 到 360)

makeMarkers: (item) ->
  markers = []
  markers.push(item.makeMarker())

  copy_marker = item.makeMarker()
  copy_marker.setLatLng( new L.LatLng(copy_marker._latlng.lat, copy_marker._latlng.lng + 360) )
  markers.push(copy_marker)

  markers

项目类中:

makeMarker: ->
  LeafletIcon = L.Icon.extend(
    options: {
      iconSize:     [25, 25],
      iconAnchor:   [10, 10],
      popupAnchor:  [0, 0]
    },
  )
  icon = new LeafletIcon( {iconUrl: this.iconUrl} )

  marker = L.marker([this.latitude, this.longitude], {icon: icon, zIndexOffset: 10})
  marker.id = this.id

  marker

再次感谢你。

我试图按照您的方法进行操作,但是对于所有重复的世界地图,它仅在第一张世界地图和右侧的第二张世界地图上显示标记。在重复的世界地图上始终重复出现标记的正确方法是什么,而没有worldCopyJump启用时的闪烁效果
2021-05-19 08:41:49