当前位置: 首页 > 知识库问答 >
问题:

必应地图V8读取GeoJson查找质心并添加图钉

慕嘉运
2023-03-14

下面是我的GeoJson代码来读取文件并在必应地图上显示数据层。我想为GeoJson函数中的每个多边形/多边形找到质心,并为每个质心添加图钉。

当我尝试使用shapes[I].getCenter()查找中心时,它会抛出错误“shapes[I].getCenter不是函数”。

如何从文件中读取GeoJson时找到质心并添加pin?

import { ViewContainerRef, Component, ElementRef, OnInit, ViewChild, NgZone } from '@angular/core';
import { Router } from '@angular/router';
import { MapService } from '../../services/map.service';
import { CookieService } from 'ngx-cookie';
import { Config } from '../../config/config';
import { CommonUtils } from './../../shared/CommonUtils';
import { fail, throws } from 'assert';
import { Toast, ToastsManager } from 'ng2-toastr/ng2-toastr';
import { OnDestroy } from '@angular/core/src/metadata/lifecycle_hooks';
import { DeviceDetectorService } from 'ngx-device-detector';

declare const Microsoft: any;

@Component({
  selector: 'app-map',
  templateUrl: './map.component.html',
  styleUrls: ['./map.component.scss']
})

export class MapComponent implements OnInit, OnDestroy {
  map: any;
  infobox: any;
  dataLayer: any;
  heatGradientData: any;

  @ViewChild('mapElement') someInput: ElementRef;
  myMap = document.querySelector('#myMap');

  constructor(private mapService: MapService,
    private router: Router, private config: Config,
    private utils: CommonUtils,
    private cookieService: CookieService,
    public toastr: ToastsManager, vRef: ViewContainerRef,
    private deviceService: DeviceDetectorService,
    private zone: NgZone) {
    this.toastr.setRootViewContainerRef(vRef);
  }

  ngOnInit() {

    if (document.readyState != 'complete') {
      document.onreadystatechange = () => {
        if (document.readyState === 'complete') {
          this.loadMapView(this.config.getConstants('mapTypeRoad'));
        } else {
          this.ngOnInit();
        }
      }
    } else {
      if (document.readyState === 'complete') {
        this.loadMapView(this.config.getConstants('mapTypeRoad'));
      }
    }

  }

  loadMapView(type: String) {

    var location = new Microsoft.Maps.Location(53.32, -110.29);

    this.map = new Microsoft.Maps.Map(document.getElementById('myMap'), {
      credentials: this.config.get('BingMapKey'),
      center: location,
      mapTypeId: type == this.config.getConstants('mapTypeSatellite') ? Microsoft.Maps.MapTypeId.aerial : Microsoft.Maps.MapTypeId.road,
      zoom: 4,
      liteMode: true,
      enableClickableLogo: false,
      showLogo: false,
      showTermsLink: false,
      showMapTypeSelector: false,
      showTrafficButton: true,
      enableSearchLogo: false,
      showCopyright: false
    });

    //Store some metadata with the pushpin
    this.infobox = new Microsoft.Maps.Infobox(this.map.getCenter(), {
      visible: false
    });

    this.infobox.setMap(this.map);

    // Load the Spatial Math module.
    Microsoft.Maps.loadModule(['Microsoft.Maps.GeoJson'], function () { });

    // Create a layer to load pushpins to.
    // this.dataLayer = new Microsoft.Maps.EntityCollection();

    //Create a layer to add the GeoJSON data to.
    this.dataLayer = new Microsoft.Maps.Layer();
    this.map.layers.insert(this.dataLayer);

    //Add click event to the layer.
    //Microsoft.Maps.Events.addHandler(this.dataLayer, 'click', this.showInfobox);

    this.ReadGeoJson();

  }

