我需要为以下输入创建图钉。
var Countries = ["Austria", "Brazil", "India", "Germany", "USA", "Malaysia"];
Microsoft.Maps.SpatialDataService.GeoDataAPIManager.getBoundary(Countries, geoDataRequestOptions, map,
(data) => {
var value = data.location;
if (data.results.length > 0 && data.results[0].Polygons !== null) {
var polygons = data.results[0].Polygons;
var dataBounds = Microsoft.Maps.LocationRect.fromShapes(data.results[0].Polygons);
var loc = new Microsoft.Maps.Location(dataBounds.center.latitude, dataBounds.center.longitude);
var pin = new Microsoft.Maps.Pushpin(loc, {
icon: svgIcon,
anchor: new Microsoft.Maps.Point(20 / 2, 20 / 2)
});
map.entities.push(pin);
locs.push(pin);
map.setView({ bounds: Microsoft.Maps.LocationRect.fromLocations(locs), padding: 80 });
}
});
}, 3000);
我使用GeoDataAPIManager来获得边界多边形,并获得多边形的中心来生成图钉。但是当装载像马来西亚或美国这样的国家时,图钉被放置在海中,因为getboundary()
返回多个多边形,并且获得多边形的中心返回两个边界之间的中心,从而导致图钉放置在海中。
让我知道是否有任何其他方法来创建图钉或获得多边形的中心。
我已经尝试了spatial.Math
模块来获得中心。
在处理多边形时,这是一种常见的情况,因为它们的形状可能是这样的,它们的中心不在实际几何形状内。有几种不同的方法可以做到这一点。
方法1:此方法将返回到离计算中心最近的点,该点位于多边形的边缘。
- 使用数学库或使用边界框中心计算质心/中心
- 检查点是否与多边形相交,如果不相交,计算多边形边缘上最近的点(最短距离),然后使用该点作为中心。
方法二:只关注最大的多边形
- 如果几何体是MultiPolygon,计算面积并抓取面积最大的多边形。对于美国,这将为您提供大陆的多边形,这可能是所需的。
- 尝试方法1,仅使用最大的多边形。
方法3:尝试使用外部库计算视觉中心。
- 将多边形转换为GeoJSON使用GeoJSON模块在Bing地图:https://www.bing.com/api/maps/sdkrelease/mapcontrol/isdk/geojsonwritetogeojson
- 将geojson几何体传入此库以计算视觉中心。https://github.com/mapbox/polylabel