openlayer加载本地kml的方法

openlayer官网上有kml加载显示的方法:
openlayer官网加载kml示例
只是其中url是相对前端服务器根目录路径:
在这里插入图片描述
然而开发过程中出现需要加载本地文件的需求,本来是想通过上传ftp曲线救国,但是考虑到现在很多浏览器放弃了对ftp的支持,故而放弃ftp思路,决定直接选择本地kml文件加载。
  由于直接使用file://协议会出现跨域问题,所以使用js的fileReader方式读取kml内容,然后使用openlayer的vectorsource 中kml format解析feature添加到数据源中,代码如下所示:

function addkmllayer(file) {
let newlayer;

var vectorSource2 = new VectorSource({
  format:new KML({
    extractStyles: false,
    // crossOrigin:"*"
  }),
  loader: function(extent, resolution, projection) {
     var reader = new FileReader();
    reader.onload = function() {
      let features=vectorSource2.getFormat().readFeatures(this.result
        ,
        {
          dataProjection: 'EPSG:4326',
          featureProjection: 'EPSG:3857'
        }
      );
      vectorSource2.addFeatures(features);

      let extent=newlayer.getSource().getExtent();
      map.getView().fit(extent);

      }
    reader.readAsText(file);
  },
);

newlayer = new VectorLayer({
  source:vectorSource2,
  style:new Style({
    fill:new Fill({
      color:[0xff,0xff,0x33,0.7]
    }),
    stroke:new Stroke({
      color:'black'
    })
  })
})
map.addLayer(
  newlayer
);
}

静态页面vue部件代码:

<template>
  <div>

    <input type="file" @change="upload($event)" accept=".kml"/>
    <div id="map" class="map">

    </div>
  </div>

</template>

<script>
 
    export default {
      name: "totalmap",
        mounted() {
        totalmaphandler.createnewmap();
      },
      methods:{
        upload(input){
          console.log(input);
           addkmllayer(input.currentTarget.files[0])
        }
      }
    }

</script>

<style scoped>

  .map {
    height: 800px;
    width: 100%;
  }

</style>

其中省略了map创建代码。
注意kml的epsg为4326,所以需要设置feature的坐标系:

   let features=vectorSource2.getFormat().readFeatures(this.result
        ,
        {
          dataProjection: 'EPSG:4326',
          featureProjection: 'EPSG:3857'
        }
      );
     

按照最后加载图层范围定位代码需要放到onload回调函数中,不然获取不到extent。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
leaflet是一种JavaScript开源库,用于在Web上构建交互性地图。虽然它很容易使用,在加载本地kml时,需要一些额外的步骤。 要加载本地kml,请按照以下步骤进行操作: 1.准备kml文件:在本地计算机上找到要加载kml文件。如果不存在,请创建一个kml文件。确保文件名不包含空格、特殊字符或中文字符。 2.构造Leaflet map对象:在HTML文件中,构造一个Leaflet map对象。将它放置在一个div容器中。为map对象设置视图并添加图层。 3.创建JavaScript对象:创建一个JavaScript对象,并用XMLHttpRequest对象读取kml文件。 4.解析kml文件:使用JavaScript解析kml文件。这可以使用多个JavaScript库,如 xmlhttprequest 库和 DOMParser 库。解析后,将其存储在一个GeoJSON对象中。 5.向图层添加数据:在图层上添加解析出来的数据。 以下是一个简单的代码示例: ``` // 1. 准备kml文件 var kmlFile = "your-kml-file-name.kml"; // 2. 构造Leaflet map对象 var map = L.map('map').setView([51.505, -0.09], 13); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Map data © <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>', maxZoom: 18, }).addTo(map); // 3. 创建JavaScript对象 var xhr = new XMLHttpRequest(); xhr.open('GET', kmlFile, true); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { // 4. 解析kml文件 var kml = xhr.responseText; var parser = new DOMParser(); var xmlDoc = parser.parseFromString(kml, "text/xml"); var geojson = toGeoJSON.kml(xmlDoc); // 5. 向图层添加数据 L.geoJSON(geojson).addTo(map); } }; xhr.send(); ``` 通过这个代码,您可以将kml文件加载到您的Leaflet地图中,仔细检查代码,并根据您的需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值