ArcGIS for JS 绘制 圆弧

ArcGIS for JS 中并未提供绘制圆弧或是扇形的API,但在开发过程中又确实需要,在一番研究后找到了合适的方法生成圆弧。

1. 通过Circle生成圆弧

通过绘制 Circle 时,增加 numberOfPoints 参数,可以控制圆弧的精度,从而达到绘制圆弧的目的。

// 创建一个circle,并规定生成圆的点数 const circle = new Circle({ center: new Point({ longitude: 120.38, latitude: 36.06, }), geodesic: true, radius: 2000, numberOfPoints: 360, })

这样生成的圆,正好是360个点,也就是说,每隔1度生成一个点,圆弧无非是圆上的一部分,所以,我们只需要取出圆上的一部分点即可。

// 获取rings const rings = circle.rings[0] // 模拟圆弧其角度 const startAngle = 20 const endAngle = 80 // 生成圆弧的rings const arcRings = [[...rings.slice(startAngle, endAngle + 1), [120.38, 36.06]]]

这样,我们就得到了圆弧的 rings,接下来,就可以通过 Polygon 生成圆弧了。

// 创建一个graphic const graphic = new Graphic({ geometry: new Polygon({ rings: arcRings, }), symbol: new SimpleFillSymbol({ color: [255, 0, 0, 0.5], outline: { color: [255, 0, 0, 0.5], width: 2, }, }), }) // 添加扇形到地图 view.graphics.add(graphic)

特殊情况

起始角度较大,以至于结束角度大于了360度(或者说是结束角度较小,扇形朝上时),这时取点可能需要考虑分段取点,其实我们可以通过双倍取 Circlerings,然后取出我们需要的部分即可:

// 获取rings const rings = [...circle.rings[0], ...circle.rings[0]] // 模拟圆弧其角度 const startAngle = 320 const endAngle = 50 // 生成圆弧的rings const arcRings = [[...rings.slice(startAngle, endAngle + 1), [120.38, 36.06]]]

示例与源码

2. 通过自定义方法生成圆弧

自定义方法, 根据中心经纬度, 半径, 起始角度, 结束角度, 生成圆弧的方法如下:

/** * 生成圆弧的 rings * @param startAngle 开始角度 * @param endAngle 结束角度 * @param radius 半径 * @param center 圆心 */ function generateArc( startAngle: number, endAngle: number, radius: number, center: [number, number] ) { const pointNum: number = 100 const points: [number, number][] = [] let sin: number, cos: number, x: number, y: number, angle: number for (let i: number = 0; i <= pointNum; i++) { angle = startAngle + ((endAngle - startAngle) * i) / pointNum sin = Math.sin((angle * Math.PI) / 180) cos = Math.cos((angle * Math.PI) / 180) x = center[0] + radius * sin y = center[1] + radius * cos points.push([x, y]) } return [points] } // 示例用法 const arcRings = generateArc(0, 90, 1000, [120.38, 36.06]) // 创建一个graphic const graphic = new Graphic({ geometry: new Polygon({ rings: arcRings, }), symbol: new SimpleFillSymbol({ color: [255, 0, 0, 0.5], outline: { color: [255, 0, 0, 0.5], width: 2, }, }), }) // 添加扇形到地图 view.graphics.add(graphic)

注意事项

  • 生成的圆弧的点数越多,圆弧越平滑,但是性能越差,所以需要根据实际情况进行取舍。
  • 在正常创建的地图中,一般是3857也就是102100坐标系,改方法生成的圆弧是在4326坐标系下,因此其展示的时候为椭圆弧,你需要在创建地图时,指定坐标系为4326,但是一般地图均是在102100坐标系下,所以这种方法一般不适用于正常的地图,但是如果你的地图是在4326坐标系下,那么这种方法就可以使用了。

示例与源码