高德地图通过画面中的一个覆盖物设置图中心点和zoom

文章讲述了如何在JavaScript中计算地图上的覆盖物中心点,通过比较经纬度范围确定最大值和最小值,进而设置合适的地图缩放级别,确保覆盖物位于地图中央且不超出边界。
摘要由CSDN通过智能技术生成

需要将这个覆盖物置于地图中间且不超过地图边界的放至最大

计算覆盖物中心点,定为地图中心点

计算覆盖物的最大经纬度,和最小经纬度,测算出实际最长距离,根据距离与zoom对应关系设置zoom

function getAreaCenter(params, info) {
  let code = info.code
  if (!params.target) {
    return;
  }
  let PolygonPath = params.target.getPath();
  let PolygonArr = [];
  PolygonPath.forEach((item) => {
    let path = [item.KL, item.kT];
    PolygonArr.push(path);
  });
  let total = PolygonArr.length;
  if (total <= 0) {
    return;
  }
  let X = 0;
  let Y = 0;
  let Z = 0;
  PolygonArr.forEach((lnglat) => {
    let lng = (lnglat[0] * Math.PI) / 180;
    let lat = (lnglat[1] * Math.PI) / 180;
    let x, y, z;
    x = Math.cos(lat) * Math.cos(lng);
    y = Math.cos(lat) * Math.sin(lng);
    z = Math.sin(lat);
    X += x;
    Y += y;
    Z += z;
  });
  X = X / total;
  Y = Y / total;
  Z = Z / total;

  let Lng = Math.atan2(Y, X);
  let Hyp = Math.sqrt(X * X + Y * Y);
  let Lat = Math.atan2(Z, Hyp);
  
  let center = [(Lng * 180) / Math.PI, (Lat * 180) / Math.PI];
 let maxL = Math.max(...PolygonArr.map(item=> item[0]))
 let minL = Math.min(...PolygonArr.map(item=> item[0]))
 let maxK = Math.max(...PolygonArr.map(item=> item[1]))
 let minK = Math.min(...PolygonArr.map(item=> item[1]))
 let p1 = [maxL,maxK]
 let p2 = [minL,minK]
 let dis = AMap.GeometryUtil.distance(p1, p2);
let zoom = 12
  let zooms = [[10000,11,],
	[5000,12,],
	[2000,15,],
	[1000,16,],
  [600,16.5,],
	[500,17,],
	[200,18,],
	[100,19,],
	[50,20,],
	[15,21,],
	[10,22,]]
	for(let i = 0;i<zooms.length;i++){
    let item = zooms[i]
    if(dis>item[0]){
      zoom = item[1]
  break
 }
  }
  map.setZoomAndCenter(zoom, center);
}

高德地图API,当你添加自定义片作为覆盖物(Marker或Polygon等)时,如果直接设置经纬度可能会因为片的原始尺寸比例不匹配地的投影而发生变形。这是因为地会根据地理位置进行缩放和投影变换,使得地球表面的经纬度在屏幕上的展现并不一定是按照直角坐标显示。 解决这个问题的一般步骤是: 1. **获取正确的大小**:你需要在添加覆盖物之前,根据地的当前视范围和覆盖物的位置计算出合适的片大小。这通常涉及到地的视野比例、像素密度以及地理坐标到屏幕坐标的转换。 2. **调整片的Anchor Point**:在设置覆盖物时,可以指定片的anchor point(中心点),让片的某个固定位置对齐到经纬度上,而不是片的左上角。 3. **使用BitmapDescriptorFactory**:高德提供了一个工具类BitmapDescriptorFactory,你可以用它来创建带有自定义片的标记,并可以设置片的缩放级别和旋转角度,有助于保持片的相对形状。 ```java // 示例代码 BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.drawable.your_image); LatLng latLng = new LatLng(latitude, longitude); LatLngBounds bounds = ...; // 根据地获取合理的bounds MapView mapView = ...; int zoomLevel = ...; // 地的缩放级别 BitmapDescriptor scaledDescriptor = descriptor.createScaledBitmapDescriptor(mapView, bounds.getWidth(), bounds.getHeight(), zoomLevel); marker.setDescriptor(scaledDescriptor); ``` 记得要在适当时机调用`setRotation`或`setScale`方法来处理片的旋转和平移。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值