Echarts + Amap、全国の州、市区町村、地域セクターの地図を取得して強調表示します

ユーザーが州または市を選択すると、対応する地域が強調表示されます。

図に示すように:

前のユーザーが江蘇省を選択したため、江蘇省のマップ セクションが現在強調表示されています。前のユーザーが成都市を選択した場合、マップは次のように四川省の領土に変更され、成都市が強調表示されます。

引き続きドリルダウンして、強調表示された領域を選択できます。

共有ツールは次のとおりです:  DataV.GeoAtlas 地理ガジェット シリーズ

Adcode コードを使用して、全国の地図セクションを表示できます。

知らせ!知らせ!具体的な手順はこちら!

1. マップを保存するコンテナを作成します

<div id="charts"></div>

2. コンテナを入手する

 myChart = echarts.init(document.getElementById("charts"));

3. Amap を使用して adcode コードを取得します。ここでは axios を使用して取得します。

 axios
      .get(
        `https://restapi.amap.com/v3/geocode/geo?address=${
          district?city:!district && city?province:!district && !city?'中国':'中国'
        }&output=JSON&key=af092dccf*********cf19ade46`
      )
      .then((res) => {
        adcode = res.data.geocodes[0].adcode;
})

ここで注意すべき点がいくつかあります。

${district?city:!district && city?province:!district && !city?'中国':'中国'}

上記のコードの意味は、地区名 (晋江区) を取得した場合は都市名 (成都市) を使用して地図を生成する必要があり、都市名 (成都市) を取得した場合は省名を取得することです。ここでは (四川省) を使用する必要があります。) を使用して地図を生成するなど、省名 (四川省) を取得した場合は、国全体 (中国) を使用して地図を生成します。(もちろんこれらのパラメータはバックエンドから取得したデータです)

key=af092dccf1***********9ade46

このキーは Amap で申請したキーです。申請方法は Baidu で確認できます。

 adcode = res.data.geocodes[0].adcode;

次に、現在選択されているエリアのアドコードを取得しました。

4. アドコード コードを通じて地域地図を取得します。これは、上で共有したDataV.GeoAtlas 地理ガジェット シリーズです。

開封後はこんな感じです。

こちらが地図を入手できるリクエストアドレスです。アドレスの 100000 は中国語のアドコードです。別のアドコード コードを入力してみると、左側にさまざまな地域の地図が表示されます。

具体操作:

 myChart.showLoading();
        axios
          .get(
            `https://geo.datav.aliyun.com/areas_v3/bound/${
              adcode == 0 ? 100000 : adcode
            }_full.json`
          )
          .then((geoJson) => {
            console.log(geoJson);

            //获取所有省、市
            // console.log(geoJson.data.features);
            let allData = geoJson.data.features;
            let seriesData = [];
            allData.forEach((item) => {
              // console.log(item.properties.name);
              // console.log(item);
              let obj;
              if (item.properties.name) {
                if (
                  item.properties.name == province ||
                  item.properties.name == city ||
                  item.properties.name == district
                ) {
                  // console.log(item.properties.center);
                  setLongitudeLatitude(item.properties.center);
                  obj = {
                    name: item.properties.name,
                    value: measure,
                    selected: true,
                  };
                } else {
                  obj = {
                    name: item.properties.name,
                    selected: false,
                  };
                }
                seriesData.push(obj);
              }
            });
            myChart.hideLoading();
            echarts.registerMap("ZG", geoJson.data);
            myChart.setOption(
              (option = {
                title: {},
                tooltip: {
                  trigger: "item",
                },
                series: [
                  {
                    type: "map",
                    map: "ZG",
                    silent: true, //禁用地图的hover事件
                    label: {
                      show: true,
                    },
                    data: seriesData,
                    zoom: 1, //当前视角的缩放比例
                    roam: true, //是否开启平游或缩放
                    scaleLimit: {
                      //滚轮缩放的极限控制
                      min: 1,
                      max: 3,
                    },
                  },
                ],
              })
            );
          });

コードの次の部分は、強調表示された領域を見つけて、series.data をロードすることです。

次に完全なコードを見てみましょう。

  let myChart;
  let option;
  const renderChart = (province, city, district, measure) => {
    myChart = echarts.init(document.getElementById("charts"));
    let adcode;
    axios
      .get(
        `https://restapi.amap.com/v3/geocode/geo?address=${
          district?city:!district && city?province:!district && !city?'中国':'中国'
        }&output=JSON&key=af092dc********cf19ade46`
      )
      .then((res) => {
        adcode = res.data.geocodes[0].adcode;
        myChart.showLoading();
        axios
          .get(
            `https://geo.datav.aliyun.com/areas_v3/bound/${
              adcode == 0 ? 100000 : adcode
            }_full.json`
          )
          .then((geoJson) => {
            console.log(geoJson);

            //获取所有省、市
            let allData = geoJson.data.features;
            let seriesData = [];
            allData.forEach((item) => {
              // console.log(item.properties.name);
              // console.log(item);
              let obj;
              if (item.properties.name) {
                if (
                  item.properties.name == province ||
                  item.properties.name == city ||
                  item.properties.name == district
                ) {
                  // console.log(item.properties.center);
                  setLongitudeLatitude(item.properties.center);
                  obj = {
                    name: item.properties.name,
                    value: measure,
                    selected: true,
                  };
                } else {
                  obj = {
                    name: item.properties.name,
                    selected: false,
                  };
                }
                seriesData.push(obj);
              }
            });
            myChart.hideLoading();
            echarts.registerMap("ZG", geoJson.data);
            myChart.setOption(
              (option = {
                title: {},
                tooltip: {
                  trigger: "item",
                },
                series: [
                  {
                    type: "map",
                    map: "ZG",
                    silent: true, //禁用地图的hover事件
                    label: {
                      show: true,
                    },
                    data: seriesData,
                    zoom: 1, //当前视角的缩放比例
                    roam: true, //是否开启平游或缩放
                    scaleLimit: {
                      //滚轮缩放的极限控制
                      min: 1,
                      max: 3,
                    },
                  },
                ],
              })
            );
          });
      });
  option && myChart.setOption(option);
  };

質問がある場合はチャットしましょう。ただし、返信は少し遅れます。ハハハッハッハ

おすすめ

転載: blog.csdn.net/Gunba1/article/details/129854472