【问题标题】:Leaflet + Turf strange squareGrid behaviourLeaflet + Turf 奇怪的 squareGrid 行为
【发布时间】:2019-04-29 10:23:25
【问题描述】:

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

我想要完成的事情相当容易。

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

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

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

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

Leaflet创建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);

同时,用 turf 计算每个象限中的正方形的代码如下:

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

问题是,“第二轮”计算总是返回 0 个象限 C 和 D 的特征。

QGrid_A 特征:800

QGrid_B 特征:800

QGrid_C 特征:0

QGrid_D 特征:0

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

我想知道我哪里错了?这是“循环”坐标的问题吗?由于 Leaflet 和 Turf 之间的虚假转换,这是一个问题吗?是我笨吗?请帮帮我。

【问题讨论】:

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

标签: leaflet coordinates gis turfjs


【解决方案1】:

我的解决方案

最终,我采用了另一种策略。很简单。 我创建了一个多边形,它是“要映射的区域”。然后这个多边形被分成几个子正方形多边形。然后每个正方形都可以用作单独的“瓷砖”。 使用@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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    相关资源
    最近更新 更多