百度地图开发探索 添加覆盖物(圆形、多边形、行政区)围栏 typescript angular

添加覆盖物

话不多说,先上图,看图写代码(添加点、弹窗的在上一章有整理)

1、圆形围栏:

在这里插入图片描述

2、多边形围栏:

在这里插入图片描述

3、行政区围栏:

在这里插入图片描述

画图:
图形的展示:
// 画围栏
  drawFence(fenceDetail: any) {
    this.fenceDetail = null;  // 数据处理
    const pointArr: any = []; // 数据处理
    this.fencePolygon = []; // 数据处理
    let pointView: any = []; // 数据处理
    let points: any = []; // 数据处理
    const fenceSpecialJson = JSON.parse(fenceDetail.fenceSpecialJson); // 数据处理
    // 圆
    if (fenceDetail.fenceShape === 0) {
      this.fencePolygon = new BMap.Circle(
        fenceSpecialJson.centerPoint,
        fenceSpecialJson.radius,
        { strokeColor: '#6099FF', strokeWeight: 2, strokeOpacity: 0.5 }
      );
      // 处理圆坐标
      pointView = fenceDetail.fencePolygon
        .replace('MULTIPOLYGON(((', '')
        .replace(')))', '')
        .split(',')
        .map((item: string) => {
          const values = item.split(' ');
          return {
            lng: Number(values[0]),
            lat: Number(values[1]),
          };
        });
    }
    // 多边形
    if (fenceDetail.fenceShape === 1) {
      fenceDetail.fencePoints[0].forEach((ele: any) => {
        pointArr.push(new BMap.Point(ele.lng, ele.lat));
      });
      // 创建多边形
      this.fencePolygon = new BMap.Polygon(pointArr, {
        strokeColor: '#6099FF',
        strokeWeight: 2,
        strokeOpacity: 0.5,
      });
      pointView = pointView.concat(this.fencePolygon.getPath());
      points = this.fencePolygon.getPath();
    }
    let adminPoint: any;
    // 行政区围栏
    if (fenceDetail.fenceShape === 2) {
      const bdary = new BMap.Boundary();
      // 获取行政区围栏的方法,因为数据已存储 所以我没有重新获取
      // bdary.get(fenceSpecialJson.administrative, (rs: any) => {
      fenceDetail.fencePoints.forEach((element: any, i: number) => {
        pointView = pointView.concat(element);
        this.fencePolygonArr[i] = new BMap.Polygon(element, {
          strokeColor: '#6099FF',
          strokeWeight: 2,
          strokeOpacity: 0.5,
        });
        this.map.addOverlay(this.fencePolygonArr[i]);

      });
      adminPoint = fenceDetail.fencePoints[0][0];
      this.map.setViewport(pointView);    // 调整视野
      if (!this.isPassedValue) {
        this.fencePop(fenceDetail, adminPoint);
      }
      // });
    }
    // 行政区围栏外的要逐个添加
    if (fenceDetail.fenceShape !== 2) {
      this.map.addOverlay(this.fencePolygon);
      this.map.setViewport(pointView);    // 调整视野 为避免异步,拆开
      this.fencePop(fenceDetail); // 围栏弹窗
    }
  }

圆:需要圆心、半径

Circle:Circle(圆心: Point, 半径: Number, opts: CircleOptions)
CircleOptions:strokeColor-圆形边线颜色 fillColor-圆形填充颜色 strokeOpacity-圆形边线透明度

多边形:需要点数组

Polygon:Polygon(points: Array, opts: PolygonOptions)

行政区 :

Boundary():创建行政区域搜索的对象实例
方法:get(name: String, callback: function) name: 查询省、直辖市、地级市、或县的名称 。回调返回行政区的 数组。再利用多边形的方法进行画围栏
上面的代码中因为数据已存储 所以我没有重新获取,因为行政区围栏有多个数组,所以我将起单独处理,单独添加

围栏添加、视野调整 :

this.map.addOverlay(围栏);
this.map.setViewport(点数组);
注:
因为行政区围栏有多个数组,所以我将起单独处理,单独添加,另外调整视野因为原来获取行政区围栏是通过Boundary获取的,会有异步效果,所以对行政区的视野调整进行了拆分。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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> ``` 现在我们已经实现了一个简单的搜索地点页面,它可以通过高德地图查询地点并在地图上展示出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值