将长坐标和纬度坐标划分为子坐标(较小的正方形)?
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
【讨论】:
以上是关于将长坐标和纬度坐标划分为子坐标(较小的正方形)?的主要内容,如果未能解决你的问题,请参考以下文章