使用JSTS时缓冲区宽度不一致问题求助
问题说明
目标是为给定多边形生成宽度为N米的内带,原本方案是用JSTS的Buffer功能,通过原始多边形减去内部缓冲多边形得到内带,但实际生成的缓冲多边形和原多边形的宽度不一致——示意图显示部分区域缓冲宽度明显小于设定值,边缘宽度不均。
相关代码实现:
import GeoJSONWriter from "jsts/org/locationtech/jts/io/GeoJSONWriter"; import GeoJSONReader from "jsts/org/locationtech/jts/io/GeoJSONReader"; import { BufferOp } from "jsts/org/locationtech/jts/operation/buffer"; function getOffsetPolygonJSTS( poly: Feature<Polygon>, offsetSize: number ): Feature<Polygon> { const geoReader = new GeoJSONReader(); const geoWriter = new GeoJSONWriter(); const geometry = geoReader.read(poly.geometry); // 硬编码偏移量,未使用传入的offsetSize参数 const res = BufferOp.bufferOp(geometry, -0.0001); const jstsBuffer = geoWriter.write(res); return polygon(jstsBuffer.coordinates); }
问题原因及解决思路
- 坐标单位不匹配:JSTS的Buffer操作默认采用几何本身的坐标单位,如果你的多边形是经纬度(WGS84,单位为度),直接传入米数作为偏移量会完全错误——1度约等于111公里,代码里的-0.0001度对应的实际距离远小于1米,自然会出现宽度不一致的问题。
- 硬编码偏移量:代码里直接写死了
-0.0001,没有使用传入的offsetSize参数,根本无法按指定的N米生成缓冲。 - 修正方案:
- 先将经纬度坐标转换为平面坐标系(如Web墨卡托EPSG:3857,单位为米),确保缓冲操作的单位正确。
- 使用传入的
offsetSize作为缓冲距离(内缓冲用负值)。 - 缓冲完成后再将坐标转换回原经纬度坐标系。
示例修正代码(结合Turf.js做坐标转换):
import GeoJSONWriter from "jsts/org/locationtech/jts/io/GeoJSONWriter"; import GeoJSONReader from "jsts/org/locationtech/jts/io/GeoJSONReader"; import { BufferOp } from "jsts/org/locationtech/jts/operation/buffer"; import { toWgs84, toMercator } from "@turf/projection"; function getOffsetPolygonJSTS( poly: Feature<Polygon>, offsetSize: number ): Feature<Polygon> { // 转换为Web墨卡托坐标系(单位:米) const mercatorPoly = toMercator(poly); const geoReader = new GeoJSONReader(); const geoWriter = new GeoJSONWriter(); const geometry = geoReader.read(mercatorPoly.geometry); // 使用传入的offsetSize执行内缓冲 const res = BufferOp.bufferOp(geometry, -offsetSize); const jstsBuffer = geoWriter.write(res); // 转换回WGS84经纬度坐标系 const wgs84Buffer = toWgs84(polygon(jstsBuffer.coordinates)); return wgs84Buffer; }
内容的提问来源于stack exchange,提问作者Sigma
相关产品推荐
相关产品推荐

