高德地图解决逆地理坐标问题

10 篇文章 0 订阅
1 篇文章 0 订阅

逆地理坐标:即从经纬度,转化为城市名称。
步骤:

  1. 申请key 高德api文档
  2. 开始传参请求,
  3. fetch处理跨域,
  4. 接口返回数据各种转化,异步数据处理。
  5. 可视化展示
  6. 写回调函数再处理返回的数据
equipmentDistribute() {
      let _this = this;
      var mapchart = this.$echarts.init(
        document.getElementById("equipmentMap")
      );
      let dataCityValue = [];
      let toolTiponlineData = [];
      let toolTipDataValue = [];
      this.$api.device.deviceList().then(data => {
        if (data == "") {
          this.$message({
            type: "error",
            message: "登录超时,请重新登录"
          });
          this.$router.push("/");
        } else if (data.code == 200) {
          let resData = data.rows;
          let arrLonLatotal = [];
          resData.forEach(ele => {
            let arrLl = [ele.longitude, ele.latitude];
            arrLonLatotal.push(arrLl);
            let objChnOnline = {};
            objChnOnline.name = "在线";
            objChnOnline.value = ele.chnNum;
            let objChnOutline = {};
            objChnOutline.name = "离线";
            objChnOutline.value = 0;
            toolTipDataValue.push(objChnOnline);
            toolTipDataValue.push(objChnOutline);
          });
          fetch(
            "https://restapi.amap.com/v3/geocode/regeo?key=你申请的key=" +
              arrLonLatotal +
              "&batch=true"
          )
            .then(function(response) {
              return response.json();
            })
            .then(function(myJson) {
              console.log("地图返回值");
              console.log(myJson);
              if (myJson.status == 1) {
                let gdresArr = myJson.regeocodes;
                gdresArr.forEach(ele => {
                  let objCityVal = {};
                  objCityVal.name = ele.addressComponent.province.slice(0, 2);
                  objCityVal.value = 20;
                  dataCityValue.push(objCityVal); //echarts中第一个需要的data数据
                  let tooltip = {};
                  tooltip.name = ele.addressComponent.province.slice(0, 2);
                  tooltip.value = toolTipDataValue;
                  toolTiponlineData.push(tooltip);
                });
                _this.arrChartCityVal = dataCityValue;
                _this.arrChartInfoCityVal = toolTiponlineData;
				//以下处理代码应该写在回调函数里,会更清晰
                var name_title = "设备在各省分布情况";
                var subname = "在线/离线";
                var nameColor = " rgb(55, 75, 113)";
                var name_fontFamily = "等线";
                var subname_fontSize = 15;
                var name_fontSize = 18;
                var mapName = "china";
                console.log("所有有设备城市对象数组");
                console.log(_this.arrChartCityVal);
                // var data = [{name:"北京", value:20}];
                var data = _this.arrChartCityVal;

                var geoCoordMap = {};
                console.log("在线离线值");
                console.log(_this.arrChartInfoCityVal);
                // var toolTipData = [{
                //   name:"北京",
                //   value:[{
                //     name:"在线",
                //     value:1
                //   },{
                //     name:"离线",
                //     value:0
                //   }]
                // }]
                var toolTipData = _this.arrChartInfoCityVal;
                /*获取地图数据*/
                mapchart.showLoading();
                var mapFeatures = echarts.getMap(mapName).geoJson.features;
                mapchart.hideLoading();
                mapFeatures.forEach(function(v) {
                  // 地区名称
                  var name = v.properties.name;
                  // 地区经纬度
                  geoCoordMap[name] = v.properties.cp;
                });

                // console.log("============geoCoordMap===================")
                // console.log(geoCoordMap)
                // console.log("================data======================")
                var max = 10,
                  min = 5; // todo
                var maxSize4Pin = 10,
                  minSize4Pin = 2;
                // 计算经纬度
                var convertData = function(data) {
                  var res = [];
                  for (var i = 0; i < data.length; i++) {
                    var geoCoord = geoCoordMap[data[i].name];
                    if (geoCoord) {
                      res.push({
                        name: data[i].name,
                        value: geoCoord.concat(data[i].value)
                      });
                    }
                  }
                  return res;
                };
                var option = {
                  title: {
                    text: name_title,
                    subtext: subname,
                    x: "center",
                    textStyle: {
                      color: nameColor,
                      fontFamily: name_fontFamily,
                      fontSize: name_fontSize
                    },
                    subtextStyle: {
                      fontSize: subname_fontSize,
                      fontFamily: name_fontFamily
                    }
                  },
                  tooltip: {
                    trigger: "item",
                    show: true,
                    formatter: function(params) {
                      if (typeof params.value[2] == "undefined") {
                        var toolTiphtml = "";
                        for (var i = 0; i < toolTipData.length; i++) {
                          if (params.name == toolTipData[i].name) {
                            toolTiphtml += toolTipData[i].name + ":<br>";
                            for (
                              var j = 0;
                              j < toolTipData[i].value.length;
                              j++
                            ) {
                              toolTiphtml +=
                                toolTipData[i].value[j].name +
                                ":" +
                                toolTipData[i].value[j].value +
                                "<br>";
                            }
                          }
                        }
                        // console.log(toolTiphtml);
                        // console.log(convertData(data))
                        return toolTiphtml;
                      } else {
                        var toolTiphtml = "";
                        for (var i = 0; i < toolTipData.length; i++) {
                          if (params.name == toolTipData[i].name) {
                            toolTiphtml += toolTipData[i].name + ":<br>";
                            for (
                              var j = 0;
                              j < toolTipData[i].value.length;
                              j++
                            ) {
                              toolTiphtml +=
                                toolTipData[i].value[j].name +
                                " : " +
                                toolTipData[i].value[j].value +
                                "<br>";
                            }
                          }
                        }
                        // console.log(toolTiphtml);
                        // console.log(convertData(data))
                        return toolTiphtml;
                      }
                    }
                  },
                  visualMap: {
                    show: true,
                    min: 0,
                    max: 10,
                    left: "left",
                    top: "bottom",
                    text: ["高", "低"], // 文本,默认为数值文本
                    calculable: true,
                    seriesIndex: [1],
                    inRange: {
                      // color: ['#3B5077', '#031525'] // 蓝黑
                      // color: ['#ffc0cb', '#800080'] // 红紫
                      // color: ['#3C3B3F', '#605C3C'] // 黑绿
                      // color: ["#00467F", "#A5CC82"] // 蓝绿
                      color: ["#1488CC", "#2B32B2"] // 浅蓝
                    }
                  },
                  geo: {
                    show: true, //是否显示地区
                    map: mapName,
                    label: {
                      normal: {
                        show: true,
                        color: "#fff"
                      },
                      emphasis: {
                        show: true
                      }
                    },
                    roam: true,
                    itemStyle: {
                      normal: {
                        areaColor: "#0080CC", //整体区域颜色
                        borderColor: "#F4F7FC" //各省分界线边缘颜色
                      },
                      emphasis: {
                        areaColor: "#2B91B7"
                      }
                    }
                  },
                  series: [
                    {
                      name: "散点",
                      type: "effectScatter",
                      coordinateSystem: "geo",
                      data: convertData(data),
                      symbolSize: function(val) {
                        return val[2] / 10;
                      },
                      label: {
                        normal: {
                          formatter: "{b}",
                          position: "right",
                          show: true
                        },
                        emphasis: {
                          show: true
                        }
                      },
                      itemStyle: {
                        normal: {
                          color: "#05C3F9"
                        }
                      }
                    },
                    {
                      type: "map",
                      map: mapName,
                      geoIndex: 0,
                      aspectScale: 0.75, //长宽比
                      showLegendSymbol: true, // 存在legend时显示
                      label: {
                        normal: {
                          show: true
                        },
                        emphasis: {
                          show: true,
                          textStyle: {
                            color: "#fff"
                          }
                        }
                      },
                      roam: true,
                      itemStyle: {
                        normal: {
                          areaColor: "#000",
                          borderColor: "#ddd",
                          show: true
                        },
                        emphasis: {
                          areaColor: "#000"
                        }
                      },
                      animation: false,
                      data: data
                    },
                    {
                      name: "点",
                      type: "scatter",
                      coordinateSystem: "geo",
                      symbol: "pin", //气泡
                      symbolSize: function(val) {
                        var a = (maxSize4Pin - minSize4Pin) / (max - min);
                        var b = minSize4Pin - a * min;
                        b = maxSize4Pin - a * max;
                        return a * val[2] + b;
                      },
                      label: {
                        normal: {
                          show: false, //不显示坐标
                          textStyle: {
                            color: "#fff",
                            fontSize: 9
                          }
                        }
                      },
                      itemStyle: {
                        normal: {
                          color: "#F62157" //标志颜色红
                        }
                      },
                      zlevel: 6,
                      data: convertData(data)
                    },
                    {
                      name: "Top 5",
                      type: "effectScatter",
                      coordinateSystem: "geo",
                      data: convertData(
                        data
                          .sort(function(a, b) {
                            return b.value - a.value;
                          })
                          .slice(0, 5)
                      ),
                      symbolSize: function(val) {
                        return val[2] / 10;
                      },
                      showEffectOn: "render",
                      rippleEffect: {
                        brushType: "stroke"
                      },
                      hoverAnimation: true,
                      label: {
                        normal: {
                          formatter: "{b}",
                          position: "right",
                          show: false
                        }
                      },
                      itemStyle: {
                        normal: {
                          color: "black",
                          shadowBlur: 10,
                          shadowColor: "yellow",
                          show: false,
                          fontSize: "20px",
                          fontWeight: "500"
                        }
                      },
                      zlevel: 1
                    }
                  ]
                };
                mapchart.setOption(option);
                //这之上应写在callback()
              } else {
                _this.$message({
                  type: "info",
                  message: myJson.info
                });
              }
            });
        }
      });
    }

