经过一周的测试和研究,我决定“放弃”并请大家寻求帮助。
我要完成的工作相当简单。
在前两个象限中一切正常:A(红色),B(绿色)
实际上,如果我随后尝试使用草皮用正方形填充前两个象限,则结果是正确的:
问题是,当尝试在下面的正方形上复制相同的逻辑时,草皮返回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之间的伪造转换造成的问题吗?是我傻吗?请帮助我。
答案 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);
}