共计 2772 个字符,预计需要花费 7 分钟才能阅读完成。
导读 | 这篇文章主要为大家介绍了 Openlayer add mark 及添加 hover 效果实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 |
add mark
方法一
如果有多个点的话,可以生成多个 feature(循环调用 addFeature)
const iconStyle = () => | |
new Style({image: new Icon({ scale: 0.2, src: image}) }); | |
const addFeature = (point: Coordinate) => | |
new Feature({geometry: new Point(Proj.fromLonLat(point)), | |
properties, | |
name: "当前位置", | |
population: 4000, | |
rainfall: 500, | |
}); | |
const pointSource = new VectorSource({features: [addFeature(point)], | |
}); | |
const clusterSourceForLayer = new Cluster({ | |
source: pointSource, | |
distance: 50, | |
}); | |
const pointLayer = new VectorLayer({ | |
source: clusterSourceForLayer, | |
zIndex: 3, | |
style: iconStyle, | |
}); | |
map.addLayer(pointLayer); | |
pointLayer.set("baseMap", "iconLayer"); |
方法二
用 geojson 去渲染 mark
const iconStyle = () => | |
new Style({image: new Icon({ scale: 0.2, src: image}) }); | |
const pointSource = new VectorSource({features: new GeoJSON().readFeatures(geojson, { | |
dataProjection: "EPSG:4326", | |
featureProjection: "EPSG:3857", | |
}), | |
}); | |
const clusterSourceForLayer = new Cluster({ | |
source: pointSource, | |
distance: 50, | |
}); | |
const pointLayer = new VectorLayer({ | |
source: clusterSourceForLayer, | |
zIndex: 3, | |
style: iconStyle, | |
}); | |
map?.addLayer(pointLayer); | |
pointLayer.set("baseMap", "iconLayer"); |
geojson 格式
生成 geojson 的方式:
{ | |
"type": "FeatureCollection", | |
"features": [ | |
{ | |
"type": "Feature", | |
"properties": { | |
"id": "customer002", | |
"name": "c2" | |
}, | |
"geometry": { | |
"type": "Point", | |
"coordinates": [119.777738303153, 32.91324329434815] | |
} | |
}, | |
{ | |
"type": "Feature", | |
"properties": { | |
"id": "customerId007", | |
"name": "张三" | |
}, | |
"geometry": { | |
"type": "Point", | |
"coordinates": [109.54393448864997, 35.7427088696462] | |
} | |
} | |
] | |
} |
hover mark
popover
overlay 需要一个 dom 元素,这里是用过 ref 获取的
const o = new Overlay({element: ref.current}); | |
map?.addOverlay(o); | |
setOverlay(o); |
方法一
用 select 去做,它有个 select 事件
它事件参数中,有个 selected,如果不是空数组,说明你鼠标正在 hover mark,就可以弹出 popover,显示你想要显示的内容
const select = new Select({ | |
condition: pointerMove, | |
hitTolerance: 1, | |
layers: [iconLayer], | |
style: iconStyle, | |
}); | |
select.on("select", (e) => {const { selected} = e; | |
if (selected.length) {const [feature] = selected; | |
const _feature = feature.get("features")[0]; | |
const id = _feature.get("id"); | |
const name = _feature.get("name"); | |
setContent({name, id}); | |
const coordinate = feature.get("geometry").flatCoordinates; | |
overlay.setPosition(coordinate); | |
} else {overlay.setPosition(undefined); | |
} | |
}); | |
map?.addInteraction(select); |
方法二
用 select 去做,本质也是通过 pointerMove 事件,所以可以直接在 map 上监听 pointerMove 事件
具体的实现方式我没有去尝试,通过上面的推断,我觉得是可行的
map.on("pointerMove", (e) => {});
clear mark
通过 useEffect 返回的函数清理地图中的 mark
useEffect(() => {return () => { | |
// 卸载页面中的 mark | |
iconSource?.getFeatures().forEach((feature) => {iconSource?.removeFeature(feature); | |
}); | |
}; | |
}, [points, iconSource]); |
方法 addInteraction、addOverlay、addLayer 区别
我没有搞清楚他们之间的区别,目前了解的是:
-
栅格:Tile(图片)
-
矢量:Vector(geojson、lerc)
-
矢量栅格:VectorTile(pbf)
-
Popover 可以用 Overlay 去做
以上就是 Openlayer add mark 及添加 hover 效果实例详解的详细内容
正文完
星哥玩云-微信公众号
