Leaflet 传单+;草坪奇怪的网格行为

Leaflet 传单+;草坪奇怪的网格行为,leaflet,coordinates,gis,turfjs,Leaflet,Coordinates,Gis,Turfjs,经过一周的测试和研究,我决定“放弃”,向你们寻求帮助 我想完成的事情相当容易 把世界地图分成4个象限(完成) 取每个象限,并使用turf计算包含N个单位的正方形数 在前两个象限中一切正常:A(红色),B(绿色) 事实上,如果我尝试使用turf用正方形填充前两个象限,结果是正确的: 问题是,当尝试在下面的方块上复制相同的逻辑时,turf返回0个方块 用于创建带有传单的4个象限的代码如下所示: const quadrantA = L.rectangle(L.latLngBounds(L.la

经过一周的测试和研究,我决定“放弃”,向你们寻求帮助

我想完成的事情相当容易

  • 把世界地图分成4个象限(完成)
  • 取每个象限,并使用turf计算包含N个单位的正方形数
在前两个象限中一切正常:A(红色),B(绿色)

事实上,如果我尝试使用turf用正方形填充前两个象限,结果是正确的:

问题是,当尝试在下面的方块上复制相同的逻辑时,turf返回0个方块

用于创建带有传单的4个象限的代码如下所示:

const quadrantA = L.rectangle(L.latLngBounds(L.latLng(90, -180), L.latLng(0, 0)), { weight: 1, fillColor: 'red', color: 'red' });
const quadrantB = L.rectangle(L.latLngBounds(L.latLng(90, 0), L.latLng(0, +180)), { weight: 1, fillColor: 'green', color: 'green' });
const quadrantC = L.rectangle(L.latLngBounds(L.latLng(0, -180), L.latLng(-90, 0)), { weight: 1, fillColor: 'blue', color: 'blue' });
const quadrantD = L.rectangle(L.latLngBounds(L.latLng(0, 0), L.latLng(-90, 180)), { weight: 1, fillColor: 'yellow', color: 'yellow' });

quadrantA.addTo(this.map);
quadrantB.addTo(this.map);
quadrantC.addTo(this.map);
quadrantD.addTo(this.map);
const QGrid_A = turf.squareGrid(turf.bbox(quadrantA.toGeoJSON()), 500, { units: 'kilometers' });
const QGrid_B = turf.squareGrid(turf.bbox(quadrantB.toGeoJSON()), 500, { units: 'kilometers' });
const QGrid_C = turf.squareGrid(turf.bbox(quadrantC.toGeoJSON()), 500, { units: 'kilometers' });
const QGrid_D = turf.squareGrid(turf.bbox(quadrantD.toGeoJSON()), 500, { units: 'kilometers' });
同时,使用turf计算每个象限中的正方形的代码如下:

const quadrantA = L.rectangle(L.latLngBounds(L.latLng(90, -180), L.latLng(0, 0)), { weight: 1, fillColor: 'red', color: 'red' });
const quadrantB = L.rectangle(L.latLngBounds(L.latLng(90, 0), L.latLng(0, +180)), { weight: 1, fillColor: 'green', color: 'green' });
const quadrantC = L.rectangle(L.latLngBounds(L.latLng(0, -180), L.latLng(-90, 0)), { weight: 1, fillColor: 'blue', color: 'blue' });
const quadrantD = L.rectangle(L.latLngBounds(L.latLng(0, 0), L.latLng(-90, 180)), { weight: 1, fillColor: 'yellow', color: 'yellow' });

quadrantA.addTo(this.map);
quadrantB.addTo(this.map);
quadrantC.addTo(this.map);
quadrantD.addTo(this.map);
const QGrid_A = turf.squareGrid(turf.bbox(quadrantA.toGeoJSON()), 500, { units: 'kilometers' });
const QGrid_B = turf.squareGrid(turf.bbox(quadrantB.toGeoJSON()), 500, { units: 'kilometers' });
const QGrid_C = turf.squareGrid(turf.bbox(quadrantC.toGeoJSON()), 500, { units: 'kilometers' });
const QGrid_D = turf.squareGrid(turf.bbox(quadrantD.toGeoJSON()), 500, { units: 'kilometers' });
问题是,“第二轮”计算对象限C和D总是返回0个特征

QGrid_A功能:800

QGrid_B功能:800

QGrid_C功能:0

QGrid_D功能:0

我还了解到传单通过使用[LAT,LON]而不是[LON,LAT]来反转标准GeoJSON坐标位置,因此我还尝试通过在坐标数组上执行
反转
来反转传单生成的GeoJSON的结果,但仍然没有

我不知道我哪里错了?这是一个“循环”坐标的问题吗?这是因为传单和草皮之间的错误转换造成的问题吗?是我傻吗?伙计们,请帮帮我。

我的解决方案 最后,我采取了另一种策略。非常简单。 我已经创建了一个多边形,它是“要映射的区域”。然后将该多边形拆分为多个子正方形多边形。然后,每个正方形都可以用作单独的“瓷砖”。 使用
@turp/square grid
@turp/bbox
实现这一点非常简单, 这方面的代码都包含在两个函数中:

export interface ISplitAreaInSubareasConf {
    squareCellSide?: number;
    units?: `meters` | `kilometers`;
}

private splitAreaToMapInSubAreas(areaToMap: Polygon, opts?: ISplitAreaInSubareasConf): BBox[] {
    const units = opts && opts.units ? opts.units : this.SQUARE_UNIT;
    const side = opts && opts.squareCellSide ? opts.squareCellSide : this.SQUARE_CELL_SIDE_IN_KM;

    const grid = turfSquareGrid.default(this.getAreaToMapBBox(areaToMap), side, {units, mask: areaToMap});

    return grid.features.map(feat => this.getAreaToMapBBox(feat.geometry));
}

private getAreaToMapBBox(areaToMap: Polygon) {
    return bbox.default(areaToMap);
}

你解决问题了吗?如果是,你可以分享你的经验嘿@Travnikov我刚刚发布了我的解决方案。希望能有帮助。如果您需要更多详细信息,请询问;)