当前位置:   article > 正文

OpenLayers6(8):引入Turf.js做缓冲区分析_openlayers turf geojson 相交分析

openlayers turf geojson 相交分析

1 版本

  • OpenLayers:6.14.1


2 相关配置

  1. //前端的地理空间分析库,处理各种地图算法
  2. npm i @turf/turf

3 Openlayers图形与图形Turf之间的互相转换

使用策略模式进行实现:

  1. /**
  2. * 策略模式,不同类型返回不同的Turf几何图形
  3. */
  4. export const mCoords2TurfGeom = {
  5. Point: function (coords) {
  6. return turf.point(coords);
  7. },
  8. MultiPoint: function (coords) {
  9. return turf.multiPoint(coords);
  10. },
  11. LineString: function (coords) {
  12. return turf.lineString(coords);
  13. },
  14. MultiLineString: function (coords) {
  15. return turf.multiLineString(coords);
  16. },
  17. Polygon: function (coords) {
  18. return turf.polygon(coords);
  19. },
  20. MultiPolygon: function (coords) {
  21. return turf.multiPolygon(coords);
  22. },
  23. }

4 openlayers的要素点击事件

基于地图的"singleclick"点击事件拾取要素:

  1. /**
  2. * 选择要素
  3. * @param {*} map 地图对象
  4. * @param {*} type 事件类型
  5. * @param {*} layerFilter 图层山筛选函数
  6. * @param {*} cb1 选中要素回调
  7. * @param {*} cb2 未选中要素回调
  8. * @returns 事件Key
  9. */
  10. export function mapOnFeature(map, type, layerFilter, cb1, cb2) {
  11. const key = map.on(type, function (e) {
  12. map.forEachFeatureAtPixel(e.pixel, function (feature, layer) {
  13. if (feature && layer) {
  14. cb1 && cb1(feature);
  15. } else {
  16. cb2 && cb2();
  17. }
  18. }, {
  19. layerFilter: layerFilter,
  20. hitTolerance: 5
  21. });
  22. });
  23. return key;
  24. }

5 进行缓冲区分析

  1. import * as turf from "@turf/turf";
  2. // 图层筛选
  3. lFilter(layer) {
  4. // return layer;
  5. return layer.get("title") === "草图图层";
  6. },
  7. // 进行缓冲区分析
  8. bufferF(feature) {
  9. const geometry = feature.getGeometry();
  10. const type = geometry.getType();
  11. geometry.transform("EPSG:3857", "EPSG:4326");
  12. const coords = geometry.getCoordinates();
  13. const tf = mCoords2TurfGeom[type](coords);
  14. // 缓冲区分析,turf必须使用wgs84经纬度坐标
  15. const tbf = turf.buffer(tf, this.mBuffer.distance, {
  16. units: this.mBuffer.unit,
  17. });
  18. const obf = new GeoJSON().readFeature(tbf);
  19. obf.getGeometry().transform("EPSG:4326", "EPSG:3857");
  20. geometry.transform("EPSG:4326", "EPSG:3857");
  21. this.pDrawLayer.getSource().addFeature(obf);
  22. },
  23. mBufferKey = mapOnFeature(this.pMap,"singleclick",this.lFilter,this.bufferF);

6 实现界面及效果图

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/595103
推荐阅读
相关标签
  

闽ICP备14008679号