diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3574e5c..1ee85cd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,27 @@
+## 0.0.6
+
+---
+
+#### ✨ New Features
+
+- 新增: 绘制扇形
+
+- 新增: 根据数据回显图形
+
+- 新增: 获取图形关键点位方法:`getPoints`
+
+
+#### 🐞 Bug fixes
+
+- 修复:绘制过程中临时创建的线没有被删除的问题
+
+- 修复:双击控制点导致图形无法拖拽的问题
+
+- 修复:双箭头执行生长动画后,编辑状态无法拖拽的问题
+
+- 修复:双箭头整体被拖拽后生长动画路径不正确的问题
+
+
 ## 0.0.5
 
 ---
diff --git a/README.md b/README.md
index 6352703..52b33ec 100644
--- a/README.md
+++ b/README.md
@@ -57,6 +57,7 @@ import CesiumPlot from 'cesium-plot-js';
 | Reactangle             | 'polygon' | 矩形             | ❌       |
 | Triangle               | 'polygon' | 三角形           | ❌       |
 | Circle                 | 'polygon' | 圆形             | ❌       |
+| Sector                 | 'polygon' | 扇形             | ❌       |
 | StraightArrow          | 'line'    | 细直箭头         | ✔️       |
 | CurvedArrow            | 'line'    | 曲线箭头         | ✔️       |
 | FineArrow              | 'polygon' | 直箭头           | ✔️       |