总结:当没有按照预期效果运行时,不要觉得自己没问题,要按照步骤一步一步排查可能没出现预期效果的原因。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高德地图的批量地理编码可以使用其Web API实现。以下是实现的大致步骤: 1. 准备需要地理编码的经纬度坐标数据。 2. 通过高德地图Web API发送HTTP请求,获取地理编码结果。 3. 解析返回的JSON格式数据,提取地址信息。 4. 保存地址信息到文件或数据库中。 以下是一个Python示例代码,实现了高德地图批量地理编码的功能: ```python import requests import json # 高德地图Web API的请求URL url = 'https://restapi.amap.com/v3/geocode/regeo' # 高德地图Web API的开发者密钥 key = 'your_api_key' # 待地理编码的经纬度坐标数据 coordinates = [ {'lng': 116.481488, 'lat': 39.990464}, {'lng': 116.417901, 'lat': 39.921988}, {'lng': 121.47876, 'lat': 31.238176} ] # 批量地理编码 for coord in coordinates: params = { 'location': '{},{}'.format(coord['lng'], coord['lat']), 'key': key, 'output': 'JSON', 'radius': 1000, 'extensions': 'base' } response = requests.get(url, params) result = json.loads(response.text) if result['status'] == '1': address = result['regeocode']['formatted_address'] print(address) else: print('地理编码失败') ``` 在上述示例代码中,需要将`your_api_key`替换为自己的高德地图Web API开发者密钥。另外,`coordinates`变量中的经纬度坐标可以根据实际情况进行修改。最后,将地理编码结果保存到文件或数据库中可以使用Python内置的文件操作或数据库API实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值