练习:GeoJSON和leaflet配合使用(二)

<script setup>
import L from "leaflet";
import "leaflet/dist/leaflet.css";
import { onMounted } from "vue";
// 改变点的样式
var geojsonMarkerOptions = {
  radius: 8,
  fillColor: "#ff7800",
  color: "#000",
  weight: 1,
  opacity: 1,
  fillOpacity: 0.8,
};
let travelData = [
  { lat: 45.78, lng: 126.58, address: "哈尔滨" }, // 哈尔滨
  { lat: 36.07, lng: 120.38, address: "青岛" }, //青岛
  { lat: 32.06, lng: 118.8, address: "南京" }, //南京
  { lat: 31.24, lng: 121.5, address: "上海" }, //上海
  { lat: 30.22, lng: 120.12, address: "杭州" }, //杭州
  { lat: 25.68, lng: 118.1, address: "厦门" }, //厦门
  { lat: 24.44, lng: 100.3, address: "大理" }, //大理
  { lat: 44.6, lng: 81.39, address: "新疆" }, // 新疆
  { lat: 30.57, lng: 104.07, address: "成都" }, //成都
  { lat: 29.56, lng: 106.55, address: "重庆" }, //重庆
  { lat: 28.23, lng: 112.94, address: "长沙" }, // 长沙
  { lat: 30.59, lng: 114.3, address: "武汉" }, //武汉
  { lat: 34.34, lng: 108.94, address: "西安" }, //西安
  { lat: 34.62, lng: 112.45, address: "洛阳" }, // 洛阳
  { lat: 39.9, lng: 116.41, address: "北京" }, // 北京
];
onMounted(() => {
  initMap();
});

/**
 * @author:南希Libra
 * @description:初始化地图
 */
const initMap = () => {
  var map = L.map("geoJson").setView([39.904896, 116.724762], 4);
  // 添加描述
  getDescribe(map);
  //GeoJSON 一个点
  let geojsonFeature = getMultiplePoints();
  L.geoJSON(geojsonFeature, {
    // 修改样式
    pointToLayer: function (feature, latlng) {
      return L.circleMarker(latlng, geojsonMarkerOptions);
    },
    // 点击事件
    onEachFeature: onEachFeature,
     滤波器:控制可见性
    filter: function (feature, layer) {
      return feature.properties.show_on_map;
    },
  }).addTo(map);
  //GeoJSON 线段
  let draw_line = getMultipleLine();
  draw_line.forEach((item) => {
    console.log(item, "===");
    L.geoJson(item, {
      style: {
        color: "red",
        weight: 5,
      },
      onEachFeature,
    }).addTo(map);
  });
  let url =
    "http://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}";
  // let url='https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'
  L.tileLayer(url, {
    maxZoom: 8,
  }).addTo(map);
  // 显示应用于地图中心点的比例
  L.control.scale().addTo(map);
};

/**
 * @author:南希Libra
 * @description:类似于点击事件方法
 */
const onEachFeature = (feature, layer) => {
  if (feature.properties && feature.properties.popupContent) {
    layer.bindPopup(feature.properties.popupContent);
  }
};

/**
 * @author:南希Libra
 * @description:循环遍历多个点
 */
const getMultiplePoints = () => {
  let geojsonFeature = [];

  for (let i = 0; i < travelData.length - 1; i++) {
    let lat = travelData[i]?.lat;
    let lng = travelData[i]?.lng;
    let address = travelData[i]?.address;

    let obj = {
      type: "Feature",
      properties: {
        name: `GeoJSON 点${i}`,
        show_on_map: true, // 滤波器:控制可见性
        amenity: "Baseball Stadium",
        popupContent: `我是${address}`,
      },
      geometry: {
        type: "Point",
        coordinates: [lng, lat],
      },
    };
    geojsonFeature.push(obj);
  }
  return geojsonFeature;
};
/**
 * @author:南希Libra
 * @description:循环遍历多个线段
 */