@@ -119,6 +120,7 @@ const geometry = new CesiumPlot.FineArrow(Cesium, viewer, {
 | hide                 | options?: [AnimationOpts](#AnimationOpts)                             | 隐藏,options 可配置动画参数,参数缺省时,不显示动画 |
 | show                 | options?: [AnimationOpts](#AnimationOpts)                             | 显示,options 可配置动画参数,参数缺省时,不显示动画 |
 | startGrowthAnimation | options?: [AnimationOpts](#AnimationOpts)                             | 生长动画,options 可配置动画参数                     |
+| getPoints            |                                                                       | 获取图形关键点位                                     |
 | remove               |                                                                       | 删除                                                 |
 | on                   | (event: [EventType](#EventType), listener: (eventData?: any) => void) | 绑定事件                                             |
 | off                  | (event: [EventType](#EventType))                                      | 解绑事件                                             |
@@ -145,6 +147,22 @@ geometry.on('drawEnd', (data)=>{
 });
 ```
 
+### 静态方法
+
+**CesiumPlot.createGeometryFromData(cesium: Cesium, viewer: Cesium.Viewer, options:[CreateGeometryFromDataOpts](#CreateGeometryFromDataOpts))**
+
+根据图形的关键点位重新生成图形
+
+<h5 id='CreateGeometryFromDataOpts'>CreateGeometryFromDataOpts参数类型</h5>
+
+```
+{
+  type: 'FineArrow'|'AttackArrow'|'SwallowtailAttackArrow'|'SquadCombat'|'SwallowtailSquadCombat'|'StraightArrow'|'CurvedArrow'|'AssaultDirection'|'DoubleArrow'|'FreehandLine'|'FreehandPolygon'|'Curve'|'Ellipse'|'Lune'|'Reactangle'|'Triangle'|'Polygon'|'Circle'|'Sector', // 图形类型
+  cartesianPoints: Cesium.Cartesian3[], // 图形关键点位,可通过实例方法getPoints或者drawEnd事件获得
+  style?: PolygonStyle | LineStyle // 样式
+}
+```
+
 <h3 id='EventType'>Events</h3>
 
 - **drawStart**
diff --git a/debug/index.ts b/debug/index.ts
index 24a3f54..69153ef 100644
--- a/debug/index.ts
+++ b/debug/index.ts
@@ -29,6 +29,7 @@ viewer.scene.camera.setView({
 });
 
 let geometry: any;
+let geometryType: string;
 const dragStartHandler = () => {
   console.error('start');
 };
@@ -50,85 +51,19 @@ const editEndHandler = (geometryPoints: any) => {
 
 const buttonGroup = document.getElementById('button-group') as HTMLElement;
 buttonGroup.onclick = (evt) => {
+  const targetElement = evt.target as HTMLElement;
+  geometryType = targetElement.id;
+  geometry = new CesiumPlot[geometryType](Cesium, viewer, {
+    material: Cesium.Color.fromCssColorString('rgba(59, 178, 208, 0.5)'),
+    outlineMaterial: Cesium.Color.fromCssColorString('rgba(59, 178, 208, 1)'),
+    outlineWidth: 3,
+  });
+};
+
+const operationButtonGroup = document.getElementById('operation-button-group') as HTMLElement;
+operationButtonGroup.onclick = (evt) => {
   const targetElement = evt.target as HTMLElement;
   switch (targetElement.id) {
-    case 'drawCircle':
-      geometry = new CesiumPlot.Circle(Cesium, viewer);
-      break;
-    case 'drawPolygon':
-      geometry = new CesiumPlot.Polygon(Cesium, viewer);
-      break;
-    case 'drawReactangle':
-      geometry = new CesiumPlot.Reactangle(Cesium, viewer);
-      break;
-    case 'drawTriangle':
-      geometry = new CesiumPlot.Triangle(Cesium, viewer);
-      break;
-    case 'drawFineArrow':
-      geometry = new CesiumPlot.FineArrow(Cesium, viewer, {
-        material: Cesium.Color.fromCssColorString('rgba(59, 178, 208, 0.5)'),
-        outlineMaterial: Cesium.Color.fromCssColorString('rgba(59, 178, 208, 1)'),
-        outlineWidth: 3,
-      });
-      break;
-    case 'drawAttackArrow':
-      geometry = new CesiumPlot.AttackArrow(Cesium, viewer, {
-        outlineMaterial: Cesium.Color.RED,
-      });
-      break;
-    case 'drawSwallowtailAttackArrow':
-      geometry = new CesiumPlot.SwallowtailAttackArrow(Cesium, viewer, {
-        outlineMaterial: Cesium.Color.BLUE,
-      });
-      break;
-    case 'drawSquadCombat':
-      geometry = new CesiumPlot.SquadCombat(Cesium, viewer, {
-        outlineMaterial: new Cesium.PolylineDashMaterialProperty({
-          color: Cesium.Color.RED,
-          dashLength: 16.0,
-        }),
-      });
-      break;
-    case 'drawSwallowtailSquadCombat':
-      geometry = new CesiumPlot.SwallowtailSquadCombat(Cesium, viewer);
-      break;
-    case 'drawStraightArrow':
-      geometry = new CesiumPlot.StraightArrow(Cesium, viewer, {
-        material: Cesium.Color.RED,
-      });
-      break;
-    case 'drawAssaultDirection':
-      geometry = new CesiumPlot.AssaultDirection(Cesium, viewer);
-      break;
-    case 'drawCurvedArrow':
-      geometry = new CesiumPlot.CurvedArrow(Cesium, viewer, {
-        material: Cesium.Color.BLUE,
-      });
-      break;
-    case 'drawDoubleArrow':
-      geometry = new CesiumPlot.DoubleArrow(Cesium, viewer, {
-        outlineMaterial: Cesium.Color.GREEN,
-      });
-      break;
-    case 'drawFreehandLine':
-      geometry = new CesiumPlot.FreehandLine(Cesium, viewer);
-      break;
-    case 'drawCurve':
-      geometry = new CesiumPlot.Curve(Cesium, viewer);
-      break;
-    case 'drawEllipse':
-      geometry = new CesiumPlot.Ellipse(Cesium, viewer);
-      break;
-    case 'drawLune':
-      geometry = new CesiumPlot.Lune(Cesium, viewer);
-      break;
-    case 'drawFreehandPolygon':
-      geometry = new CesiumPlot.FreehandPolygon(Cesium, viewer, {
-        material: Cesium.Color.GREEN,
-        outlineMaterial: Cesium.Color.fromCssColorString('rgba(59, 178, 208, 1)'),
-        outlineWidth: 2,
-      });
-      break;
     case 'hide':
       geometry &&
         geometry.hide({
@@ -141,7 +76,7 @@ buttonGroup.onclick = (evt) => {
       break;
     case 'remove':
       geometry && geometry.remove();
-      geometry = null;
+      // geometry = null;
       break;
     case 'addEvent':
       if (geometry) {
@@ -161,12 +96,30 @@ buttonGroup.onclick = (evt) => {
         geometry.off('editEnd', editEndHandler);
       }
       break;
-
     case 'startGrowthAnimation':
       if (geometry) {
         geometry.startGrowthAnimation();
       }
       break;
+    case 'createGeometryFromData':
+      if (geometry) {
+        const points = geometry.getPoints();
+        geometry = CesiumPlot.createGeometryFromData(Cesium, viewer, {
+          type: geometryType,
+          cartesianPoints: points,
+          style: {
+            material: Cesium.Color.fromCssColorString('rgba(59, 178, 208, 0.5)'),
+            outlineMaterial: Cesium.Color.fromCssColorString('rgba(59, 178, 208, 1)'),
+            outlineWidth: 3,
+          },
+        });
+      }
+      break;
+    case 'cancelDraw':
+      if (geometry) {
+        geometry.remove();
+      }
+      break;
     default:
       break;
   }
diff --git a/index.html b/index.html
index 81e4d85..e8a617f 100644
--- a/index.html
+++ b/index.html
@@ -45,30 +45,35 @@
     <div id="root"></div>
     <div id="cesiumContainer"></div>
     <div class="button-container" id="button-group">
-      <button id="drawPolygon">多边形</button>
-      <button id="drawReactangle">矩形</button>
-      <button id="drawTriangle">三角形</button>
-      <button id="drawCircle">圆形</button>
-      <button id="drawStraightArrow">细直箭头</button>
-      <button id="drawCurvedArrow">曲线箭头</button>
-      <button id="drawFineArrow">直箭头</button>
-      <button id="drawAttackArrow">进攻方向箭头</button>
-      <button id="drawSwallowtailAttackArrow">进攻方向箭头(燕尾)</button>
-      <button id="drawSquadCombat">分队战斗方向</button>
-      <button id="drawSwallowtailSquadCombat">分队战斗方向(燕尾)</button>
-      <button id="drawAssaultDirection">突击方向</button>
-      <button id="drawDoubleArrow">双箭头</button>
-      <button id="drawFreehandLine">自由线</button>
-      <button id="drawFreehandPolygon">自由面</button>
-      <button id="drawCurve">曲线</button>
-      <button id="drawEllipse">椭圆</button>
-      <button id="drawLune">半月面</button>
+      <button id="Polygon">多边形</button>
+      <button id="Reactangle">矩形</button>
+      <button id="Triangle">三角形</button>
+      <button id="Circle">圆形</button>
+      <button id="Sector">扇形</button>
+      <button id="StraightArrow">细直箭头</button>
+      <button id="CurvedArrow">曲线箭头</button>
+      <button id="FineArrow">直箭头</button>
+      <button id="AttackArrow">进攻方向箭头</button>
+      <button id="SwallowtailAttackArrow">进攻方向箭头(燕尾)</button>
+      <button id="SquadCombat">分队战斗方向</button>
+      <button id="SwallowtailSquadCombat">分队战斗方向(燕尾)</button>
+      <button id="AssaultDirection">突击方向</button>
+      <button id="DoubleArrow">双箭头</button>
+      <button id="FreehandLine">自由线</button>
+      <button id="FreehandPolygon">自由面</button>
+      <button id="Curve">曲线</button>
+      <button id="Ellipse">椭圆</button>
+      <button id="Lune">半月面</button>
+    </div>
+    <div class="button-container" id="operation-button-group" style="top: 50px;">
       <button id="hide">隐藏</button>
       <button id="show">显示</button>
       <button id="remove">删除</button>
       <button id="addEvent">绑定事件</button>
       <button id="removeEvent">解绑事件</button>
       <button id="startGrowthAnimation">生长动画</button>
+      <button id="createGeometryFromData">根据数据生成图形</button>
+      <button id="cancelDraw">取消绘制</button>
     </div>
     <script>
       window.CESIUM_BASE_URL = 'node_modules/cesium/Build/Cesium';
diff --git a/package-lock.json b/package-lock.json
index fe5aeac..31331f5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "cesium-plot-js",
-  "version": "0.0.4",
+  "version": "0.0.5",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "cesium-plot-js",
-      "version": "0.0.4",
+      "version": "0.0.5",
       "dependencies": {
         "lodash.clonedeep": "^4.5.0",
         "lodash.merge": "^4.6.2"
diff --git a/package.json b/package.json
index 6c9f1ef..ec2eaa8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "cesium-plot-js",
-  "version": "0.0.5",
+  "version": "0.0.6",
   "main": "dist/CesiumPlot.umd.js",
   "homepage": "https://github.com/ethan-zf/cesium-plot-js",
   "repository": {
diff --git a/src/arrow/attack-arrow.ts b/src/arrow/attack-arrow.ts
index 4cfeff4..0126e94 100644
--- a/src/arrow/attack-arrow.ts
+++ b/src/arrow/attack-arrow.ts
@@ -50,8 +50,9 @@ export default class AttackArrow extends Base {
     const tempPoints = [...this.points, cartesian];
     this.setGeometryPoints(tempPoints);
     if (tempPoints.length === 2) {
-      this.addFirstLineOfTheArrow();
+      this.addTempLine();
     } else {
+      this.removeTempLine();
       const geometryPoints = this.createGraphic(tempPoints);
       this.setGeometryPoints(geometryPoints);
       this.drawPolygon();
diff --git a/src/arrow/double-arrow.ts b/src/arrow/double-arrow.ts
index ccefb63..38ed574 100644
--- a/src/arrow/double-arrow.ts
+++ b/src/arrow/double-arrow.ts
@@ -53,11 +53,9 @@ export default class DoubleArrow extends Base {
       this.lineEntity && this.viewer.entities.remove(this.lineEntity);
     } else {
       this.finishDrawing();
-      this.curveControlPointLeft = this.cesium.Cartesian3.fromDegrees(this.llBodyPnts[2][0], this.llBodyPnts[2][1]);
-      this.curveControlPointRight = this.cesium.Cartesian3.fromDegrees(this.rrBodyPnts[1][0], this.rrBodyPnts[1][1]);
 
-      // 辅助查看插值控制点位置
-      // this.CesiumViewer.entities.add({
+      // // 辅助查看插值控制点位置
+      // this.viewer.entities.add({
       // 	position: this.curveControlPointLeft,
       // 	point: {
       // 		pixelSize: 10,
@@ -65,7 +63,7 @@ export default class DoubleArrow extends Base {
       // 		color: this.cesium.Color.RED,
       // 	},
       // });
-      // this.CesiumViewer.entities.add({
+      // this.viewer.entities.add({
       // 	position: this.curveControlPointRight,
       // 	point: {
       // 		pixelSize: 10,
@@ -75,6 +73,12 @@ export default class DoubleArrow extends Base {
       // });
     }
   }
+
+  finishDrawing() {
+    this.curveControlPointLeft = this.cesium.Cartesian3.fromDegrees(this.llBodyPnts[2][0], this.llBodyPnts[2][1]);
+    this.curveControlPointRight = this.cesium.Cartesian3.fromDegrees(this.rrBodyPnts[1][0], this.rrBodyPnts[1][1]);
+    super.finishDrawing();
+  }
   /**
    * Draw a shape based on mouse movement points during the initial drawing.
    */
@@ -82,8 +86,9 @@ export default class DoubleArrow extends Base {
     const tempPoints = [...this.points, cartesian];
     this.setGeometryPoints(tempPoints);
     if (tempPoints.length === 2) {
-      this.addFirstLineOfTheArrow();
+      this.addTempLine();
     } else if (tempPoints.length > 2) {
+      this.removeTempLine();
       const geometryPoints = this.createGraphic(tempPoints);
       this.setGeometryPoints(geometryPoints);
       this.drawPolygon();
diff --git a/src/base.ts b/src/base.ts
index e8680e5..4d38881 100644
--- a/src/base.ts
+++ b/src/base.ts
@@ -35,6 +35,7 @@ export default class Base {
   points: CesiumTypeOnly.Cartesian3[] = [];
   styleCache: GeometryStyle | undefined;
   minPointsForShape: number = 0;
+  tempLineEntity: CesiumTypeOnly.Entity;
 
   constructor(cesium: CesiumTypeOnly, viewer: CesiumTypeOnly.Viewer, style?: GeometryStyle) {
     this.cesium = cesium;
@@ -266,15 +267,21 @@ export default class Base {
     }
   }
 
-  addFirstLineOfTheArrow() {
-    if (!this.lineEntity) {
+  addTempLine() {
+    if (!this.tempLineEntity) {
       // The line style between the first two points matches the outline style.
       const style = this.style as PolygonStyle;
       const lineStyle = {
         material: style.outlineMaterial,
         lineWidth: style.outlineWidth,
       };
-      this.lineEntity = this.addLineEntity(lineStyle);
+      this.tempLineEntity = this.addLineEntity(lineStyle);
+    }
+  }
+
+  removeTempLine() {
+    if (this.tempLineEntity) {
+      this.viewer.entities.remove(this.tempLineEntity);
     }
   }
 
@@ -434,6 +441,11 @@ export default class Base {
           });
 
           this.setGeometryPoints(newPoints);
+          if (this.minPointsForShape === 4) {
+            // 双箭头在整体被拖拽时,需要同步更新生长动画的插值点
+            this.curveControlPointLeft = this.cesium.Cartesian3.add(this.curveControlPointLeft, translation, new this.cesium.Cartesian3());
+            this.curveControlPointRight = this.cesium.Cartesian3.add(this.curveControlPointRight, translation, new this.cesium.Cartesian3());
+          }
           startPosition = newPosition;
         }
       } else {
@@ -718,10 +730,7 @@ export default class Base {
 
   private doubleArrowGrowthAnimation(duration: number = 2000, delay: number = 0, callback?: Function) {
     setTimeout(() => {
-      this.viewer.entities.remove(this.polygonEntity);
-      this.viewer.entities.remove(this.outlineEntity);
-      this.polygonEntity = null;
-      this.outlineEntity = null;
+      this.hideWithAnimation(0, 0, undefined);
       const points = this.getPoints();
       let startTime = Date.now();
       this.viewer.clock.shouldAnimate = true;
@@ -776,7 +785,7 @@ export default class Base {
         tempPoints[3] = newPositionLeft;
         const geometryPoints = this.createGraphic(tempPoints);
         this.setGeometryPoints(geometryPoints);
-        this.drawPolygon();
+        this.showWithAnimation(0, 0, undefined);
       };
       this.viewer.clock.onTick.addEventListener(frameListener);
     }, delay);
diff --git a/src/index.ts b/src/index.ts
index bc35228..fc66fd0 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -16,8 +16,12 @@ import Reactangle from './polygon/rectangle';
 import Triangle from './polygon/triangle';
 import Polygon from './polygon/polygon';
 import Circle from './polygon/circle';
+import Sector from './polygon/sector';
 
-const CesiumPlot = {
+import { GeometryStyle } from './interface';
+import * as CesiumTypeOnly from 'cesium';
+
+const CesiumPlot: any = {
   FineArrow,
   AttackArrow,
   SwallowtailAttackArrow,
@@ -36,6 +40,33 @@ const CesiumPlot = {
   Triangle,
   Polygon,
   Circle,
+  Sector,
+};
+
+type CreateGeometryFromDataOpts = {
+  type: string;
+  cartesianPoints: CesiumTypeOnly.Cartesian3[];
+  style: GeometryStyle;
+};
+/**
+ * 根据点位数据生成几何图形
+ * @param points
+ */
+CesiumPlot.createGeometryFromData = (cesium: any, viewer: any, opts: CreateGeometryFromDataOpts) => {
+  const { type, style, cartesianPoints } = opts;
+  const geometry = new CesiumPlot[type](cesium, viewer, style);
+
+  geometry.points = cartesianPoints;
+  const geometryPoints = geometry.createGraphic(cartesianPoints);
+  geometry.setGeometryPoints(geometryPoints);
+  if (geometry.type == 'polygon') {
+    geometry.drawPolygon();
+  } else {
+    geometry.drawLine();
+  }
+  geometry.finishDrawing();
+  geometry.onClick();
+  return geometry;
 };
 
 export default CesiumPlot;
diff --git a/src/polygon/circle.ts b/src/polygon/circle.ts
index 0fdd077..6cd438e 100644
--- a/src/polygon/circle.ts
+++ b/src/polygon/circle.ts
@@ -37,7 +37,7 @@ export default class Circle extends Base {
    */
   updateMovingPoint(cartesian: Cartesian3) {
     const tempPoints = [...this.points, cartesian];
-    const geometryPoints = this.createCircle(tempPoints);
+    const geometryPoints = this.createGraphic(tempPoints);
     this.setGeometryPoints(geometryPoints);
     this.drawPolygon();
   }
@@ -47,12 +47,12 @@ export default class Circle extends Base {
    */
   updateDraggingPoint(cartesian: Cartesian3, index: number) {
     this.points[index] = cartesian;
-    const geometryPoints = this.createCircle(this.points);
+    const geometryPoints = this.createGraphic(this.points);
     this.setGeometryPoints(geometryPoints);
     this.drawPolygon();
   }
 
-  createCircle(positions: Cartesian3[]) {
+  createGraphic(positions: Cartesian3[]) {
     const lnglatPoints = positions.map((pnt) => {
       return this.cartesianToLnglat(pnt);
     });
diff --git a/src/polygon/ellipse.ts b/src/polygon/ellipse.ts
index 50801a1..432a0c8 100644
--- a/src/polygon/ellipse.ts
+++ b/src/polygon/ellipse.ts
@@ -37,7 +37,7 @@ export default class Ellipse extends Base {
    */
   updateMovingPoint(cartesian: Cartesian3) {
     const tempPoints = [...this.points, cartesian];
-    const geometryPoints = this.createEllipse(tempPoints);
+    const geometryPoints = this.createGraphic(tempPoints);
     this.setGeometryPoints(geometryPoints);
     this.drawPolygon();
   }
@@ -47,12 +47,12 @@ export default class Ellipse extends Base {
    */
   updateDraggingPoint(cartesian: Cartesian3, index: number) {
     this.points[index] = cartesian;
-    const geometryPoints = this.createEllipse(this.points);
+    const geometryPoints = this.createGraphic(this.points);
     this.setGeometryPoints(geometryPoints);
     this.drawPolygon();
   }
 
-  createEllipse(positions: Cartesian3[]) {
+  createGraphic(positions: Cartesian3[]) {
     const lnglatPoints = positions.map((pnt) => {
       return this.cartesianToLnglat(pnt);
     });
diff --git a/src/polygon/lune.ts b/src/polygon/lune.ts
index af8744f..aba5689 100644
--- a/src/polygon/lune.ts
+++ b/src/polygon/lune.ts
@@ -37,7 +37,7 @@ export default class Lune extends Base {
    */
   updateMovingPoint(cartesian: Cartesian3) {
     const tempPoints = [...this.points, cartesian];
-    const geometryPoints = this.createLune(tempPoints);
+    const geometryPoints = this.createGraphic(tempPoints);
     this.setGeometryPoints(geometryPoints);
     this.drawPolygon();
   }
@@ -47,12 +47,12 @@ export default class Lune extends Base {
    */
   updateDraggingPoint(cartesian: Cartesian3, index: number) {
     this.points[index] = cartesian;
-    const geometryPoints = this.createLune(this.points);
+    const geometryPoints = this.createGraphic(this.points);
     this.setGeometryPoints(geometryPoints);
     this.drawPolygon();
   }
 
-  createLune(positions: Cartesian3[]) {
+  createGraphic(positions: Cartesian3[]) {
     const lnglatPoints = positions.map((pnt) => {
       return this.cartesianToLnglat(pnt);
     });
diff --git a/src/polygon/polygon.ts b/src/polygon/polygon.ts
index ab4e558..3d447b5 100644
--- a/src/polygon/polygon.ts
+++ b/src/polygon/polygon.ts
@@ -25,7 +25,7 @@ export default class Polygon extends Base {
     this.points.push(cartesian);
     if (this.points.length === 1) {
       this.onMouseMove();
-    } 
+    }
   }
 
   /**
@@ -35,8 +35,9 @@ export default class Polygon extends Base {
     const tempPoints = [...this.points, cartesian];
     this.setGeometryPoints(tempPoints);
     if (tempPoints.length === 2) {
-      this.addFirstLineOfTheArrow();
+      this.addTempLine();
     } else {
+      this.removeTempLine();
       this.drawPolygon();
     }
   }
diff --git a/src/polygon/rectangle.ts b/src/polygon/rectangle.ts
index 2af3e98..21c68a3 100644
--- a/src/polygon/rectangle.ts
+++ b/src/polygon/rectangle.ts
@@ -34,7 +34,7 @@ export default class Rectangle extends Base {
    */
   updateMovingPoint(cartesian: Cartesian3) {
     const tempPoints = [...this.points, cartesian];
-    const geometryPoints = this.createRectangle(tempPoints);
+    const geometryPoints = this.createGraphic(tempPoints);
     this.setGeometryPoints(geometryPoints);
     this.drawPolygon();
   }
@@ -44,12 +44,12 @@ export default class Rectangle extends Base {
    */
   updateDraggingPoint(cartesian: Cartesian3, index: number) {
     this.points[index] = cartesian;
-    const geometryPoints = this.createRectangle(this.points);
+    const geometryPoints = this.createGraphic(this.points);
     this.setGeometryPoints(geometryPoints);
     this.drawPolygon();
   }
 
-  createRectangle(positions: Cartesian3[]) {
+  createGraphic(positions: Cartesian3[]) {
     const [p1, p2] = positions.map(this.cartesianToLnglat);
     const coords = [...p1, p1[0], p2[1], ...p2, p2[0], p1[1], ...p1];
     const cartesianPoints = this.cesium.Cartesian3.fromDegreesArray(coords);
diff --git a/src/polygon/sector.ts b/src/polygon/sector.ts
new file mode 100644
index 0000000..f169c9d
--- /dev/null
+++ b/src/polygon/sector.ts
@@ -0,0 +1,77 @@
+import Base from '../base';
+// @ts-ignore
+import { Cartesian3 } from 'cesium';
+import * as Utils from '../utils';
+import { PolygonStyle } from '../interface';
+
+export default class Sector extends Base {
+  points: Cartesian3[] = [];
+
+  constructor(cesium: any, viewer: any, style?: PolygonStyle) {
+    super(cesium, viewer, style);
+    this.cesium = cesium;
+    this.setState('drawing');
+  }
+
+  getType(): 'polygon' | 'line' {
+    return 'polygon';
+  }
+
+  /**
+   * Add points only on click events
+   */
+  addPoint(cartesian: Cartesian3) {
+    this.points.push(cartesian);
+    if (this.points.length === 1) {
+      this.onMouseMove();
+    }else if (this.points.length === 3) {
+      this.finishDrawing();
+    }
+  }
+
+  /**
+   * Draw a shape based on mouse movement points during the initial drawing.
+   */
+  updateMovingPoint(cartesian: Cartesian3) {
+    const tempPoints = [...this.points, cartesian];
+    this.setGeometryPoints(tempPoints);
+    if (tempPoints.length === 2) {
+      this.addTempLine();
+    } else {
+      this.removeTempLine();
+      const geometryPoints = this.createGraphic(tempPoints);
+      this.setGeometryPoints(geometryPoints);
+      this.drawPolygon();
+    }
+  }
+
+  createGraphic(positions: Cartesian3[]) {
+    const lnglatPoints = positions.map((pnt) => {
+      return this.cartesianToLnglat(pnt);
+    });
+    const [center, pnt2, pnt3] = [lnglatPoints[0], lnglatPoints[1], lnglatPoints[2]];
+    const radius = Utils.MathDistance(pnt2, center);
+    const startAngle = Utils.getAzimuth(pnt2, center);
+    const endAngle = Utils.getAzimuth(pnt3, center);
+    const res = Utils.getArcPoints(center, radius, startAngle, endAngle);
+    res.push(center, res[0]);
+
+    const temp = [].concat(...res);
+    const cartesianPoints = this.cesium.Cartesian3.fromDegreesArray(temp);
+    return cartesianPoints;
+  }
+
+  /**
+   * In edit mode, drag key points to update corresponding key point data.
+   */
+  updateDraggingPoint(cartesian: Cartesian3, index: number) {
+    this.points[index] = cartesian;
+    const geometryPoints = this.createGraphic(this.points);
+    this.setGeometryPoints(geometryPoints);
+    this.drawPolygon();
+  }
+
+  getPoints() {
+    return this.points;
+  }
+}
diff --git a/src/polygon/triangle.ts b/src/polygon/triangle.ts
index 462d5cb..b886e96 100644
--- a/src/polygon/triangle.ts
+++ b/src/polygon/triangle.ts
@@ -36,8 +36,9 @@ export default class Triangle extends Base {
     const tempPoints = [...this.points, cartesian];
     this.setGeometryPoints(tempPoints);
     if (tempPoints.length === 2) {
-      this.addFirstLineOfTheArrow();
+      this.addTempLine();
     } else {
+      this.removeTempLine();
       this.drawPolygon();
     }
   }