将长坐标和纬度坐标划分为子坐标(较小的正方形)?

Posted

技术标签:

【中文标题】将长坐标和纬度坐标划分为子坐标(较小的正方形)?【英文标题】:Dividing long and lat coordinates into sub-coordinates(smaller squares)? 【发布时间】:2021-04-29 20:30:12 【问题描述】:

我有一个矩形的 2 个长纬度点(左下角和右上角),我想根据我已经拥有的基本区域(长纬度)将这个矩形分成较小的点。我已经知道,我无法处理以米和公里为单位测量的距离,而是以近似地球表面形状的度数来处理长度和纬度。

所取的点是由带有 4326 SRID 的传单提取的,原始点也是如此。我需要“小方格”的中心或经纬度坐标。

例如,这是我的基本矩形24.639567,46.782406 24.641452,46.785413,对于矩形,我想分割24.584749,46.612782 24.603323,46.653809

【问题讨论】:

【参考方案1】:

首先,让我们把你的两个点变成一个传单边界对象:

const bounds - L.latLngBounds(point1, point2)

现在让我们选择一个样本间隔,这意味着有多少子矩形跨越边界的宽度和高度。例如,10 的采样大小将给出 100 个子矩形 (10 x 10),但如果您的子矩形不需要与主边界相同的纵横比,您可以选择两个单独的采样间隔(一个用于x 和一个 y)

const samplingInterval = 10 // easy to change

为了正确插入主边界,我们将抓取它的角,以及以经度为单位的宽度和以纬度为单位的高度,称为 dLat 和 dLng(用于 delta):

const sw = bounds.getSouthWest();
const nw = bounds.getNorthWest();
const ne = bounds.getNorthEast();

const dLat = ne.lat - sw.lat;
const dLng = ne.lng - nw.lng;

现在我们可以构建一个从原始边界外推的新边界数组:

let subBounds = [];

for (let i = 0; i < samplingInterval - 1; i++)
  for (let j = 1; j < samplingInterval; j++)
    const corner1 = [
      sw.lat + (dLat * i) / samplingInterval,
      sw.lng + (dLng * j) / samplingInterval
    ];
    const corner2 = [
      sw.lat + (dLat * (i + 1)) / samplingInterval,
      sw.lng + (dLng * (j + 1)) / samplingInterval
    ];
    subBounds.push(L.latLngBounds(corner1, corner2));
  

现在要获取这些边界的中心,您可以在它们上调用.getCenter()

const centerPoints = subBounds.map(bounds => bounds.getCenter());

Working codesandbox

【讨论】:

以上是关于将长坐标和纬度坐标划分为子坐标(较小的正方形)?的主要内容,如果未能解决你的问题,请参考以下文章

怎样将gps wgs-84坐标系转换为其他坐标系

经纬度转换XY地理坐标,急谢

高斯坐标转换中的“三度带投影”“六度带投影”是啥意思?干啥用的?怎么用?

经纬度转换大地坐标????

如何将WGS84坐标转换成经纬度坐标

高德地图画正六边形