  ReadGeoJson() {

    var self = this;

    //Load the GeoJSON module and read the GeoJSON feed.
    Microsoft.Maps.loadModule('Microsoft.Maps.GeoJson', function () {
      Microsoft.Maps.GeoJson.readFromUrl('../../assets/US_County_Boundaries.js', function (shapes) {
        //Add shapes to the layer.
        for (var i = 0, len = shapes.length; i < len; i++) {

          //Create custom Pushpin using an SVG string.
          // var pin = new Microsoft.Maps.Pushpin(shapes[i].getCenter(), {
          //   icon: '<svg xmlns="http://www.w3.org/2000/svg" width="30" height="30"><circle cx="15" cy="15" r="13" stroke="black" stroke-width="2" fill="{color}"/><text x="15" y="20" text-anchor="middle">{text}</text></svg>',
          //   color: 'yellow',
          //   text: '1',
          //   anchor: new Microsoft.Maps.Point(20, 20)
          // });

          // //Add the pushpin to the map.
          // self.map.entities.push(pin);
          Microsoft.Maps.Events.addHandler(shapes[i], 'click', showInfobox);
        }

        self.dataLayer.add(shapes);

        function showInfobox(e) {
          var shape = e.target;
          var loc = e.location; //Default to the location of the mouse event to show the infobox.

          //If the shape is a pushpin, use it's location to display the infobox.
          if (shape instanceof Microsoft.Maps.Pushpin) {
            loc = shape.getLocation();
          }
          //Display the infoboc
          self.infobox.setOptions({ location: loc, title: shape.metadata.NAME, visible: true });
        }
      });
    });
  }

  ngOnDestroy() {

  }

}

共有1个答案

聂永怡
2023-03-14

Centroid方法位于SpatialMath模块中,因此首先需要像使用GeoJSON那样加载它:

microsoft.maps.loadModule([“microsoft.maps.geojson”,“microsoft.maps.spatialmath”],function(){...});

然后在回调函数中,可以使用microsoft.maps.spatialmath.geometry.centroid(shapes[i])获取质心位置。

 类似资料:
  • 我正在使用Bing Maps v8 API,试图将我自己的GeoJSON加载到Bing Maps上,如本例所示:https://www.Bing.com/API/Maps/sdkrelease/mapcontrol/isdk#GeoJSONReadObject+js 我正在成功地创建我的JSON(我已经使用Bing Maps拖放特性测试了它,并且我的所有点都显示在Map.https://bingm

  • 我是React Native的新手,但我想做的是移植到我的反应应用程序上,该应用程序以地图为中心。通常情况下,我可以直接加载Geojson文件到谷歌地图的数据层,但是我如何在反应本地地图中做到这一点呢?另外,每当Geojson被加载时,我可以附加一个事件监听器,当你点击该区域时触发一些东西,这是如何在RN中完成的。(下面的反应代码) 我尝试过使用(多边形),但Geojson中的坐标格式彼此之间并不

  • 我使用React-Leaflet显示Leaflet.js地图。我使用React-Leaflet GeoJSON(这里的来源)在地图上显示一个多边形层。 虽然我可以改变多边形填充()的不透明度,但我找不到用图案(如方格、条纹等)填充多边形的选项 我发现了一个项目(Leaflet.pattern),它支持将填充模式添加到形状,但是它还没有被修改为与一起使用。 所以我的问题是:我如何向形状中添加模式,或

  • 我一直在阅读GoogleMapsJSAPI的文档,我无法理解这一点。我想将geojson文件加载到地图,以便它可以显示所有标记,但在文档(如下所示)中,它使用url。除了使用本地文件(使用我自己的geojson)之外,我如何做同样的事情? 这是GoogleAPI文档 这是我的geojson。根据控制台,错误出现在“类型”:“FeatureCollection”(the):) 控制台错误 控制台错误

  • 问题内容: 我正在尝试使用地图和这些地图的切片来存储从数据库查询返回的行。但是我在row.Next()以及最终的每次迭代中得到的都是查询中同一行的切片。似乎问题与我存储的存储位置相同有关,但直到现在我仍无法解决。 我在这里想念的是什么: 源代码如下: 问题答案: 这是因为您存储在切片中的是指向地图的指针,而不是地图的副本。 从实际运行的Go地图中: 地图类型是引用类型,例如指针或切片… 由于您是在