尝试了3种方法,都失败了!
第一种:turf.js
let pts = path.map(it => {
return [it.lng, it.lat]
})
console.info('pts:', pts)
var features = turf.points(pts);
console.info('features:', features)
var center = turf.center(features);
console.info('center:', center)
let pt = center.geometry.coordinates
console.info('pt:', pt)
第二种:leaflet的方法
var i, j, p1, p2, f, area, x, y, center;
var centroidLatLng = new AMap.LngLat(0, 0);
let nw = bounds.getNorthWest()
console.info('nw:::', nw)
var areaBounds = bounds.getNorthWest().distance(bounds.getSouthWest()) * bounds.getNorthEast().distance(bounds.getNorthWest())
console.info('areaBounds:::', areaBounds)
if (areaBounds < 1700) {
// getting a inexact center, to move the latlngs near to [0, 0] to prevent rounding errors
centroidLatLng = centroid(latlngs);
}
var len = latlngs.length;
var points = [];
for (i = 0; i < len; i++) {
var latlng = latlngs[i];
points.push(new AMap.LngLat(latlng.lng - centroidLatLng.lng, latlng.lat - centroidLatLng.lat));
}
console.info('points:::', points)
area = x = y = 0;
for (i = 0, j = len - 1; i < len; j = i++) {
p1 = points[i];
p2 = points[j];
f = p1.lat * p2.lng - p2.lat * p1.lng;
console.info('ppppp:::', p1, p2)
console.info('fffffff:::', f)
x += (p1.lng + p2.lng) * f;
y += (p1.lat + p2.lat) * f;
area += f * 3;
console.info('areayy:::', area)
}
console.info('area:::', area)
if (area === 0) {
// Polygon is so small that all points are on same pixel.
center = points[0];
} else {
center = [x / area, y / area];
}
console.info('center:::', center)
console.info('centroidLatLng:::', centroidLatLng)
var latlngCenter = new AMap.LngLat(center[0], center[1])
return {
x: latlngCenter.lng + centroidLatLng.lng,
y: latlngCenter.lat + centroidLatLng.lat
}
第三种:网上找的方法(utils.js · 大话主-席/js-polygon-algorithm - Gitee.com)
if (!Array.isArray(points) || points.length < 3) {
console.error("多边形坐标集合不能少于3个");
return;
}
const result = { x: 0, y: 0 };
let area = 0;
for (let i = 1; i <= points.length; i++) {
const curX = points[i % points.length].lng;
const curY = points[i % points.length].lat;
const nextX = points[i - 1].lng;
const nextY = points[i - 1].lat;
const temp = (curX * nextY - curY * nextX) / 2;
area += temp;
result.x += (temp * (curX + nextX)) / 3;
result.y += (temp * (curY + nextY)) / 3;
}
result.x /= area;
result.y /= area;
return result;
随机点:
以上三种都失败了,放弃,换成随机点。先随机100个,选一个。要随机点更接近中心的,从100个点里面去比较吧,这里就不写了
if (markerObj) map.remove(markerObj)
let bounds = polygon.getBounds()
console.info('bounds::', bounds)
var sw = bounds.getSouthWest();
var ne = bounds.getNorthEast();
var minlng = sw.lng;
var minlat = sw.lat;
var maxlng = ne.lng;
var maxlat = ne.lat;
//随机生成一个矩形范围内的点;
var points = turf.randomPoint(100, { bbox: [minlng, minlat, maxlng, maxlat] });
console.info('points:::', points);
let coords = points.features.map(it => it.geometry.coordinates)
console.info('coords:::', coords);
let pt = null
for (let i = 0; i < coords.length; i++) {
let it = coords[i]
let lnglat = new AMap.LngLat(it[0], it[1])
if (polygon.contains(lnglat)) {
pt = lnglat
break
}
}
console.info('pt:::', pt);
if (pt) {
markerObj = new AMap.Circle({
center: pt,
radius: 10
})
map.add(markerObj)
} else {
console.error('无随机点')
}