获取不规则多边形中心点

尝试了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('无随机点')
      }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值