单张+草皮奇怪的squareGrid行为

时间:2019-04-29 10:23:26

标签: leaflet coordinates gis turfjs

经过一周的测试和研究,我决定“放弃”并请大家寻求帮助。

我要完成的工作相当简单。

  • 获取世界地图并将其分为4个象限(完成)
  • 获取每个象限,并使用草皮计算包含N个单位的正方形。

在前两个象限中一切正常:A(红色),B(绿色)

enter image description here

实际上,如果我随后尝试使用草皮用正方形填充前两个象限,则结果是正确的:

enter image description here

问题是,当尝试在下面的正方形上复制相同的逻辑时,草皮返回0个正方形...

使用 Leaflet 创建四个象限的代码如下:

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

我也了解到 Leaflet 通过使用[LAT,LON]而不是[LON,LAT]来反转标准GeoJSON坐标位置,所以我也尝试过反转结果 Leaflet 的示例通过在坐标数组上执行reverse生成了GeoJSON,但仍然没有执行任何操作。

我想知道我在哪里错了?这是“环状”坐标的问题吗?是由于Leaflet和Turf之间的伪造转换造成的问题吗?是我傻吗?请帮助我。

1 个答案:

答案 0 :(得分:0)

我的解决方案

最终,我采用了另一种策略。很简单的TBH。 我创建了一个多边形,它是“要映射的区域”。然后将此多边形分为几个子正方形多边形。然后,每个正方形都可以用作单独的“平铺”。 使用@turf/square-grid@turf/bbox可以很容易地做到这一点, 该代码全部封装在2个函数中:

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);
}