const getMultipleLine = () => {
  let draw_line = [];
  console.log(travelData.length);
  for (let i = 0; i < travelData.length - 1; i++) {
    let latlng1 = [travelData[i]?.lng, travelData[i]?.lat];
    let latlng2 = [travelData[i + 1]?.lng, travelData[i + 1]?.lat];
    let address = [travelData[i]?.address, travelData[i + 1]?.address];
    let obj = {
      type: "Feature",
      geometry: {
        type: "LineString",
        coordinates: [latlng1, latlng2],
      },
      properties: {
        popupContent: `我是从${address[0]}到${address[1]}的线段`,
        underConstruction: true,
      },
    };
    draw_line.push(obj);
  }
  return draw_line;
};
/**
 * @author:南希Libra
 * @description:设置描述
 */
const getDescribe = (map) => {
  let legend = L.control({ position: "bottomright" });
  legend.onAdd = function (map) {
    let div = L.DomUtil.create("div", "legend");
    div.innerHTML = `
            <p><b>我的旅游规划路线</b></p><hr>
            <ul>
                <li>哈尔滨</li>
                <li>青岛</li>
                <li>南京</li>
                <li>上海</li>
                <li>杭州</li>
                <li>厦门</li>
                <li>大理</li>
                <li>新疆</li>
                <li>成都</li>
                <li>重庆</li>
                <li>长沙</li>
                <li>武汉</li>
                <li>西安</li>
                <li>洛阳</li>
                <li>北京</li>
            </ul>
        `;
    return div;
  };
  legend.addTo(map);
};
</script>
 
<template name='GeoJSON'>
  <div>GEOJSON</div>
  <div id="geoJson"></div>
</template>
 
<style scoped lang='scss'>
#geoJson {
  width: 1200px;
  height: 560px;
  border: 1px solid #f00;
}
:deep(.legend) {
  font-size: 16px;
  line-height: 24px;
  color: #333333;
  font-family: "Open Sans", Helvetica, sans-serif;
  padding: 10px 14px;
  background-color: pink;
  box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);
  border-radius: 5px;
  max-width: 250px;
  border: 1px solid grey;
  overflow-y: auto;
  height: 450px;
}

.legend p {
  font-size: 16px;
  line-height: 24px;
}
</style>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Leaflet 中,GeoJSON 是一种常见的用于表示矢量数据的数据格式。GeoJSON 由一系列的点、线和多边形组成,可以用来表示地理位置、边界和区域。以下是一些使用 GeoJSONLeaflet 操作: 1. 加载 GeoJSON 数据:使用 Leaflet 的 ajax() 方法加载 GeoJSON 数据。你可以将 GeoJSON 数据存储在一个外部的 .json 文件中,然后使用 ajax() 方法加载该文件。 ```javascript // 加载 GeoJSON 数据 var geojsonLayer = new L.GeoJSON.AJAX("data.geojson"); ``` 2. 将 GeoJSON 数据添加到地图中:使用 addLayer() 方法将 GeoJSON 数据添加到地图中。 ```javascript // 将 GeoJSON 数据添加到地图中 geojsonLayer.addTo(map); ``` 3. 样式设置:使用 style() 方法设置 GeoJSON 数据的样式,包括颜色、填充、线宽等。 ```javascript // 设置 GeoJSON 数据的样式 geojsonLayer.style({ color: "#ff0000", weight: 2, opacity: 0.5, fillOpacity: 0.2, fillColor: "#ff0000" }); ``` 4. 弹出窗口:使用 bindPopup() 方法为 GeoJSON 数据添加弹出窗口。 ```javascript // 为 GeoJSON 数据添加弹出窗口 geojsonLayer.bindPopup("<b>Hello world!</b><br>I am a popup."); ``` 5. 事件绑定:使用 on() 方法为 GeoJSON 数据绑定事件,包括 click、mouseover 等。 ```javascript // 为 GeoJSON 数据绑定 click 事件 geojsonLayer.on("click", function(e) { console.log("Clicked", e); }); ``` 以上是使用 GeoJSONLeaflet 操作,你可以根据实际情况进行调整和扩展。需要注意的是,GeoJSON 数据需要符合 GeoJSON 标准格式,否则在加载和处理过程中可能会出现问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值