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

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

高德地图开放平台为开发者提供了强大的地图展示和相关计算功能,可以在前端代码中方便的集成,本文做一些简单和关键步骤的介绍,虽是基于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>

最终效果截图:

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

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 安装必要的依赖 使用 Angular 框架实现高德地图需要安装 @types/amap-js-api 和 @types/amap-js-sdk 两个依赖。 ```bash npm install @types/amap-js-api @types/amap-js-sdk --save-dev ``` 2. 配置 highCharts API Key 在 app.module.ts 中配置高德地图的 API Key: ```typescript import { AMapLoaderService, LoaderOptions } from '@delon/theme'; // ... const options: LoaderOptions = { key: '你的高德地图 API Key', }; // ... @NgModule({ imports: [ // ... ], declarations: [ // ... ], providers: [ // ... AMapLoaderService, { provide: 'DA_STORE_TOKEN', useValue: {}, }, { provide: 'HIGHCHARTS_MODULES', useFactory: () => [more, exporting], }, { provide: HIGHCHARTS_MODULES, useFactory: () => [highcharts], } ], }) export class AppModule {} ``` 3. 创建地图的 wrapper 服务类 我们需要创建一个 wrapper 类,封装高德地图的调用,以便在内部进行维护和扩展。 ```typescript import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class MapService { private AMap: any; constructor() { this.loadMapScript(); } private loadMapScript() { const script = document.createElement('script'); script.type = 'text/javascript'; script.async = true; script.src = `https://webapi.amap.com/maps?v=1.4.15&key=${environment.amapApiKey}&callback=initAMap`; script.onerror = () => { console.error('Could not load map script!'); }; document.body.appendChild(script); } public getMapInstance() { return new Promise<any>((resolve, reject) => { if (this.AMap) { resolve(this.AMap); } else { const callbackName = `initAMap${Math.floor(Math.random() * 10000)}`; window[callbackName] = () => { this.AMap = window.AMap; resolve(this.AMap); delete window[callbackName]; }; const script = document.createElement('script'); script.type = 'text/javascript'; script.async = true; script.src = `https://webapi.amap.com/maps?v=1.4.15&key=${environment.amapApiKey}&callback=${callbackName}`; script.onerror = () => { console.error('Could not load map script!'); delete window[callbackName]; reject(); }; document.body.appendChild(script); } }); } } ``` 在上面的代码中,我们加载了高德地图 SDK 并在异步加载结束后返回 AMap 实例。 4. 在组件中使用地图查询服务 现在我们可以在组件中使用地图查询服务了。让我们创建一个 search.component.ts 文件实现这个服务。 ```typescript import { Component, OnInit } from '@angular/core'; import { MapService } from '../services/map.service'; @Component({ selector: 'app-search', templateUrl: './search.component.html', styleUrls: ['./search.component.scss'] }) export class SearchComponent implements OnInit { constructor(private mapService: MapService) {} ngOnInit() {} searchPlace(query: string) { this.mapService.getMapInstance().then(AMap => { const placeSearch = new AMap.PlaceSearch({ pageSize: 10, pageIndex: 1, city: '全国', map: new AMap.Map('map', { zoom: 15, resizeEnable: true, }), panel: 'panel' }); placeSearch.search(query, function (status: any, result: any) { // 处理查找结果 }); }); } } ``` 这里我们定义了一个 `searchPlace` 方法,用来查询地点。当我们调用 `searchPlace(query)` 的时候,它将使用 `MapService` 实例来获取 AMap 实例,然后使用 AMap 的 `PlaceSearch` 类查询地点。 5. 在 HTML 模板中添加搜索输入框和地图 最后,我们将在 HTML 模板中创建搜索输入框和地图。 ```html <div class="search-container"> <input type="text" [(ngModel)]="searchQuery" placeholder="请输入地点名称"> <button (click)="searchPlace(searchQuery)">搜索</button> </div> <div id="map" style="height: 400px;"></div> <div id="panel"></div> ``` 现在我们已经实现了一个简单的搜索地点页面,它可以通过高德地图查询地点并在地图上展示出来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值