使用 Vue Next 和 Leaflet 引入 KML 文件

在这篇博客中,我们将介绍如何在 Vue 3 (Vue Next) 中使用 Leaflet 地图库,并通过 leaflet-kml 插件加载 KML 文件进行展示。Leaflet 是一个开源的 JavaScript 库,用于创建互动地图,而 leaflet-kml 插件可以帮助我们在 Leaflet 地图上加载并显示 KML 格式的数据。

image.png

安装依赖

首先,我们需要安装必要的依赖:

npm install leaflet-kml leaflet

代码实现

1. Vue 组件模板

在 Vue 组件中,我们将构建一个地图视图,并允许用户通过文件选择器加载 KML 文件。下面是模板部分:

<template>
  <div>
    <!-- 地图容器 -->
    <div id="map" style="height: 100vh;"></div>

    <!-- 用于触发文件选择的自定义按钮 -->
    <label for="kml-file" class="load-kml-button">
      选择 KML 文件
    </label>

    <!-- 隐藏的文件输入 -->
    <input type="file" id="kml-file" accept=".kml" class="select-button" />
  </div>
</template>

2. Vue 组件脚本

在脚本部分,我们通过 onMounted 钩子初始化 Leaflet 地图,并设置文件选择器事件监听。当用户选择 KML 文件时,利用 FileReader API 读取文件内容,并使用 leaflet-kml 插件解析并加载 KML 文件。

<script>
import L from 'leaflet';
import 'leaflet/dist/leaflet.css';  // Leaflet 样式
import 'leaflet-kml';  // 导入 leaflet-kml 插件
import { onMounted } from 'vue';

export default {
  name: "MapComponent",
  setup() {
    onMounted(() => {
      // 初始化 Leaflet 地图
      const map = L.map('map').setView([31.707806, 119.824952], 10); // 设置地图中心和缩放级别

      // 添加 OpenStreetMap 图层
      L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
        attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
      }).addTo(map);

      // 文件选择器监听
      const kmlInput = document.getElementById('kml-file');
      kmlInput.addEventListener('change', handleKMLFile);

      function handleKMLFile(event) {
        const file = event.target.files[0];
        if (file) {
          const reader = new FileReader();
          reader.onload = function (e) {
            // 获取文件的原始文本内容
            const kmlText = e.target.result;

            // 使用 DOMParser 将 KML 字符串解析为 XML 对象
            const parser = new DOMParser();
            const xmlDoc = parser.parseFromString(kmlText, 'application/xml');

            // 检查解析是否成功
            if (xmlDoc.getElementsByTagName('parsererror').length > 0) {
              console.error('KML 文件解析失败');
              return;
            }

            try {
              // 使用 leaflet-kml 插件加载解析后的 XML 数据
              const kmlLayer = new L.KML(xmlDoc, { async: true });
              kmlLayer.addTo(map);  // 将 KML 图层添加到地图
            } catch (error) {
              console.error('加载 KML 文件时发生错误:', error);
            }
          };
          reader.readAsText(file); // 读取 KML 文件为文本
        }
      }
    });
  },
};
</script>

3. 样式部分

最后,我们为地图容器和文件选择按钮添加了一些基本的样式,确保地图显示正确且文件选择按钮易于点击。

<style scoped>
/* 地图样式 */
#map {
  width: 100%;
  height: 100%;
}

/* 自定义按钮样式 */
.load-kml-button {
  position: absolute;
  top: 80px;
  right: 50px;
  background-color: #3498db;
  color: white;
  border: none;
  border-radius: 5px;
  padding: 10px 20px;
  cursor: pointer;
  z-index: 1000;
  font-size: 16px;
  transition: background-color 0.3s;
}

.load-kml-button:hover {
  background-color: #2980b9;
}

/* 隐藏文件选择框 */
.select-button {
  display: none;
}
</style>

总结

通过上述代码,我们能够在 Vue Next 项目中使用 Leaflet 加载和显示 KML 文件。用户只需要点击自定义的按钮选择一个 KML 文件,文件将会被解析并加载到地图中。这样,我们就能将地理信息数据展示在一个交互式地图上。

相关文档

最后修改:2024 年 12 月 18 日
如果觉得我的文章对你有用,请随意赞赏