简单两步,实现高德地图的定位和展示,内含坐标系转换(示例为Angular框架+TypeScript代码)

本文详细介绍了如何在Angular项目中集成高德地图API,包括注册账号、添加JSAPI到前端代码、使用Geolocation进行定位,并提供了使用原生定位和坐标系转换的优化示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高德地图开放平台为开发者提供了强大的地图展示和相关计算功能,可以在前端代码中方便的集成,本文做一些简单和关键步骤的介绍,虽是基于Angular平台,但同样可以给JS、VUE做一些参考。

1、高德开放平台设置

1)去高德网站开放平台注册一个账号:

高德开放平台 | 高德地图API

可用个人身份注册,支付宝做实名认证。

2)创建一个应用

这里可以得到key,后面有用。

2、前端代码(angular为例)

1)安装geolocation插件

npm install @ionic-native/geolocation

2)修改index.html,增加高德地图的JS API

<head>
  <!-- 高德地图 -->
  <script src="https://webapi.amap.com/maps?v=1.4.15&key=这里是你的高德key"></script>
  <script src="//webapi.amap.com/ui/1.1/main.js"></script>
  <script src="//webapi.amap.com/ui/1.1/ui/overlay/SimpleMarker.js"></script>  
</head>

3)TS代码

注意:以下代码使用了高德的定位代码:

import { Component } from '@angular/core';
import { Platform } from '@ionic/angular';
declare var AMap;

@Component({
  selector: 'app-map',
  templateUrl: 'map.page.html',
  styleUrls: ['map.page.scss']
})
export class MapPage {
  map: any;

  constructor(private platform: Platform) {}

  ionViewWillEnter() {
    this.platform.ready().then(() => {
      this.loadMap();
    });
  }

  loadMap() {
    this.map = new AMap.Map('mapContainer', {
      center: [116.397428, 39.90923],
      zoom: 13
    });

    AMap.plugin('AMap.Geolocation', () => {
      var geolocation = new AMap.Geolocation({
        enableHighAccuracy: true,
        timeout: 10000
      });

      this.map.addControl(geolocation);
      geolocation.getCurrentPosition();
    });
  }
}

4)html代码

<ion-content>
  <div id="mapContainer"></div>
</ion-content>

5)css代码(注意:如果不设置高度,可能你啥也看不见)

#mapContainer{
  height: 400px; 
}

至此,你就能够展示地图,并且以当前位置坐标为中心。接下来,我们可以根据需要做一些优化和增强。

3、优化

1)使用系统原生定位(并非使用高德定位,高德只是作为地图展示)

  • app.module.ts 装载Geolocation对象
import { Geolocation } from '@ionic-native/geolocation/ngx';

providers: [
    Geolocation,
    ]
  • TS代码片段
import { Geolocation } from '@ionic-native/geolocation/ngx';

  constructor(
    public geolocation: Geolocation,
  ) {
  }

refreshPos() {
    // 使用原生的获取坐标的方法
    this.geolocation.getCurrentPosition().then((res)=>{
      console.log(res.coords)
      // 坐标系转换
      const new_coords = this.wgs84ToGcj02(res.coords.longitude,res.coords.latitude);
      console.log(new_coords)
      // 计算两点间距离
      this.distance = this.getDistance(new_coords.longitude, new_coords.latitude, 113.7792, 23.06359);
      // 设置地图的中心为当前坐标
      this.map.setCenter([new_coords.longitude, new_coords.latitude]);
      // 绘制中心点图标
      if (this.marker) {  // 假设不为空,则需要清空
        this.marker.setMap(null);
      }
      this.marker = new AMap.Marker({
          position: new AMap.LngLat(new_coords.longitude,new_coords.latitude),
          icon: '//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png',
          offset: new AMap.Pixel(-13, -30)
      });
      this.marker.setMap(this.map);
    }); 
  }

2)坐标系转换

/** WGS84 转换为 GCJ02 */
  wgs84ToGcj02(lng: number, lat: number) {
    var lat = +lat;
    var lng = +lng;
    let dlat = this.transformlat(lng - 105.0, lat - 35.0);
    let dlng = this.transformlng(lng - 105.0, lat - 35.0);
    let radlat = lat / 180.0 * this.coordtransform.PI;
    let magic = Math.sin(radlat);
    magic = 1 - this.coordtransform.ee * magic * magic;
    let sqrtmagic = Math.sqrt(magic);
    dlat = (dlat * 180.0) / ((this.coordtransform.a * (1 - this.coordtransform.ee)) / (magic * sqrtmagic) * this.coordtransform.PI);
    dlng = (dlng * 180.0) / (this.coordtransform.a / sqrtmagic * Math.cos(radlat) * this.coordtransform.PI);
    let mglat = lat + dlat;
    let mglng = lng + dlng;
    return { longitude: mglng, latitude: mglat };
  }
  //纬度转换算法
  transformlat(lng: number, lat: number) {
    var lat = +lat;
    var lng = +lng;
    let ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
    ret += (20.0 * Math.sin(6.0 * lng * this.coordtransform.PI) + 20.0 * Math.sin(2.0 * lng * this.coordtransform.PI)) * 2.0 / 3.0;
    ret += (20.0 * Math.sin(lat * this.coordtransform.PI) + 40.0 * Math.sin(lat / 3.0 * this.coordtransform.PI)) * 2.0 / 3.0;
    ret += (160.0 * Math.sin(lat / 12.0 * this.coordtransform.PI) + 320 * Math.sin(lat * this.coordtransform.PI / 30.0)) * 2.0 / 3.0;
    return ret;
  };
  //经度转换算法
  transformlng(lng: number, lat: number) {
    var lat = +lat;
    var lng = +lng;
    let ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
    ret += (20.0 * Math.sin(6.0 * lng * this.coordtransform.PI) + 20.0 * Math.sin(2.0 * lng * this.coordtransform.PI)) * 2.0 / 3.0;
    ret += (20.0 * Math.sin(lng * this.coordtransform.PI) + 40.0 * Math.sin(lng / 3.0 * this.coordtransform.PI)) * 2.0 / 3.0;
    ret += (150.0 * Math.sin(lng / 12.0 * this.coordtransform.PI) + 300.0 * Math.sin(lng / 30.0 * this.coordtransform.PI)) * 2.0 / 3.0;
    return ret;
  };

3)获取两点间距离

  // 获取两点间的距离
  getDistance(lng1: number, lat1: number, lng2: number, lat2: number): number {
    return AMap.GeometryUtil.distance(new AMap.LngLat(lng1, lat1), new AMap.LngLat(lng2, lat2));
  }

html代码改为:

<ion-header [translucent]="true">
  <ion-toolbar>
    <ion-title>
      定位测试
    </ion-title>
  </ion-toolbar>
</ion-header>
<ion-content [fullscreen]="true">
    <div id="mapContainer"></div>
    <div><a (click)="refreshPos()">刷新</a></div>
    <div>{{distance}}</div>
</ion-content>

最终效果截图:

如果觉得不错,请点赞、收藏!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值