Эх сурвалжийг харах

Merge branch 'feature/军事标绘' into develop

DESKTOP-CRQ4N2U\jintian 2 жил өмнө
parent
commit
3ead1077eb
45 өөрчлөгдсөн 16714 нэмэгдсэн , 641 устгасан
  1. 3142 0
      public/dataFile/fanweixian2.json
  2. BIN
      public/jt3dSDK/imgs/wallmaterial/color.png
  3. BIN
      public/jt3dSDK/imgs/wallmaterial/jsx.png
  4. BIN
      public/jt3dSDK/imgs/wallmaterial/wl.png
  5. 3142 0
      src/assets/dataFile/fanweixian2.json
  6. 288 51
      src/components/CrMap.vue
  7. 99 0
      src/jtMap3d/Assets/styles/tooltip.css
  8. 160 0
      src/jtMap3d/Widgets/CircleObject.js
  9. 181 0
      src/jtMap3d/Widgets/CircleObject/CircleMaterialProperty.js
  10. 132 0
      src/jtMap3d/Widgets/CircleObject/CircleRippleMaterialProperty.js
  11. 0 9
      src/jtMap3d/Widgets/DrawTools/CrEditProperty.ce.vue
  12. 388 0
      src/jtMap3d/Widgets/DrawTools/CrEditProperty_MilitaryPlot.ce.vue
  13. 478 350
      src/jtMap3d/Widgets/DrawTools/DrawMilitaryPlot.js
  14. 672 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/EntityEdit.js
  15. 534 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawArc.js
  16. 574 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawAttackArrow.js
  17. 251 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawCircle.js
  18. 597 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawClosedCurve.js
  19. 510 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawCurve.js
  20. 463 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawCurveFlag.js
  21. 609 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawGatheringPlace.js
  22. 536 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawLune.js
  23. 656 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawPincerArrow.js
  24. 138 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawPoint.js
  25. 229 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawPolygon.js
  26. 223 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawPolyline.js
  27. 289 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawRectFlag.js
  28. 228 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawRectangle.js
  29. 327 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawSector.js
  30. 348 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawStraightArrow.js
  31. 286 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawTriangleFlag.js
  32. 47 0
      src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/index.js
  33. 6 6
      src/jtMap3d/Widgets/SpatialAnalysis/Cutting.js
  34. 3 5
      src/jtMap3d/Widgets/SpatialAnalysis/GeologyClipPlan.js
  35. 136 133
      src/jtMap3d/Widgets/SpatialAnalysis/SightLine.js
  36. 5 1
      src/jtMap3d/Widgets/StatusBar.js
  37. 138 0
      src/jtMap3d/Widgets/WallObject.js
  38. 107 0
      src/jtMap3d/Widgets/WallObject/DynamicWallMaterialProperty.js
  39. 79 0
      src/jtMap3d/Widgets/WallObject/WallDiffuseMaterialProperty.js
  40. 186 0
      src/jtMap3d/Widgets/WallObject/WallMaterialProperty.js
  41. 88 0
      src/jtMap3d/Widgets/common/CoordTransform.js
  42. 111 6
      src/jtMap3d/Widgets/common/RuntimeEnvironment.js
  43. 40 1
      src/jtMap3d/Widgets/common/common.js
  44. 284 79
      src/jtMap3d/Widgets/layer.js
  45. 4 0
      src/jtMap3d/index.js

+ 3142 - 0
public/dataFile/fanweixian2.json

@@ -0,0 +1,3142 @@
+{
+  "type" : "FeatureCollection",
+  "features" : [
+    {
+      "type" : "Feature",
+      "id" : 1,
+      "geometry" : {
+        "type" : "LineString",
+        "coordinates" : [
+          [
+            117.47336308200011,
+            36.352529570000058
+          ],
+          [
+            117.47336308500007,
+            36.352528874000029
+          ],
+          [
+            117.47339541500003,
+            36.352528954000036
+          ],
+          [
+            117.47384343100009,
+            36.352530056000035
+          ],
+          [
+            117.47384294400001,
+            36.352520489000028
+          ],
+          [
+            117.47395964800012,
+            36.352518281000073
+          ],
+          [
+            117.47395441800006,
+            36.352136155000039
+          ],
+          [
+            117.47394918900011,
+            36.351754028000073
+          ],
+          [
+            117.47394749300008,
+            36.351630140000054
+          ],
+          [
+            117.47394740700008,
+            36.351623891000031
+          ],
+          [
+            117.47461353600011,
+            36.351574719000041
+          ],
+          [
+            117.47463257400011,
+            36.351573313000074
+          ],
+          [
+            117.47465221000004,
+            36.351572092000026
+          ],
+          [
+            117.47469385300008,
+            36.351569501000029
+          ],
+          [
+            117.47472376500002,
+            36.351567640000042
+          ],
+          [
+            117.47507317100008,
+            36.35154590500008
+          ],
+          [
+            117.47514949600009,
+            36.351541157000042
+          ],
+          [
+            117.47542164200001,
+            36.351524227000027
+          ],
+          [
+            117.47542140000007,
+            36.351507294000044
+          ],
+          [
+            117.4754207520001,
+            36.35146194400005
+          ],
+          [
+            117.47545306600011,
+            36.351434404000031
+          ],
+          [
+            117.4755319620001,
+            36.351425708000079
+          ],
+          [
+            117.47557390100008,
+            36.35141486100008
+          ],
+          [
+            117.47590710500003,
+            36.35136921700007
+          ],
+          [
+            117.47597634200008,
+            36.351367010000047
+          ],
+          [
+            117.47600454000008,
+            36.351363311000057
+          ],
+          [
+            117.47613873100011,
+            36.351341808000029
+          ],
+          [
+            117.47677775300008,
+            36.351257174000068
+          ],
+          [
+            117.47717299700003,
+            36.351208103000033
+          ],
+          [
+            117.47756824200007,
+            36.351159032000055
+          ],
+          [
+            117.47801430600009,
+            36.351101570000026
+          ],
+          [
+            117.47801842600006,
+            36.35109736000004
+          ],
+          [
+            117.47801879500003,
+            36.351095281000028
+          ],
+          [
+            117.47801355500008,
+            36.35107780800007
+          ],
+          [
+            117.47790372600002,
+            36.350758370000051
+          ],
+          [
+            117.47779389600009,
+            36.350438932000031
+          ],
+          [
+            117.47778569900004,
+            36.350415092000048
+          ],
+          [
+            117.47777401600001,
+            36.350381111000047
+          ],
+          [
+            117.47756529200001,
+            36.34977402800007
+          ],
+          [
+            117.47753655500003,
+            36.349689827000077
+          ],
+          [
+            117.47753337200004,
+            36.349680500000034
+          ],
+          [
+            117.47752370000001,
+            36.349652160000062
+          ],
+          [
+            117.47751752800002,
+            36.349634076000029
+          ],
+          [
+            117.47734132700009,
+            36.349117791000026
+          ],
+          [
+            117.47716512800002,
+            36.348601505000033
+          ],
+          [
+            117.47710428300002,
+            36.348373135000031
+          ],
+          [
+            117.47707709800011,
+            36.348245120000058
+          ],
+          [
+            117.47706911200009,
+            36.34820751400008
+          ],
+          [
+            117.47706337900001,
+            36.348180521000074
+          ],
+          [
+            117.47699304700006,
+            36.34784932000008
+          ],
+          [
+            117.47698611700002,
+            36.347816685000055
+          ],
+          [
+            117.47700193900005,
+            36.34781640500006
+          ],
+          [
+            117.47705876700002,
+            36.347815397000033
+          ],
+          [
+            117.47765875700009,
+            36.347804753000048
+          ],
+          [
+            117.47825874800003,
+            36.347794106000038
+          ],
+          [
+            117.4788587380001,
+            36.347783456000059
+          ],
+          [
+            117.47888711400003,
+            36.347782952000045
+          ],
+          [
+            117.47892456300008,
+            36.34778228700003
+          ],
+          [
+            117.47892675500009,
+            36.347782289000065
+          ],
+          [
+            117.47893486700002,
+            36.347794467000028
+          ],
+          [
+            117.47893919100011,
+            36.347808729000064
+          ],
+          [
+            117.47895124500008,
+            36.347830516000045
+          ],
+          [
+            117.47896611500005,
+            36.347843221000062
+          ],
+          [
+            117.4789926630001,
+            36.347846691000029
+          ],
+          [
+            117.47903687400003,
+            36.347846514000025
+          ],
+          [
+            117.47920190500008,
+            36.347842276000051
+          ],
+          [
+            117.47934051700008,
+            36.34783870900003
+          ],
+          [
+            117.47934242100007,
+            36.347251976000052
+          ],
+          [
+            117.47964942300007,
+            36.347251697000047
+          ],
+          [
+            117.48010845400006,
+            36.347251278000044
+          ],
+          [
+            117.48012104000009,
+            36.347251266000058
+          ],
+          [
+            117.48015595000004,
+            36.347251235000044
+          ],
+          [
+            117.4801631360001,
+            36.347251229000051
+          ],
+          [
+            117.48019089000002,
+            36.347251203000042
+          ],
+          [
+            117.48039008000001,
+            36.347251021000034
+          ],
+          [
+            117.48043647200006,
+            36.346703091000052
+          ],
+          [
+            117.48048286300002,
+            36.34615516100007
+          ],
+          [
+            117.48052925400009,
+            36.345607231000031
+          ],
+          [
+            117.48057780700003,
+            36.345033760000035
+          ],
+          [
+            117.48062635800011,
+            36.344460290000029
+          ],
+          [
+            117.48067491100005,
+            36.343886818000044
+          ],
+          [
+            117.48072346100003,
+            36.343313347000048
+          ],
+          [
+            117.48077201000001,
+            36.342739876000053
+          ],
+          [
+            117.4808205600001,
+            36.342166405000057
+          ],
+          [
+            117.48133297300001,
+            36.341725729000075
+          ],
+          [
+            117.48184538100008,
+            36.341285053000036
+          ],
+          [
+            117.48235778200001,
+            36.340844373000039
+          ],
+          [
+            117.48287017700011,
+            36.340403692000052
+          ],
+          [
+            117.48338256700004,
+            36.339963008000041
+          ],
+          [
+            117.48389495200001,
+            36.33952232200005
+          ],
+          [
+            117.48440733000007,
+            36.339081633000035
+          ],
+          [
+            117.48485984200011,
+            36.338668928000061
+          ],
+          [
+            117.48531234800009,
+            36.338256221000051
+          ],
+          [
+            117.48576485000001,
+            36.337843511000074
+          ],
+          [
+            117.4862173460001,
+            36.33743080000005
+          ],
+          [
+            117.48667853500001,
+            36.337010156000076
+          ],
+          [
+            117.48713971800009,
+            36.336589509000078
+          ],
+          [
+            117.48714487700011,
+            36.336583266000048
+          ],
+          [
+            117.4871533490001,
+            36.336568258000057
+          ],
+          [
+            117.48737024700006,
+            36.336114830000042
+          ],
+          [
+            117.48758714300004,
+            36.335661401000038
+          ],
+          [
+            117.48758349400009,
+            36.335518360000037
+          ],
+          [
+            117.48747491600011,
+            36.335105492000025
+          ],
+          [
+            117.48736633800002,
+            36.334692622000034
+          ],
+          [
+            117.48725776100002,
+            36.334279752000043
+          ],
+          [
+            117.48707090300002,
+            36.333911466000075
+          ],
+          [
+            117.48688404500001,
+            36.333543180000049
+          ],
+          [
+            117.48697565000009,
+            36.33353730400006
+          ],
+          [
+            117.48714648400005,
+            36.333526346000042
+          ],
+          [
+            117.48720095200008,
+            36.333522853000034
+          ],
+          [
+            117.48751148600002,
+            36.33350293500007
+          ],
+          [
+            117.48768828900006,
+            36.333491594000066
+          ],
+          [
+            117.48795433600003,
+            36.333474527000078
+          ],
+          [
+            117.48797512400006,
+            36.33347223100003
+          ],
+          [
+            117.48799963600004,
+            36.333469524000066
+          ],
+          [
+            117.48856469900011,
+            36.333407100000045
+          ],
+          [
+            117.48856644300008,
+            36.333414404000052
+          ],
+          [
+            117.48861369200006,
+            36.333670865000045
+          ],
+          [
+            117.48863217200005,
+            36.333771175000038
+          ],
+          [
+            117.48866782300001,
+            36.333964674000072
+          ],
+          [
+            117.48879484400004,
+            36.333947993000038
+          ],
+          [
+            117.48954414400009,
+            36.333864991000041
+          ],
+          [
+            117.48948395400009,
+            36.333485913000061
+          ],
+          [
+            117.48945580900011,
+            36.333308653000074
+          ],
+          [
+            117.48944653100011,
+            36.333230912000033
+          ],
+          [
+            117.48954771900003,
+            36.333220277000066
+          ],
+          [
+            117.48939917400003,
+            36.332807238000044
+          ],
+          [
+            117.48921832800011,
+            36.332304381000029
+          ],
+          [
+            117.48903748500004,
+            36.331801523000024
+          ],
+          [
+            117.48902804500005,
+            36.331775272000073
+          ],
+          [
+            117.48888483500002,
+            36.331377054000029
+          ],
+          [
+            117.48886573600009,
+            36.331323945000065
+          ],
+          [
+            117.48878409300005,
+            36.33109692000005
+          ],
+          [
+            117.48874162600009,
+            36.330978835000053
+          ],
+          [
+            117.4887319720001,
+            36.330951992000053
+          ],
+          [
+            117.48869524200006,
+            36.330849855000054
+          ],
+          [
+            117.48868551100009,
+            36.330822793000038
+          ],
+          [
+            117.48859619200005,
+            36.330574421000051
+          ],
+          [
+            117.48858984000003,
+            36.33057444700006
+          ],
+          [
+            117.48856153800011,
+            36.330542947000026
+          ],
+          [
+            117.48853770500011,
+            36.330493555000032
+          ],
+          [
+            117.48841291000008,
+            36.330059126000037
+          ],
+          [
+            117.4882765750001,
+            36.329664068000056
+          ],
+          [
+            117.48826290800002,
+            36.329624461000037
+          ],
+          [
+            117.48826094300011,
+            36.329618770000025
+          ],
+          [
+            117.48815764500011,
+            36.329664457000035
+          ],
+          [
+            117.48778461600011,
+            36.32980619600005
+          ],
+          [
+            117.48764765700002,
+            36.32983617900004
+          ],
+          [
+            117.48738324200008,
+            36.329537192000032
+          ],
+          [
+            117.4871188300001,
+            36.329238203000045
+          ],
+          [
+            117.48657260000004,
+            36.329662666000047
+          ],
+          [
+            117.48602636400005,
+            36.33008712600008
+          ],
+          [
+            117.48567054000011,
+            36.330066444000067
+          ],
+          [
+            117.48555137200003,
+            36.330059517000052
+          ],
+          [
+            117.48554238500003,
+            36.330058995000059
+          ],
+          [
+            117.48536664900007,
+            36.330066104000025
+          ],
+          [
+            117.48527515800004,
+            36.33006980600004
+          ],
+          [
+            117.48509822400001,
+            36.330076964000057
+          ],
+          [
+            117.48495281800001,
+            36.330082846000039
+          ],
+          [
+            117.48488719600005,
+            36.330085500000052
+          ],
+          [
+            117.48440774300002,
+            36.330104893000055
+          ],
+          [
+            117.48439606900001,
+            36.330084258000056
+          ],
+          [
+            117.48417891500003,
+            36.330088362000026
+          ],
+          [
+            117.48398359700002,
+            36.330092053000044
+          ],
+          [
+            117.48363989000006,
+            36.330098547000034
+          ],
+          [
+            117.48348686300005,
+            36.330093807000026
+          ],
+          [
+            117.48347339700001,
+            36.330093390000059
+          ],
+          [
+            117.48345765900001,
+            36.330092824000076
+          ],
+          [
+            117.48341909500004,
+            36.329417608000028
+          ],
+          [
+            117.48346040700005,
+            36.329415813000026
+          ],
+          [
+            117.48364368900002,
+            36.329407849000063
+          ],
+          [
+            117.48416816700001,
+            36.329385058000071
+          ],
+          [
+            117.48416779600007,
+            36.329378775000066
+          ],
+          [
+            117.48416619900001,
+            36.329351727000073
+          ],
+          [
+            117.48413003000007,
+            36.328739084000063
+          ],
+          [
+            117.48409386300011,
+            36.328126443000031
+          ],
+          [
+            117.48409303000005,
+            36.32811231900007
+          ],
+          [
+            117.48409070100001,
+            36.328072868000049
+          ],
+          [
+            117.48406485200007,
+            36.327634995000039
+          ],
+          [
+            117.48406325400003,
+            36.327607945000068
+          ],
+          [
+            117.48403900200003,
+            36.32719712100004
+          ],
+          [
+            117.48403777100009,
+            36.327176283000028
+          ],
+          [
+            117.48337054800004,
+            36.327194298000052
+          ],
+          [
+            117.48336889300003,
+            36.327171612000029
+          ],
+          [
+            117.483328873,
+            36.326623006000034
+          ],
+          [
+            117.48328885400008,
+            36.326074399000049
+          ],
+          [
+            117.48328859300011,
+            36.326070823000066
+          ],
+          [
+            117.48270826700002,
+            36.326083609000079
+          ],
+          [
+            117.48212794100004,
+            36.326096393000057
+          ],
+          [
+            117.48209046600005,
+            36.326095098000053
+          ],
+          [
+            117.48208885500003,
+            36.326063960000056
+          ],
+          [
+            117.4820618440001,
+            36.325511898000059
+          ],
+          [
+            117.4820607150001,
+            36.325490897000066
+          ],
+          [
+            117.48205911800005,
+            36.325461162000067
+          ],
+          [
+            117.4820434180001,
+            36.325168862000055
+          ],
+          [
+            117.48203412900011,
+            36.32505352000004
+          ],
+          [
+            117.48203117000003,
+            36.325016776000041
+          ],
+          [
+            117.48207359700007,
+            36.325015540000038
+          ],
+          [
+            117.48205992500004,
+            36.324882151000054
+          ],
+          [
+            117.4820440630001,
+            36.324839611000073
+          ],
+          [
+            117.48201355500009,
+            36.324798056000077
+          ],
+          [
+            117.48200690900001,
+            36.324717441000075
+          ],
+          [
+            117.48174597700006,
+            36.324386787000037
+          ],
+          [
+            117.48172866100003,
+            36.324296336000032
+          ],
+          [
+            117.48165615200003,
+            36.323921508000069
+          ],
+          [
+            117.48150119700006,
+            36.323291924000046
+          ],
+          [
+            117.48144804100002,
+            36.32329496400007
+          ],
+          [
+            117.48144983900011,
+            36.323352038000053
+          ],
+          [
+            117.48139832100003,
+            36.323315925000031
+          ],
+          [
+            117.48134848300003,
+            36.323300736000078
+          ],
+          [
+            117.48109596300003,
+            36.323203268000043
+          ],
+          [
+            117.48102354000002,
+            36.323204971000052
+          ],
+          [
+            117.48098227200001,
+            36.323205942000072
+          ],
+          [
+            117.48087363500008,
+            36.323208498000042
+          ],
+          [
+            117.48085018800009,
+            36.323000082000078
+          ],
+          [
+            117.48084527500009,
+            36.322956402000045
+          ],
+          [
+            117.48071067000001,
+            36.322968652000043
+          ],
+          [
+            117.48070545400003,
+            36.322952210000039
+          ],
+          [
+            117.4800351130001,
+            36.323001729000055
+          ],
+          [
+            117.4800497760001,
+            36.322992017000047
+          ],
+          [
+            117.48004798300008,
+            36.322982701000058
+          ],
+          [
+            117.48001090500009,
+            36.322983989000079
+          ],
+          [
+            117.47999229800007,
+            36.32283239700007
+          ],
+          [
+            117.48026616600009,
+            36.322814423000068
+          ],
+          [
+            117.48028043200009,
+            36.322813409000048
+          ],
+          [
+            117.48024062700006,
+            36.322532384000056
+          ],
+          [
+            117.48025512000004,
+            36.322529982000049
+          ],
+          [
+            117.48025528000005,
+            36.322531001000073
+          ],
+          [
+            117.48042097500002,
+            36.322514432000048
+          ],
+          [
+            117.48037921800005,
+            36.322231900000077
+          ],
+          [
+            117.48021641700007,
+            36.322244840000053
+          ],
+          [
+            117.48018870700002,
+            36.322247043000061
+          ],
+          [
+            117.48018523100006,
+            36.322247319000041
+          ],
+          [
+            117.48016999300012,
+            36.322109169000043
+          ],
+          [
+            117.48000183700003,
+            36.322112297000047
+          ],
+          [
+            117.47999435400004,
+            36.321936024000024
+          ],
+          [
+            117.47991077000006,
+            36.321938369000065
+          ],
+          [
+            117.47988271400004,
+            36.321939155000052
+          ],
+          [
+            117.47929542300005,
+            36.321955621000029
+          ],
+          [
+            117.47929747500007,
+            36.321898522000026
+          ],
+          [
+            117.4792975040001,
+            36.321897720000038
+          ],
+          [
+            117.47927750000008,
+            36.321898160000046
+          ],
+          [
+            117.47927898300009,
+            36.321792412000036
+          ],
+          [
+            117.47922324600006,
+            36.321793994000075
+          ],
+          [
+            117.47922328800007,
+            36.321792831000039
+          ],
+          [
+            117.47922428400011,
+            36.321765109000069
+          ],
+          [
+            117.47897945700004,
+            36.321772148000036
+          ],
+          [
+            117.47897948200011,
+            36.321409061000054
+          ],
+          [
+            117.47897932800004,
+            36.321378324000079
+          ],
+          [
+            117.47802617100001,
+            36.321408294000037
+          ],
+          [
+            117.47776850800005,
+            36.321405847000051
+          ],
+          [
+            117.47777155000006,
+            36.321439947000044
+          ],
+          [
+            117.47779039500006,
+            36.321652810000046
+          ],
+          [
+            117.47783773300011,
+            36.322673341000041
+          ],
+          [
+            117.47779958300009,
+            36.322716205000063
+          ],
+          [
+            117.47725771300009,
+            36.322723736000057
+          ],
+          [
+            117.47725747000004,
+            36.322739365000075
+          ],
+          [
+            117.47726606700007,
+            36.323146377000057
+          ],
+          [
+            117.47727466300012,
+            36.323553387000061
+          ],
+          [
+            117.47702725300007,
+            36.323573310000029
+          ],
+          [
+            117.4770223270001,
+            36.323602686000072
+          ],
+          [
+            117.47700851700006,
+            36.323643700000048
+          ],
+          [
+            117.47699723200003,
+            36.323692961000063
+          ],
+          [
+            117.47696405700003,
+            36.323702272000048
+          ],
+          [
+            117.47694560000002,
+            36.324596749000079
+          ],
+          [
+            117.47691828400002,
+            36.324595438000074
+          ],
+          [
+            117.47667805200001,
+            36.324651379000045
+          ],
+          [
+            117.47628975500004,
+            36.324730095000064
+          ],
+          [
+            117.47564487000011,
+            36.324709214000052
+          ],
+          [
+            117.47534999200002,
+            36.324596582000027
+          ],
+          [
+            117.47510378400011,
+            36.324520308000046
+          ],
+          [
+            117.47493198900008,
+            36.324510107000037
+          ],
+          [
+            117.47462220300008,
+            36.324404911000045
+          ],
+          [
+            117.47462267300011,
+            36.324435869000069
+          ],
+          [
+            117.47462536500007,
+            36.324646619000077
+          ],
+          [
+            117.4746300920001,
+            36.325016709000067
+          ],
+          [
+            117.47464329400009,
+            36.325028309000061
+          ],
+          [
+            117.47468255900003,
+            36.325039487000026
+          ],
+          [
+            117.47467716600011,
+            36.32504061800006
+          ],
+          [
+            117.47467536000011,
+            36.325042462000056
+          ],
+          [
+            117.47465314500005,
+            36.325065161000055
+          ],
+          [
+            117.47464839500003,
+            36.325070014000062
+          ],
+          [
+            117.47463780600003,
+            36.325080833000072
+          ],
+          [
+            117.47463532300003,
+            36.325089459000026
+          ],
+          [
+            117.47470221100002,
+            36.325091957000041
+          ],
+          [
+            117.47469229000001,
+            36.325102094000044
+          ],
+          [
+            117.47467612200001,
+            36.325158269000042
+          ],
+          [
+            117.4746704370001,
+            36.325194560000057
+          ],
+          [
+            117.47463415600009,
+            36.325229110000066
+          ],
+          [
+            117.47455228700005,
+            36.325254014000052
+          ],
+          [
+            117.47452609300001,
+            36.325264115000039
+          ],
+          [
+            117.47450781700002,
+            36.325271164000071
+          ],
+          [
+            117.47444336100011,
+            36.325278722000064
+          ],
+          [
+            117.47443911300002,
+            36.325278725000032
+          ],
+          [
+            117.47428180600002,
+            36.325278823000076
+          ],
+          [
+            117.47398594000003,
+            36.325284600000032
+          ],
+          [
+            117.47382223400007,
+            36.325287796000055
+          ],
+          [
+            117.47373607400004,
+            36.325266871000053
+          ],
+          [
+            117.47366713400004,
+            36.32524666900008
+          ],
+          [
+            117.47356143600007,
+            36.325220123000065
+          ],
+          [
+            117.47353258500004,
+            36.325199971000075
+          ],
+          [
+            117.47350221700003,
+            36.325172671000075
+          ],
+          [
+            117.47348150700009,
+            36.32511617800003
+          ],
+          [
+            117.47348198400005,
+            36.325051396000049
+          ],
+          [
+            117.47348204000002,
+            36.325050769000029
+          ],
+          [
+            117.47348008300003,
+            36.325048709000043
+          ],
+          [
+            117.47343950300001,
+            36.325039307000054
+          ],
+          [
+            117.47338114500008,
+            36.32504582200005
+          ],
+          [
+            117.47272190100011,
+            36.325039741000069
+          ],
+          [
+            117.47272025800009,
+            36.325048343000049
+          ],
+          [
+            117.47264719600003,
+            36.325048050000078
+          ],
+          [
+            117.47264922700003,
+            36.32503674000003
+          ],
+          [
+            117.4719659540001,
+            36.325025941000035
+          ],
+          [
+            117.47194262200003,
+            36.325025516000039
+          ],
+          [
+            117.47192354100002,
+            36.325025168000025
+          ],
+          [
+            117.47188024000002,
+            36.32502437800008
+          ],
+          [
+            117.47140405900006,
+            36.325015691000033
+          ],
+          [
+            117.47115598100004,
+            36.325011165000035
+          ],
+          [
+            117.47110439700009,
+            36.325025305000054
+          ],
+          [
+            117.4710801010001,
+            36.325040581000053
+          ],
+          [
+            117.47105772400005,
+            36.325063443000033
+          ],
+          [
+            117.47105394300002,
+            36.325075938000055
+          ],
+          [
+            117.47105228300006,
+            36.32507964000007
+          ],
+          [
+            117.47101152100004,
+            36.32508182600003
+          ],
+          [
+            117.47096736600008,
+            36.325084193000066
+          ],
+          [
+            117.47090413400008,
+            36.325087583000027
+          ],
+          [
+            117.4704172810001,
+            36.325113682000051
+          ],
+          [
+            117.46993042800011,
+            36.32513977900004
+          ],
+          [
+            117.46961763600007,
+            36.325293860000045
+          ],
+          [
+            117.4689359460001,
+            36.32532294300006
+          ],
+          [
+            117.46886905500003,
+            36.325325796000072
+          ],
+          [
+            117.46812104300011,
+            36.325357704000055
+          ],
+          [
+            117.46737303000009,
+            36.325389607000034
+          ],
+          [
+            117.46737304400006,
+            36.325392003000047
+          ],
+          [
+            117.46737349600005,
+            36.325467641000046
+          ],
+          [
+            117.46737378300008,
+            36.325515634000055
+          ],
+          [
+            117.4673747600001,
+            36.325679555000079
+          ],
+          [
+            117.46737579100011,
+            36.325852153000028
+          ],
+          [
+            117.46737952800004,
+            36.326478124000062
+          ],
+          [
+            117.46681973800003,
+            36.326493654000046
+          ],
+          [
+            117.46625994800002,
+            36.326509181000063
+          ],
+          [
+            117.466260852,
+            36.326661063000074
+          ],
+          [
+            117.46558468000001,
+            36.326679087000059
+          ],
+          [
+            117.46490850800001,
+            36.326697108000076
+          ],
+          [
+            117.4649109500001,
+            36.326796340000044
+          ],
+          [
+            117.46423395700003,
+            36.326817055000049
+          ],
+          [
+            117.46392881600002,
+            36.326826391000054
+          ],
+          [
+            117.46371567600011,
+            36.326832911000054
+          ],
+          [
+            117.46355696300009,
+            36.32683776600004
+          ],
+          [
+            117.46287996900003,
+            36.326858473000073
+          ],
+          [
+            117.46292341800006,
+            36.32738203100007
+          ],
+          [
+            117.46291199100006,
+            36.327382140000054
+          ],
+          [
+            117.46273122000002,
+            36.327382839000052
+          ],
+          [
+            117.46245226000008,
+            36.327347510000038
+          ],
+          [
+            117.46208766000007,
+            36.327363146000039
+          ],
+          [
+            117.46188213700009,
+            36.32737196000005
+          ],
+          [
+            117.46184256400011,
+            36.327373657000066
+          ],
+          [
+            117.46181719600008,
+            36.327375292000056
+          ],
+          [
+            117.46181479600011,
+            36.327375841000048
+          ],
+          [
+            117.46182271100008,
+            36.327405251000073
+          ],
+          [
+            117.46133618500005,
+            36.327430510000056
+          ],
+          [
+            117.46138050800005,
+            36.327922306000062
+          ],
+          [
+            117.46138422200011,
+            36.328552375000072
+          ],
+          [
+            117.46131759500008,
+            36.328558025000063
+          ],
+          [
+            117.4613217110001,
+            36.329256238000028
+          ],
+          [
+            117.46132198600003,
+            36.329269302000057
+          ],
+          [
+            117.46096475200011,
+            36.329333080000026
+          ],
+          [
+            117.46096496200005,
+            36.32936870900005
+          ],
+          [
+            117.46051511300004,
+            36.329415470000072
+          ],
+          [
+            117.46032639800001,
+            36.329435054000044
+          ],
+          [
+            117.46007395600009,
+            36.329461174000073
+          ],
+          [
+            117.45995167100011,
+            36.329529940000043
+          ],
+          [
+            117.45985660300005,
+            36.329557754000064
+          ],
+          [
+            117.4596802210001,
+            36.329607988000078
+          ],
+          [
+            117.45948692000002,
+            36.329663038000035
+          ],
+          [
+            117.45947412600003,
+            36.329669387000024
+          ],
+          [
+            117.45909254900005,
+            36.329855165000026
+          ],
+          [
+            117.4590499740001,
+            36.32942354000005
+          ],
+          [
+            117.45900740000002,
+            36.328991913000038
+          ],
+          [
+            117.45879459000002,
+            36.32899726200003
+          ],
+          [
+            117.45879598300007,
+            36.329234866000036
+          ],
+          [
+            117.45858093300001,
+            36.329262672000027
+          ],
+          [
+            117.45825333100004,
+            36.329305028000078
+          ],
+          [
+            117.45771067800001,
+            36.329375187000039
+          ],
+          [
+            117.45716802400011,
+            36.329445343000032
+          ],
+          [
+            117.4571579410001,
+            36.329446647000054
+          ],
+          [
+            117.45715864200008,
+            36.329566773000067
+          ],
+          [
+            117.45714639900007,
+            36.329567380000071
+          ],
+          [
+            117.45674650500007,
+            36.329587174000039
+          ],
+          [
+            117.45634661100007,
+            36.329606966000028
+          ],
+          [
+            117.45633193300011,
+            36.329607692000025
+          ],
+          [
+            117.45600376300001,
+            36.32962393300005
+          ],
+          [
+            117.45598202700012,
+            36.32962500900004
+          ],
+          [
+            117.45594431400002,
+            36.329564491000042
+          ],
+          [
+            117.45594079300008,
+            36.329565817000059
+          ],
+          [
+            117.45576419500003,
+            36.329614569000057
+          ],
+          [
+            117.45568835300003,
+            36.329646332000038
+          ],
+          [
+            117.45560026300006,
+            36.329693956000028
+          ],
+          [
+            117.45520215900001,
+            36.330275759000074
+          ],
+          [
+            117.45519418900005,
+            36.330284860000063
+          ],
+          [
+            117.45510779600011,
+            36.33037339100008
+          ],
+          [
+            117.45511347100012,
+            36.330377036000073
+          ],
+          [
+            117.4551083880001,
+            36.330382830000076
+          ],
+          [
+            117.45505609500003,
+            36.33044244000007
+          ],
+          [
+            117.45505346800007,
+            36.33044374900004
+          ],
+          [
+            117.45487784000011,
+            36.330531239000038
+          ],
+          [
+            117.45486133800011,
+            36.330554839000058
+          ],
+          [
+            117.45478929600006,
+            36.330657872000074
+          ],
+          [
+            117.45530655100004,
+            36.331051656000056
+          ],
+          [
+            117.45531552200009,
+            36.33120346700008
+          ],
+          [
+            117.45518336400005,
+            36.331254781000041
+          ],
+          [
+            117.45518373100003,
+            36.331317927000043
+          ],
+          [
+            117.45530918300005,
+            36.331467738000072
+          ],
+          [
+            117.45531251900002,
+            36.331471721000071
+          ],
+          [
+            117.45531031600001,
+            36.331471898000075
+          ],
+          [
+            117.45531198800006,
+            36.331478035000032
+          ],
+          [
+            117.45502454000007,
+            36.331494785000075
+          ],
+          [
+            117.45465333900006,
+            36.331505615000026
+          ],
+          [
+            117.45429302900004,
+            36.33151570900003
+          ],
+          [
+            117.45399502400005,
+            36.331548500000054
+          ],
+          [
+            117.45358894800006,
+            36.331594753000047
+          ],
+          [
+            117.4532424030001,
+            36.331606476000047
+          ],
+          [
+            117.45278415200005,
+            36.331621977000054
+          ],
+          [
+            117.45263608100004,
+            36.331614693000063
+          ],
+          [
+            117.45224109700007,
+            36.331573075000051
+          ],
+          [
+            117.45184100100005,
+            36.331593415000043
+          ],
+          [
+            117.45166379000011,
+            36.331643407000058
+          ],
+          [
+            117.45157976300004,
+            36.331652228000053
+          ],
+          [
+            117.45134869500009,
+            36.331680021000068
+          ],
+          [
+            117.45102079500009,
+            36.331670275000079
+          ],
+          [
+            117.45067198600009,
+            36.331650053000033
+          ],
+          [
+            117.45067020400006,
+            36.331664162000038
+          ],
+          [
+            117.45065416200009,
+            36.331662832000063
+          ],
+          [
+            117.45061806500007,
+            36.331659838000064
+          ],
+          [
+            117.45061016900002,
+            36.331782238000073
+          ],
+          [
+            117.45057747200008,
+            36.331841036000071
+          ],
+          [
+            117.45054952400005,
+            36.331871481000064
+          ],
+          [
+            117.45053475700001,
+            36.331883541000025
+          ],
+          [
+            117.45051861800005,
+            36.331890147000024
+          ],
+          [
+            117.45048542800009,
+            36.331894053000042
+          ],
+          [
+            117.45040014800009,
+            36.331884863000028
+          ],
+          [
+            117.45032510500005,
+            36.331892740000058
+          ],
+          [
+            117.45025262800004,
+            36.331905491000043
+          ],
+          [
+            117.45019797600003,
+            36.331923663000055
+          ],
+          [
+            117.45016389700004,
+            36.331953042000066
+          ],
+          [
+            117.45014835400002,
+            36.331989681000039
+          ],
+          [
+            117.4501757920001,
+            36.332142565000026
+          ],
+          [
+            117.45019316900004,
+            36.33216709900006
+          ],
+          [
+            117.45020108900007,
+            36.332178282000029
+          ],
+          [
+            117.45022158200004,
+            36.332183774000043
+          ],
+          [
+            117.45019709300004,
+            36.332193807000067
+          ],
+          [
+            117.45007723700007,
+            36.332177566000041
+          ],
+          [
+            117.44987035400004,
+            36.332165949000057
+          ],
+          [
+            117.44951301100002,
+            36.332145883000067
+          ],
+          [
+            117.44903792200012,
+            36.332119202000058
+          ],
+          [
+            117.44894878600007,
+            36.332114196000077
+          ],
+          [
+            117.44841461100009,
+            36.332058091000079
+          ],
+          [
+            117.44836429000009,
+            36.332283234000045
+          ],
+          [
+            117.44835617800004,
+            36.332315206000033
+          ],
+          [
+            117.44832238100003,
+            36.332448408000062
+          ],
+          [
+            117.4483088720001,
+            36.33250165100003
+          ],
+          [
+            117.44822540400003,
+            36.332589261000066
+          ],
+          [
+            117.44822290500008,
+            36.332591884000067
+          ],
+          [
+            117.44814858600012,
+            36.332669890000034
+          ],
+          [
+            117.44812704300011,
+            36.332930741000041
+          ],
+          [
+            117.44798318000005,
+            36.332949907000057
+          ],
+          [
+            117.44782235800005,
+            36.333025015000032
+          ],
+          [
+            117.44769862800001,
+            36.33329715800005
+          ],
+          [
+            117.44776693300003,
+            36.33332976500003
+          ],
+          [
+            117.44791709100002,
+            36.333388090000028
+          ],
+          [
+            117.44792281500008,
+            36.333454986000049
+          ],
+          [
+            117.44785823200004,
+            36.333521709000024
+          ],
+          [
+            117.44793411400008,
+            36.333562874000052
+          ],
+          [
+            117.4479369500001,
+            36.33356374400006
+          ],
+          [
+            117.44803844500007,
+            36.33359486300003
+          ],
+          [
+            117.44808691200001,
+            36.333690500000046
+          ],
+          [
+            117.44808976200011,
+            36.333696125000074
+          ],
+          [
+            117.4484684900001,
+            36.333697298000061
+          ],
+          [
+            117.44848144400009,
+            36.333697338000036
+          ],
+          [
+            117.44847924500004,
+            36.333719444000053
+          ],
+          [
+            117.44847239300009,
+            36.333788322000032
+          ],
+          [
+            117.44846513700008,
+            36.333861256000034
+          ],
+          [
+            117.4483707710001,
+            36.334112005000065
+          ],
+          [
+            117.44837081500009,
+            36.334112118000064
+          ],
+          [
+            117.44842152100011,
+            36.334243595000032
+          ],
+          [
+            117.44845019400009,
+            36.334317942000041
+          ],
+          [
+            117.44850755400012,
+            36.33446667000004
+          ],
+          [
+            117.44854586300005,
+            36.334566000000052
+          ],
+          [
+            117.44857726400005,
+            36.334647420000067
+          ],
+          [
+            117.44859097000005,
+            36.33468295800003
+          ],
+          [
+            117.44830669800001,
+            36.33480636400003
+          ],
+          [
+            117.44830729500006,
+            36.334910568000055
+          ],
+          [
+            117.44830745600007,
+            36.334938695000062
+          ],
+          [
+            117.44830761600008,
+            36.33496669200008
+          ],
+          [
+            117.44848943400007,
+            36.335091485000078
+          ],
+          [
+            117.44878173400002,
+            36.335177582000028
+          ],
+          [
+            117.44897993500001,
+            36.335259169000039
+          ],
+          [
+            117.44955066400007,
+            36.335493755000073
+          ],
+          [
+            117.44955121500004,
+            36.335494330000074
+          ],
+          [
+            117.44955133000008,
+            36.335494377000032
+          ],
+          [
+            117.44991135200007,
+            36.335850082000036
+          ],
+          [
+            117.45027137700004,
+            36.33620578600005
+          ],
+          [
+            117.45047184400005,
+            36.336403845000063
+          ],
+          [
+            117.4509036820001,
+            36.336830490000068
+          ],
+          [
+            117.45105291800007,
+            36.336977930000046
+          ],
+          [
+            117.45111231400006,
+            36.337036612000077
+          ],
+          [
+            117.45156962900001,
+            36.337488419000067
+          ],
+          [
+            117.45155745200009,
+            36.337496820000069
+          ],
+          [
+            117.45155933100011,
+            36.337498577000076
+          ],
+          [
+            117.45193822700003,
+            36.337852888000043
+          ],
+          [
+            117.45194246900007,
+            36.337856854000051
+          ],
+          [
+            117.45194330200002,
+            36.337857971000062
+          ],
+          [
+            117.45194716200001,
+            36.337877543000047
+          ],
+          [
+            117.45202084100004,
+            36.338251004000028
+          ],
+          [
+            117.45203391400003,
+            36.338317268000026
+          ],
+          [
+            117.45214516800002,
+            36.338881176000029
+          ],
+          [
+            117.45225642300011,
+            36.339445083000044
+          ],
+          [
+            117.45226539800001,
+            36.339451451000059
+          ],
+          [
+            117.45230561000005,
+            36.339479985000025
+          ],
+          [
+            117.452411299,
+            36.33955497900007
+          ],
+          [
+            117.45258948700007,
+            36.339681416000076
+          ],
+          [
+            117.45229102900009,
+            36.339930378000076
+          ],
+          [
+            117.45228708000002,
+            36.339933673000075
+          ],
+          [
+            117.45219178100001,
+            36.340085572000078
+          ],
+          [
+            117.4521655420001,
+            36.340127395000025
+          ],
+          [
+            117.45202415100005,
+            36.340352759000041
+          ],
+          [
+            117.45211409400008,
+            36.340521914000078
+          ],
+          [
+            117.45214622100002,
+            36.340582336000068
+          ],
+          [
+            117.45270728900005,
+            36.340663864000078
+          ],
+          [
+            117.45254532100012,
+            36.34099210800008
+          ],
+          [
+            117.45203554300008,
+            36.34099403700003
+          ],
+          [
+            117.45174325000005,
+            36.340995142000054
+          ],
+          [
+            117.45201652700007,
+            36.341157779000071
+          ],
+          [
+            117.45224077700004,
+            36.341291239000043
+          ],
+          [
+            117.45229933600001,
+            36.341326089000063
+          ],
+          [
+            117.4522998220001,
+            36.341326183000035
+          ],
+          [
+            117.45238134500005,
+            36.341341917000079
+          ],
+          [
+            117.45309259600003,
+            36.341479181000068
+          ],
+          [
+            117.45313981900006,
+            36.341483452000034
+          ],
+          [
+            117.45350551600006,
+            36.341551692000053
+          ],
+          [
+            117.45364608400007,
+            36.341577921000066
+          ],
+          [
+            117.45407748000002,
+            36.341658418000065
+          ],
+          [
+            117.45476633300007,
+            36.341730434000056
+          ],
+          [
+            117.45490490700001,
+            36.341781734000051
+          ],
+          [
+            117.45497822800007,
+            36.341808876000073
+          ],
+          [
+            117.45537875500008,
+            36.341957099000069
+          ],
+          [
+            117.45537875700006,
+            36.341957149000052
+          ],
+          [
+            117.45538383600001,
+            36.342034349000073
+          ],
+          [
+            117.45538491800005,
+            36.342050801000028
+          ],
+          [
+            117.45542474700005,
+            36.342656257000044
+          ],
+          [
+            117.45524668500002,
+            36.342679326000052
+          ],
+          [
+            117.45472831200004,
+            36.342746480000073
+          ],
+          [
+            117.45403187700003,
+            36.342836700000078
+          ],
+          [
+            117.45333543900006,
+            36.342926915000078
+          ],
+          [
+            117.45330364800009,
+            36.342928048000033
+          ],
+          [
+            117.45278125700008,
+            36.34294664500004
+          ],
+          [
+            117.45276790800006,
+            36.342947120000076
+          ],
+          [
+            117.45272681100005,
+            36.342942108000045
+          ],
+          [
+            117.45262219200004,
+            36.343216178000034
+          ],
+          [
+            117.45253458600007,
+            36.343557875000045
+          ],
+          [
+            117.45244697900011,
+            36.343899572000055
+          ],
+          [
+            117.45248177600001,
+            36.343903960000034
+          ],
+          [
+            117.4529653190001,
+            36.343963255000062
+          ],
+          [
+            117.45344886400005,
+            36.344022549000044
+          ],
+          [
+            117.45342175600001,
+            36.344066929000064
+          ],
+          [
+            117.45339090900006,
+            36.344247642000028
+          ],
+          [
+            117.45340421900005,
+            36.344247592000045
+          ],
+          [
+            117.45358961000011,
+            36.344246890000079
+          ],
+          [
+            117.4536943280001,
+            36.344246493000071
+          ],
+          [
+            117.45375764700009,
+            36.344246254000041
+          ],
+          [
+            117.45398550800007,
+            36.344229838000047
+          ],
+          [
+            117.45428681500005,
+            36.344208130000027
+          ],
+          [
+            117.45433669500005,
+            36.344224052000072
+          ],
+          [
+            117.45438486300009,
+            36.344239427000048
+          ],
+          [
+            117.45439863900003,
+            36.344243825000035
+          ],
+          [
+            117.45439943100007,
+            36.34424449800008
+          ],
+          [
+            117.45439980000003,
+            36.344244813000046
+          ],
+          [
+            117.4544130920001,
+            36.344256131000066
+          ],
+          [
+            117.4547575900001,
+            36.344549478000033
+          ],
+          [
+            117.45482503400001,
+            36.344558909000057
+          ],
+          [
+            117.45482512000001,
+            36.344569639000042
+          ],
+          [
+            117.45501704700007,
+            36.344572716000073
+          ],
+          [
+            117.45491342800005,
+            36.34487792300007
+          ],
+          [
+            117.45513545200004,
+            36.344903689000034
+          ],
+          [
+            117.45516018800004,
+            36.344906560000027
+          ],
+          [
+            117.45520202800003,
+            36.345278239000038
+          ],
+          [
+            117.45510363200003,
+            36.345355790000042
+          ],
+          [
+            117.45502582300003,
+            36.345548676000078
+          ],
+          [
+            117.45488889800004,
+            36.345888098000046
+          ],
+          [
+            117.45472257500001,
+            36.345891933000075
+          ],
+          [
+            117.45476579500007,
+            36.34630856800004
+          ],
+          [
+            117.45480260000011,
+            36.346663356000079
+          ],
+          [
+            117.45533467300004,
+            36.346452828000054
+          ],
+          [
+            117.45534117300008,
+            36.346450256000026
+          ],
+          [
+            117.45551075200001,
+            36.346351387000027
+          ],
+          [
+            117.45561483400002,
+            36.346280328000034
+          ],
+          [
+            117.45570724100003,
+            36.346217238000065
+          ],
+          [
+            117.45602602600002,
+            36.34599958900003
+          ],
+          [
+            117.45602613800008,
+            36.345635495000067
+          ],
+          [
+            117.45608062800011,
+            36.34556475200003
+          ],
+          [
+            117.45617908600002,
+            36.345508317000053
+          ],
+          [
+            117.45638209100002,
+            36.345527062000031
+          ],
+          [
+            117.4565645350001,
+            36.345609979000074
+          ],
+          [
+            117.45661431500002,
+            36.34554025500006
+          ],
+          [
+            117.45665705900001,
+            36.345466001000034
+          ],
+          [
+            117.45671634500002,
+            36.345210663000046
+          ],
+          [
+            117.4567432660001,
+            36.345185192000031
+          ],
+          [
+            117.45674378000001,
+            36.34518337600008
+          ],
+          [
+            117.45677987300007,
+            36.34499723600004
+          ],
+          [
+            117.45680852200007,
+            36.344849488000079
+          ],
+          [
+            117.45681107300004,
+            36.344836328000042
+          ],
+          [
+            117.45684556000003,
+            36.344517820000078
+          ],
+          [
+            117.45685473200001,
+            36.344445634000067
+          ],
+          [
+            117.45685857700005,
+            36.34441537500004
+          ],
+          [
+            117.45686027700003,
+            36.344385021000051
+          ],
+          [
+            117.45686093900008,
+            36.344379403000062
+          ],
+          [
+            117.45683228900009,
+            36.344342385000061
+          ],
+          [
+            117.45683710500009,
+            36.344140923000054
+          ],
+          [
+            117.45680659800007,
+            36.343870224000057
+          ],
+          [
+            117.45680554600006,
+            36.343860899000049
+          ],
+          [
+            117.45742847600002,
+            36.343541090000031
+          ],
+          [
+            117.4578846280001,
+            36.343306900000073
+          ],
+          [
+            117.45803145800005,
+            36.343467271000065
+          ],
+          [
+            117.45804116200009,
+            36.343477872000051
+          ],
+          [
+            117.45810144900008,
+            36.343518005000078
+          ],
+          [
+            117.45841621700004,
+            36.343434716000047
+          ],
+          [
+            117.45848075900005,
+            36.34342928600006
+          ],
+          [
+            117.45849095200003,
+            36.343428456000026
+          ],
+          [
+            117.45852630800005,
+            36.34370395600007
+          ],
+          [
+            117.45850928600009,
+            36.344039447000057
+          ],
+          [
+            117.45849060500007,
+            36.344241500000066
+          ],
+          [
+            117.45849412200005,
+            36.344765633000065
+          ],
+          [
+            117.45849577600006,
+            36.34501212400005
+          ],
+          [
+            117.4584966000001,
+            36.345134794000046
+          ],
+          [
+            117.45897943700004,
+            36.345144807000054
+          ],
+          [
+            117.45900397800006,
+            36.345145316000071
+          ],
+          [
+            117.45964035100008,
+            36.345156951000035
+          ],
+          [
+            117.4602767240001,
+            36.345168582000042
+          ],
+          [
+            117.46030462200008,
+            36.345169092000049
+          ],
+          [
+            117.46030855800007,
+            36.345169164000026
+          ],
+          [
+            117.46032513300008,
+            36.345128331000069
+          ],
+          [
+            117.46034429000008,
+            36.345130417000064
+          ],
+          [
+            117.46110148100001,
+            36.345212833000062
+          ],
+          [
+            117.46109641600003,
+            36.345333507000078
+          ],
+          [
+            117.46109399500006,
+            36.345391169000038
+          ],
+          [
+            117.46127484800002,
+            36.345388718000038
+          ],
+          [
+            117.46160530200007,
+            36.345384239000055
+          ],
+          [
+            117.46180352300007,
+            36.34538155100006
+          ],
+          [
+            117.46234389000006,
+            36.345386341000051
+          ],
+          [
+            117.46245452400001,
+            36.345385517000068
+          ],
+          [
+            117.46247294200009,
+            36.345386278000035
+          ],
+          [
+            117.46264578900002,
+            36.345393428000079
+          ],
+          [
+            117.46269909000011,
+            36.345383155000036
+          ],
+          [
+            117.46270212000002,
+            36.345293986000058
+          ],
+          [
+            117.46275325900001,
+            36.34528309500007
+          ],
+          [
+            117.46281665400011,
+            36.345269595000048
+          ],
+          [
+            117.46309550900003,
+            36.345610156000077
+          ],
+          [
+            117.46337436700003,
+            36.345950717000051
+          ],
+          [
+            117.46337528900006,
+            36.345951844000069
+          ],
+          [
+            117.46385632500005,
+            36.346140879000075
+          ],
+          [
+            117.46391058400002,
+            36.346162201000027
+          ],
+          [
+            117.46438113700003,
+            36.346347115000071
+          ],
+          [
+            117.46438234400011,
+            36.346347589000061
+          ],
+          [
+            117.46477581800002,
+            36.346031018000076
+          ],
+          [
+            117.46516928800008,
+            36.345714445000056
+          ],
+          [
+            117.46556275600005,
+            36.345397870000056
+          ],
+          [
+            117.46557856800007,
+            36.345393048000062
+          ],
+          [
+            117.46581881200007,
+            36.345500437000055
+          ],
+          [
+            117.46585452800002,
+            36.345516409000027
+          ],
+          [
+            117.46586505200003,
+            36.345521116000043
+          ],
+          [
+            117.46587860300008,
+            36.345527176000076
+          ],
+          [
+            117.46589227800007,
+            36.345533291000038
+          ],
+          [
+            117.4659041220001,
+            36.345538591000036
+          ],
+          [
+            117.46590680200006,
+            36.345539789000043
+          ],
+          [
+            117.46592782000005,
+            36.345549187000074
+          ],
+          [
+            117.46596264100003,
+            36.345564725000031
+          ],
+          [
+            117.46614214800002,
+            36.345692671000052
+          ],
+          [
+            117.46623535800006,
+            36.345759108000038
+          ],
+          [
+            117.4662653900001,
+            36.345768264000071
+          ],
+          [
+            117.4663333100001,
+            36.345788971000047
+          ],
+          [
+            117.46637934600005,
+            36.34580300500005
+          ],
+          [
+            117.46658658000001,
+            36.345819297000048
+          ],
+          [
+            117.46682335800006,
+            36.345954984000059
+          ],
+          [
+            117.46687046800002,
+            36.345981980000033
+          ],
+          [
+            117.4669346610001,
+            36.346030093000024
+          ],
+          [
+            117.46694988100001,
+            36.346041500000069
+          ],
+          [
+            117.46694999500005,
+            36.346041587000059
+          ],
+          [
+            117.46696925100002,
+            36.34605601800007
+          ],
+          [
+            117.46697632100006,
+            36.34605846900007
+          ],
+          [
+            117.46698741600005,
+            36.34606231500004
+          ],
+          [
+            117.4669955600001,
+            36.346065138000029
+          ],
+          [
+            117.46721084400008,
+            36.346139764000043
+          ],
+          [
+            117.46746204600004,
+            36.346238870000036
+          ],
+          [
+            117.46746246100008,
+            36.346239764000075
+          ],
+          [
+            117.46753692800007,
+            36.346400366000069
+          ],
+          [
+            117.46757131000004,
+            36.346474516000058
+          ],
+          [
+            117.46757197800002,
+            36.346475185000031
+          ],
+          [
+            117.46776888900001,
+            36.34644693000007
+          ],
+          [
+            117.46796198800007,
+            36.346402008000041
+          ],
+          [
+            117.46823511400009,
+            36.346359481000036
+          ],
+          [
+            117.46827551100012,
+            36.346353191000048
+          ],
+          [
+            117.46828841200011,
+            36.346356595000032
+          ],
+          [
+            117.46829967000008,
+            36.346359566000046
+          ],
+          [
+            117.46833296000011,
+            36.346368351000024
+          ],
+          [
+            117.46833383300009,
+            36.346390989000042
+          ],
+          [
+            117.46841195900004,
+            36.34638912500003
+          ],
+          [
+            117.46856922400002,
+            36.346385595000072
+          ],
+          [
+            117.4687973340001,
+            36.346382435000066
+          ],
+          [
+            117.46882351000011,
+            36.346391521000044
+          ],
+          [
+            117.46884267400003,
+            36.346444624000071
+          ],
+          [
+            117.46886947300004,
+            36.346468704000074
+          ],
+          [
+            117.46885832900011,
+            36.34648780200007
+          ],
+          [
+            117.46886598200001,
+            36.346509008000055
+          ],
+          [
+            117.46892817100002,
+            36.346953126000074
+          ],
+          [
+            117.46892330200001,
+            36.346984576000068
+          ],
+          [
+            117.46886234800002,
+            36.347377838000057
+          ],
+          [
+            117.46881140200003,
+            36.347872614000039
+          ],
+          [
+            117.46880950400009,
+            36.347927859000038
+          ],
+          [
+            117.46879579400002,
+            36.348025367000048
+          ],
+          [
+            117.46876504400007,
+            36.348244064000028
+          ],
+          [
+            117.46876037000004,
+            36.348299736000058
+          ],
+          [
+            117.4687332960001,
+            36.348622208000052
+          ],
+          [
+            117.46871453400001,
+            36.348792486000036
+          ],
+          [
+            117.46871322000004,
+            36.348804401000052
+          ],
+          [
+            117.46871227300005,
+            36.348824295000043
+          ],
+          [
+            117.46941258700008,
+            36.348797156000046
+          ],
+          [
+            117.46987020600011,
+            36.348779419000039
+          ],
+          [
+            117.47043078900003,
+            36.34875769000007
+          ],
+          [
+            117.47078255300005,
+            36.348759858000051
+          ],
+          [
+            117.47093314200004,
+            36.348752472000058
+          ],
+          [
+            117.47109142600004,
+            36.348783825000055
+          ],
+          [
+            117.47113187100001,
+            36.348787644000026
+          ],
+          [
+            117.47113016700007,
+            36.348777128000052
+          ],
+          [
+            117.47130399500008,
+            36.348746506000055
+          ],
+          [
+            117.47133810800005,
+            36.348740497000051
+          ],
+          [
+            117.47134270200002,
+            36.348740875000033
+          ],
+          [
+            117.47181559500007,
+            36.348779770000078
+          ],
+          [
+            117.47180383900002,
+            36.348843312000042
+          ],
+          [
+            117.47167458200011,
+            36.348980714000049
+          ],
+          [
+            117.47165239300011,
+            36.349066874000073
+          ],
+          [
+            117.47162863900007,
+            36.349159109000027
+          ],
+          [
+            117.47155074300008,
+            36.349461575000078
+          ],
+          [
+            117.4715598030001,
+            36.349486759000058
+          ],
+          [
+            117.47156647400004,
+            36.349505308000062
+          ],
+          [
+            117.47156820000009,
+            36.349510106000025
+          ],
+          [
+            117.4715687480001,
+            36.349511628000073
+          ],
+          [
+            117.47157810600004,
+            36.349537643000076
+          ],
+          [
+            117.47158082800001,
+            36.349545212000066
+          ],
+          [
+            117.47158451300004,
+            36.349555455000029
+          ],
+          [
+            117.47159317800003,
+            36.34957954500004
+          ],
+          [
+            117.47159293800007,
+            36.349588906000065
+          ],
+          [
+            117.47159268500002,
+            36.349598765000053
+          ],
+          [
+            117.47159101800003,
+            36.34966365300005
+          ],
+          [
+            117.47158974800004,
+            36.349713118000068
+          ],
+          [
+            117.47160914800008,
+            36.349802419000071
+          ],
+          [
+            117.47161762300004,
+            36.349841427000058
+          ],
+          [
+            117.47162022500004,
+            36.349853405000033
+          ],
+          [
+            117.47163322400002,
+            36.349864396000044
+          ],
+          [
+            117.4718143560001,
+            36.350131078000061
+          ],
+          [
+            117.47196041500001,
+            36.350128829000028
+          ],
+          [
+            117.4721452770001,
+            36.350125983000055
+          ],
+          [
+            117.4721469540001,
+            36.35033512800004
+          ],
+          [
+            117.47215236300008,
+            36.350344449000033
+          ],
+          [
+            117.47240743800012,
+            36.350521522000065
+          ],
+          [
+            117.47239988000001,
+            36.350546206000047
+          ],
+          [
+            117.47240405500008,
+            36.350549547000071
+          ],
+          [
+            117.47237611000003,
+            36.350628407000045
+          ],
+          [
+            117.47242083000003,
+            36.350638074000074
+          ],
+          [
+            117.47258756800011,
+            36.350683351000043
+          ],
+          [
+            117.47240986500003,
+            36.351254418000053
+          ],
+          [
+            117.47261540300008,
+            36.351258173000076
+          ],
+          [
+            117.47253377200002,
+            36.351832781000041
+          ],
+          [
+            117.47281709400011,
+            36.351837857000078
+          ],
+          [
+            117.47281813500001,
+            36.351851134000071
+          ],
+          [
+            117.47283436900011,
+            36.351852144000077
+          ],
+          [
+            117.47285675300009,
+            36.352196582000033
+          ],
+          [
+            117.47287913700006,
+            36.352541020000047
+          ],
+          [
+            117.47336308200011,
+            36.352529570000058
+          ]
+        ]
+      },
+      "properties" : {
+        "OBJECTID_1" : 1,
+        "FID_寨里" : 0,
+        "OBJECTID" : 736,
+        "BSM" : "370116124000000707",
+        "YSDM" : "1000600400",
+        "ZLDWDM" : "3701161070180000000",
+        "ZLDWMC" : "后裴王村",
+        "DCMJ" : 736632.79000000004,
+        "JSMJ" : 736632.79000000004,
+        "MSSM" : "00",
+        "HDMC" : " ",
+        "BZ" : " ",
+        "SHAPE_Leng" : 8630.5993617999993,
+        "Shape_Length" : 0.15936124929188195
+      }
+    }
+  ]
+}

BIN
public/jt3dSDK/imgs/wallmaterial/color.png


BIN
public/jt3dSDK/imgs/wallmaterial/jsx.png


BIN
public/jt3dSDK/imgs/wallmaterial/wl.png


+ 3142 - 0
src/assets/dataFile/fanweixian2.json

@@ -0,0 +1,3142 @@
+{
+  "type" : "FeatureCollection",
+  "features" : [
+    {
+      "type" : "Feature",
+      "id" : 1,
+      "geometry" : {
+        "type" : "LineString",
+        "coordinates" : [
+          [
+            117.47336308200011,
+            36.352529570000058
+          ],
+          [
+            117.47336308500007,
+            36.352528874000029
+          ],
+          [
+            117.47339541500003,
+            36.352528954000036
+          ],
+          [
+            117.47384343100009,
+            36.352530056000035
+          ],
+          [
+            117.47384294400001,
+            36.352520489000028
+          ],
+          [
+            117.47395964800012,
+            36.352518281000073
+          ],
+          [
+            117.47395441800006,
+            36.352136155000039
+          ],
+          [
+            117.47394918900011,
+            36.351754028000073
+          ],
+          [
+            117.47394749300008,
+            36.351630140000054
+          ],
+          [
+            117.47394740700008,
+            36.351623891000031
+          ],
+          [
+            117.47461353600011,
+            36.351574719000041
+          ],
+          [
+            117.47463257400011,
+            36.351573313000074
+          ],
+          [
+            117.47465221000004,
+            36.351572092000026
+          ],
+          [
+            117.47469385300008,
+            36.351569501000029
+          ],
+          [
+            117.47472376500002,
+            36.351567640000042
+          ],
+          [
+            117.47507317100008,
+            36.35154590500008
+          ],
+          [
+            117.47514949600009,
+            36.351541157000042
+          ],
+          [
+            117.47542164200001,
+            36.351524227000027
+          ],
+          [
+            117.47542140000007,
+            36.351507294000044
+          ],
+          [
+            117.4754207520001,
+            36.35146194400005
+          ],
+          [
+            117.47545306600011,
+            36.351434404000031
+          ],
+          [
+            117.4755319620001,
+            36.351425708000079
+          ],
+          [
+            117.47557390100008,
+            36.35141486100008
+          ],
+          [
+            117.47590710500003,
+            36.35136921700007
+          ],
+          [
+            117.47597634200008,
+            36.351367010000047
+          ],
+          [
+            117.47600454000008,
+            36.351363311000057
+          ],
+          [
+            117.47613873100011,
+            36.351341808000029
+          ],
+          [
+            117.47677775300008,
+            36.351257174000068
+          ],
+          [
+            117.47717299700003,
+            36.351208103000033
+          ],
+          [
+            117.47756824200007,
+            36.351159032000055
+          ],
+          [
+            117.47801430600009,
+            36.351101570000026
+          ],
+          [
+            117.47801842600006,
+            36.35109736000004
+          ],
+          [
+            117.47801879500003,
+            36.351095281000028
+          ],
+          [
+            117.47801355500008,
+            36.35107780800007
+          ],
+          [
+            117.47790372600002,
+            36.350758370000051
+          ],
+          [
+            117.47779389600009,
+            36.350438932000031
+          ],
+          [
+            117.47778569900004,
+            36.350415092000048
+          ],
+          [
+            117.47777401600001,
+            36.350381111000047
+          ],
+          [
+            117.47756529200001,
+            36.34977402800007
+          ],
+          [
+            117.47753655500003,
+            36.349689827000077
+          ],
+          [
+            117.47753337200004,
+            36.349680500000034
+          ],
+          [
+            117.47752370000001,
+            36.349652160000062
+          ],
+          [
+            117.47751752800002,
+            36.349634076000029
+          ],
+          [
+            117.47734132700009,
+            36.349117791000026
+          ],
+          [
+            117.47716512800002,
+            36.348601505000033
+          ],
+          [
+            117.47710428300002,
+            36.348373135000031
+          ],
+          [
+            117.47707709800011,
+            36.348245120000058
+          ],
+          [
+            117.47706911200009,
+            36.34820751400008
+          ],
+          [
+            117.47706337900001,
+            36.348180521000074
+          ],
+          [
+            117.47699304700006,
+            36.34784932000008
+          ],
+          [
+            117.47698611700002,
+            36.347816685000055
+          ],
+          [
+            117.47700193900005,
+            36.34781640500006
+          ],
+          [
+            117.47705876700002,
+            36.347815397000033
+          ],
+          [
+            117.47765875700009,
+            36.347804753000048
+          ],
+          [
+            117.47825874800003,
+            36.347794106000038
+          ],
+          [
+            117.4788587380001,
+            36.347783456000059
+          ],
+          [
+            117.47888711400003,
+            36.347782952000045
+          ],
+          [
+            117.47892456300008,
+            36.34778228700003
+          ],
+          [
+            117.47892675500009,
+            36.347782289000065
+          ],
+          [
+            117.47893486700002,
+            36.347794467000028
+          ],
+          [
+            117.47893919100011,
+            36.347808729000064
+          ],
+          [
+            117.47895124500008,
+            36.347830516000045
+          ],
+          [
+            117.47896611500005,
+            36.347843221000062
+          ],
+          [
+            117.4789926630001,
+            36.347846691000029
+          ],
+          [
+            117.47903687400003,
+            36.347846514000025
+          ],
+          [
+            117.47920190500008,
+            36.347842276000051
+          ],
+          [
+            117.47934051700008,
+            36.34783870900003
+          ],
+          [
+            117.47934242100007,
+            36.347251976000052
+          ],
+          [
+            117.47964942300007,
+            36.347251697000047
+          ],
+          [
+            117.48010845400006,
+            36.347251278000044
+          ],
+          [
+            117.48012104000009,
+            36.347251266000058
+          ],
+          [
+            117.48015595000004,
+            36.347251235000044
+          ],
+          [
+            117.4801631360001,
+            36.347251229000051
+          ],
+          [
+            117.48019089000002,
+            36.347251203000042
+          ],
+          [
+            117.48039008000001,
+            36.347251021000034
+          ],
+          [
+            117.48043647200006,
+            36.346703091000052
+          ],
+          [
+            117.48048286300002,
+            36.34615516100007
+          ],
+          [
+            117.48052925400009,
+            36.345607231000031
+          ],
+          [
+            117.48057780700003,
+            36.345033760000035
+          ],
+          [
+            117.48062635800011,
+            36.344460290000029
+          ],
+          [
+            117.48067491100005,
+            36.343886818000044
+          ],
+          [
+            117.48072346100003,
+            36.343313347000048
+          ],
+          [
+            117.48077201000001,
+            36.342739876000053
+          ],
+          [
+            117.4808205600001,
+            36.342166405000057
+          ],
+          [
+            117.48133297300001,
+            36.341725729000075
+          ],
+          [
+            117.48184538100008,
+            36.341285053000036
+          ],
+          [
+            117.48235778200001,
+            36.340844373000039
+          ],
+          [
+            117.48287017700011,
+            36.340403692000052
+          ],
+          [
+            117.48338256700004,
+            36.339963008000041
+          ],
+          [
+            117.48389495200001,
+            36.33952232200005
+          ],
+          [
+            117.48440733000007,
+            36.339081633000035
+          ],
+          [
+            117.48485984200011,
+            36.338668928000061
+          ],
+          [
+            117.48531234800009,
+            36.338256221000051
+          ],
+          [
+            117.48576485000001,
+            36.337843511000074
+          ],
+          [
+            117.4862173460001,
+            36.33743080000005
+          ],
+          [
+            117.48667853500001,
+            36.337010156000076
+          ],
+          [
+            117.48713971800009,
+            36.336589509000078
+          ],
+          [
+            117.48714487700011,
+            36.336583266000048
+          ],
+          [
+            117.4871533490001,
+            36.336568258000057
+          ],
+          [
+            117.48737024700006,
+            36.336114830000042
+          ],
+          [
+            117.48758714300004,
+            36.335661401000038
+          ],
+          [
+            117.48758349400009,
+            36.335518360000037
+          ],
+          [
+            117.48747491600011,
+            36.335105492000025
+          ],
+          [
+            117.48736633800002,
+            36.334692622000034
+          ],
+          [
+            117.48725776100002,
+            36.334279752000043
+          ],
+          [
+            117.48707090300002,
+            36.333911466000075
+          ],
+          [
+            117.48688404500001,
+            36.333543180000049
+          ],
+          [
+            117.48697565000009,
+            36.33353730400006
+          ],
+          [
+            117.48714648400005,
+            36.333526346000042
+          ],
+          [
+            117.48720095200008,
+            36.333522853000034
+          ],
+          [
+            117.48751148600002,
+            36.33350293500007
+          ],
+          [
+            117.48768828900006,
+            36.333491594000066
+          ],
+          [
+            117.48795433600003,
+            36.333474527000078
+          ],
+          [
+            117.48797512400006,
+            36.33347223100003
+          ],
+          [
+            117.48799963600004,
+            36.333469524000066
+          ],
+          [
+            117.48856469900011,
+            36.333407100000045
+          ],
+          [
+            117.48856644300008,
+            36.333414404000052
+          ],
+          [
+            117.48861369200006,
+            36.333670865000045
+          ],
+          [
+            117.48863217200005,
+            36.333771175000038
+          ],
+          [
+            117.48866782300001,
+            36.333964674000072
+          ],
+          [
+            117.48879484400004,
+            36.333947993000038
+          ],
+          [
+            117.48954414400009,
+            36.333864991000041
+          ],
+          [
+            117.48948395400009,
+            36.333485913000061
+          ],
+          [
+            117.48945580900011,
+            36.333308653000074
+          ],
+          [
+            117.48944653100011,
+            36.333230912000033
+          ],
+          [
+            117.48954771900003,
+            36.333220277000066
+          ],
+          [
+            117.48939917400003,
+            36.332807238000044
+          ],
+          [
+            117.48921832800011,
+            36.332304381000029
+          ],
+          [
+            117.48903748500004,
+            36.331801523000024
+          ],
+          [
+            117.48902804500005,
+            36.331775272000073
+          ],
+          [
+            117.48888483500002,
+            36.331377054000029
+          ],
+          [
+            117.48886573600009,
+            36.331323945000065
+          ],
+          [
+            117.48878409300005,
+            36.33109692000005
+          ],
+          [
+            117.48874162600009,
+            36.330978835000053
+          ],
+          [
+            117.4887319720001,
+            36.330951992000053
+          ],
+          [
+            117.48869524200006,
+            36.330849855000054
+          ],
+          [
+            117.48868551100009,
+            36.330822793000038
+          ],
+          [
+            117.48859619200005,
+            36.330574421000051
+          ],
+          [
+            117.48858984000003,
+            36.33057444700006
+          ],
+          [
+            117.48856153800011,
+            36.330542947000026
+          ],
+          [
+            117.48853770500011,
+            36.330493555000032
+          ],
+          [
+            117.48841291000008,
+            36.330059126000037
+          ],
+          [
+            117.4882765750001,
+            36.329664068000056
+          ],
+          [
+            117.48826290800002,
+            36.329624461000037
+          ],
+          [
+            117.48826094300011,
+            36.329618770000025
+          ],
+          [
+            117.48815764500011,
+            36.329664457000035
+          ],
+          [
+            117.48778461600011,
+            36.32980619600005
+          ],
+          [
+            117.48764765700002,
+            36.32983617900004
+          ],
+          [
+            117.48738324200008,
+            36.329537192000032
+          ],
+          [
+            117.4871188300001,
+            36.329238203000045
+          ],
+          [
+            117.48657260000004,
+            36.329662666000047
+          ],
+          [
+            117.48602636400005,
+            36.33008712600008
+          ],
+          [
+            117.48567054000011,
+            36.330066444000067
+          ],
+          [
+            117.48555137200003,
+            36.330059517000052
+          ],
+          [
+            117.48554238500003,
+            36.330058995000059
+          ],
+          [
+            117.48536664900007,
+            36.330066104000025
+          ],
+          [
+            117.48527515800004,
+            36.33006980600004
+          ],
+          [
+            117.48509822400001,
+            36.330076964000057
+          ],
+          [
+            117.48495281800001,
+            36.330082846000039
+          ],
+          [
+            117.48488719600005,
+            36.330085500000052
+          ],
+          [
+            117.48440774300002,
+            36.330104893000055
+          ],
+          [
+            117.48439606900001,
+            36.330084258000056
+          ],
+          [
+            117.48417891500003,
+            36.330088362000026
+          ],
+          [
+            117.48398359700002,
+            36.330092053000044
+          ],
+          [
+            117.48363989000006,
+            36.330098547000034
+          ],
+          [
+            117.48348686300005,
+            36.330093807000026
+          ],
+          [
+            117.48347339700001,
+            36.330093390000059
+          ],
+          [
+            117.48345765900001,
+            36.330092824000076
+          ],
+          [
+            117.48341909500004,
+            36.329417608000028
+          ],
+          [
+            117.48346040700005,
+            36.329415813000026
+          ],
+          [
+            117.48364368900002,
+            36.329407849000063
+          ],
+          [
+            117.48416816700001,
+            36.329385058000071
+          ],
+          [
+            117.48416779600007,
+            36.329378775000066
+          ],
+          [
+            117.48416619900001,
+            36.329351727000073
+          ],
+          [
+            117.48413003000007,
+            36.328739084000063
+          ],
+          [
+            117.48409386300011,
+            36.328126443000031
+          ],
+          [
+            117.48409303000005,
+            36.32811231900007
+          ],
+          [
+            117.48409070100001,
+            36.328072868000049
+          ],
+          [
+            117.48406485200007,
+            36.327634995000039
+          ],
+          [
+            117.48406325400003,
+            36.327607945000068
+          ],
+          [
+            117.48403900200003,
+            36.32719712100004
+          ],
+          [
+            117.48403777100009,
+            36.327176283000028
+          ],
+          [
+            117.48337054800004,
+            36.327194298000052
+          ],
+          [
+            117.48336889300003,
+            36.327171612000029
+          ],
+          [
+            117.483328873,
+            36.326623006000034
+          ],
+          [
+            117.48328885400008,
+            36.326074399000049
+          ],
+          [
+            117.48328859300011,
+            36.326070823000066
+          ],
+          [
+            117.48270826700002,
+            36.326083609000079
+          ],
+          [
+            117.48212794100004,
+            36.326096393000057
+          ],
+          [
+            117.48209046600005,
+            36.326095098000053
+          ],
+          [
+            117.48208885500003,
+            36.326063960000056
+          ],
+          [
+            117.4820618440001,
+            36.325511898000059
+          ],
+          [
+            117.4820607150001,
+            36.325490897000066
+          ],
+          [
+            117.48205911800005,
+            36.325461162000067
+          ],
+          [
+            117.4820434180001,
+            36.325168862000055
+          ],
+          [
+            117.48203412900011,
+            36.32505352000004
+          ],
+          [
+            117.48203117000003,
+            36.325016776000041
+          ],
+          [
+            117.48207359700007,
+            36.325015540000038
+          ],
+          [
+            117.48205992500004,
+            36.324882151000054
+          ],
+          [
+            117.4820440630001,
+            36.324839611000073
+          ],
+          [
+            117.48201355500009,
+            36.324798056000077
+          ],
+          [
+            117.48200690900001,
+            36.324717441000075
+          ],
+          [
+            117.48174597700006,
+            36.324386787000037
+          ],
+          [
+            117.48172866100003,
+            36.324296336000032
+          ],
+          [
+            117.48165615200003,
+            36.323921508000069
+          ],
+          [
+            117.48150119700006,
+            36.323291924000046
+          ],
+          [
+            117.48144804100002,
+            36.32329496400007
+          ],
+          [
+            117.48144983900011,
+            36.323352038000053
+          ],
+          [
+            117.48139832100003,
+            36.323315925000031
+          ],
+          [
+            117.48134848300003,
+            36.323300736000078
+          ],
+          [
+            117.48109596300003,
+            36.323203268000043
+          ],
+          [
+            117.48102354000002,
+            36.323204971000052
+          ],
+          [
+            117.48098227200001,
+            36.323205942000072
+          ],
+          [
+            117.48087363500008,
+            36.323208498000042
+          ],
+          [
+            117.48085018800009,
+            36.323000082000078
+          ],
+          [
+            117.48084527500009,
+            36.322956402000045
+          ],
+          [
+            117.48071067000001,
+            36.322968652000043
+          ],
+          [
+            117.48070545400003,
+            36.322952210000039
+          ],
+          [
+            117.4800351130001,
+            36.323001729000055
+          ],
+          [
+            117.4800497760001,
+            36.322992017000047
+          ],
+          [
+            117.48004798300008,
+            36.322982701000058
+          ],
+          [
+            117.48001090500009,
+            36.322983989000079
+          ],
+          [
+            117.47999229800007,
+            36.32283239700007
+          ],
+          [
+            117.48026616600009,
+            36.322814423000068
+          ],
+          [
+            117.48028043200009,
+            36.322813409000048
+          ],
+          [
+            117.48024062700006,
+            36.322532384000056
+          ],
+          [
+            117.48025512000004,
+            36.322529982000049
+          ],
+          [
+            117.48025528000005,
+            36.322531001000073
+          ],
+          [
+            117.48042097500002,
+            36.322514432000048
+          ],
+          [
+            117.48037921800005,
+            36.322231900000077
+          ],
+          [
+            117.48021641700007,
+            36.322244840000053
+          ],
+          [
+            117.48018870700002,
+            36.322247043000061
+          ],
+          [
+            117.48018523100006,
+            36.322247319000041
+          ],
+          [
+            117.48016999300012,
+            36.322109169000043
+          ],
+          [
+            117.48000183700003,
+            36.322112297000047
+          ],
+          [
+            117.47999435400004,
+            36.321936024000024
+          ],
+          [
+            117.47991077000006,
+            36.321938369000065
+          ],
+          [
+            117.47988271400004,
+            36.321939155000052
+          ],
+          [
+            117.47929542300005,
+            36.321955621000029
+          ],
+          [
+            117.47929747500007,
+            36.321898522000026
+          ],
+          [
+            117.4792975040001,
+            36.321897720000038
+          ],
+          [
+            117.47927750000008,
+            36.321898160000046
+          ],
+          [
+            117.47927898300009,
+            36.321792412000036
+          ],
+          [
+            117.47922324600006,
+            36.321793994000075
+          ],
+          [
+            117.47922328800007,
+            36.321792831000039
+          ],
+          [
+            117.47922428400011,
+            36.321765109000069
+          ],
+          [
+            117.47897945700004,
+            36.321772148000036
+          ],
+          [
+            117.47897948200011,
+            36.321409061000054
+          ],
+          [
+            117.47897932800004,
+            36.321378324000079
+          ],
+          [
+            117.47802617100001,
+            36.321408294000037
+          ],
+          [
+            117.47776850800005,
+            36.321405847000051
+          ],
+          [
+            117.47777155000006,
+            36.321439947000044
+          ],
+          [
+            117.47779039500006,
+            36.321652810000046
+          ],
+          [
+            117.47783773300011,
+            36.322673341000041
+          ],
+          [
+            117.47779958300009,
+            36.322716205000063
+          ],
+          [
+            117.47725771300009,
+            36.322723736000057
+          ],
+          [
+            117.47725747000004,
+            36.322739365000075
+          ],
+          [
+            117.47726606700007,
+            36.323146377000057
+          ],
+          [
+            117.47727466300012,
+            36.323553387000061
+          ],
+          [
+            117.47702725300007,
+            36.323573310000029
+          ],
+          [
+            117.4770223270001,
+            36.323602686000072
+          ],
+          [
+            117.47700851700006,
+            36.323643700000048
+          ],
+          [
+            117.47699723200003,
+            36.323692961000063
+          ],
+          [
+            117.47696405700003,
+            36.323702272000048
+          ],
+          [
+            117.47694560000002,
+            36.324596749000079
+          ],
+          [
+            117.47691828400002,
+            36.324595438000074
+          ],
+          [
+            117.47667805200001,
+            36.324651379000045
+          ],
+          [
+            117.47628975500004,
+            36.324730095000064
+          ],
+          [
+            117.47564487000011,
+            36.324709214000052
+          ],
+          [
+            117.47534999200002,
+            36.324596582000027
+          ],
+          [
+            117.47510378400011,
+            36.324520308000046
+          ],
+          [
+            117.47493198900008,
+            36.324510107000037
+          ],
+          [
+            117.47462220300008,
+            36.324404911000045
+          ],
+          [
+            117.47462267300011,
+            36.324435869000069
+          ],
+          [
+            117.47462536500007,
+            36.324646619000077
+          ],
+          [
+            117.4746300920001,
+            36.325016709000067
+          ],
+          [
+            117.47464329400009,
+            36.325028309000061
+          ],
+          [
+            117.47468255900003,
+            36.325039487000026
+          ],
+          [
+            117.47467716600011,
+            36.32504061800006
+          ],
+          [
+            117.47467536000011,
+            36.325042462000056
+          ],
+          [
+            117.47465314500005,
+            36.325065161000055
+          ],
+          [
+            117.47464839500003,
+            36.325070014000062
+          ],
+          [
+            117.47463780600003,
+            36.325080833000072
+          ],
+          [
+            117.47463532300003,
+            36.325089459000026
+          ],
+          [
+            117.47470221100002,
+            36.325091957000041
+          ],
+          [
+            117.47469229000001,
+            36.325102094000044
+          ],
+          [
+            117.47467612200001,
+            36.325158269000042
+          ],
+          [
+            117.4746704370001,
+            36.325194560000057
+          ],
+          [
+            117.47463415600009,
+            36.325229110000066
+          ],
+          [
+            117.47455228700005,
+            36.325254014000052
+          ],
+          [
+            117.47452609300001,
+            36.325264115000039
+          ],
+          [
+            117.47450781700002,
+            36.325271164000071
+          ],
+          [
+            117.47444336100011,
+            36.325278722000064
+          ],
+          [
+            117.47443911300002,
+            36.325278725000032
+          ],
+          [
+            117.47428180600002,
+            36.325278823000076
+          ],
+          [
+            117.47398594000003,
+            36.325284600000032
+          ],
+          [
+            117.47382223400007,
+            36.325287796000055
+          ],
+          [
+            117.47373607400004,
+            36.325266871000053
+          ],
+          [
+            117.47366713400004,
+            36.32524666900008
+          ],
+          [
+            117.47356143600007,
+            36.325220123000065
+          ],
+          [
+            117.47353258500004,
+            36.325199971000075
+          ],
+          [
+            117.47350221700003,
+            36.325172671000075
+          ],
+          [
+            117.47348150700009,
+            36.32511617800003
+          ],
+          [
+            117.47348198400005,
+            36.325051396000049
+          ],
+          [
+            117.47348204000002,
+            36.325050769000029
+          ],
+          [
+            117.47348008300003,
+            36.325048709000043
+          ],
+          [
+            117.47343950300001,
+            36.325039307000054
+          ],
+          [
+            117.47338114500008,
+            36.32504582200005
+          ],
+          [
+            117.47272190100011,
+            36.325039741000069
+          ],
+          [
+            117.47272025800009,
+            36.325048343000049
+          ],
+          [
+            117.47264719600003,
+            36.325048050000078
+          ],
+          [
+            117.47264922700003,
+            36.32503674000003
+          ],
+          [
+            117.4719659540001,
+            36.325025941000035
+          ],
+          [
+            117.47194262200003,
+            36.325025516000039
+          ],
+          [
+            117.47192354100002,
+            36.325025168000025
+          ],
+          [
+            117.47188024000002,
+            36.32502437800008
+          ],
+          [
+            117.47140405900006,
+            36.325015691000033
+          ],
+          [
+            117.47115598100004,
+            36.325011165000035
+          ],
+          [
+            117.47110439700009,
+            36.325025305000054
+          ],
+          [
+            117.4710801010001,
+            36.325040581000053
+          ],
+          [
+            117.47105772400005,
+            36.325063443000033
+          ],
+          [
+            117.47105394300002,
+            36.325075938000055
+          ],
+          [
+            117.47105228300006,
+            36.32507964000007
+          ],
+          [
+            117.47101152100004,
+            36.32508182600003
+          ],
+          [
+            117.47096736600008,
+            36.325084193000066
+          ],
+          [
+            117.47090413400008,
+            36.325087583000027
+          ],
+          [
+            117.4704172810001,
+            36.325113682000051
+          ],
+          [
+            117.46993042800011,
+            36.32513977900004
+          ],
+          [
+            117.46961763600007,
+            36.325293860000045
+          ],
+          [
+            117.4689359460001,
+            36.32532294300006
+          ],
+          [
+            117.46886905500003,
+            36.325325796000072
+          ],
+          [
+            117.46812104300011,
+            36.325357704000055
+          ],
+          [
+            117.46737303000009,
+            36.325389607000034
+          ],
+          [
+            117.46737304400006,
+            36.325392003000047
+          ],
+          [
+            117.46737349600005,
+            36.325467641000046
+          ],
+          [
+            117.46737378300008,
+            36.325515634000055
+          ],
+          [
+            117.4673747600001,
+            36.325679555000079
+          ],
+          [
+            117.46737579100011,
+            36.325852153000028
+          ],
+          [
+            117.46737952800004,
+            36.326478124000062
+          ],
+          [
+            117.46681973800003,
+            36.326493654000046
+          ],
+          [
+            117.46625994800002,
+            36.326509181000063
+          ],
+          [
+            117.466260852,
+            36.326661063000074
+          ],
+          [
+            117.46558468000001,
+            36.326679087000059
+          ],
+          [
+            117.46490850800001,
+            36.326697108000076
+          ],
+          [
+            117.4649109500001,
+            36.326796340000044
+          ],
+          [
+            117.46423395700003,
+            36.326817055000049
+          ],
+          [
+            117.46392881600002,
+            36.326826391000054
+          ],
+          [
+            117.46371567600011,
+            36.326832911000054
+          ],
+          [
+            117.46355696300009,
+            36.32683776600004
+          ],
+          [
+            117.46287996900003,
+            36.326858473000073
+          ],
+          [
+            117.46292341800006,
+            36.32738203100007
+          ],
+          [
+            117.46291199100006,
+            36.327382140000054
+          ],
+          [
+            117.46273122000002,
+            36.327382839000052
+          ],
+          [
+            117.46245226000008,
+            36.327347510000038
+          ],
+          [
+            117.46208766000007,
+            36.327363146000039
+          ],
+          [
+            117.46188213700009,
+            36.32737196000005
+          ],
+          [
+            117.46184256400011,
+            36.327373657000066
+          ],
+          [
+            117.46181719600008,
+            36.327375292000056
+          ],
+          [
+            117.46181479600011,
+            36.327375841000048
+          ],
+          [
+            117.46182271100008,
+            36.327405251000073
+          ],
+          [
+            117.46133618500005,
+            36.327430510000056
+          ],
+          [
+            117.46138050800005,
+            36.327922306000062
+          ],
+          [
+            117.46138422200011,
+            36.328552375000072
+          ],
+          [
+            117.46131759500008,
+            36.328558025000063
+          ],
+          [
+            117.4613217110001,
+            36.329256238000028
+          ],
+          [
+            117.46132198600003,
+            36.329269302000057
+          ],
+          [
+            117.46096475200011,
+            36.329333080000026
+          ],
+          [
+            117.46096496200005,
+            36.32936870900005
+          ],
+          [
+            117.46051511300004,
+            36.329415470000072
+          ],
+          [
+            117.46032639800001,
+            36.329435054000044
+          ],
+          [
+            117.46007395600009,
+            36.329461174000073
+          ],
+          [
+            117.45995167100011,
+            36.329529940000043
+          ],
+          [
+            117.45985660300005,
+            36.329557754000064
+          ],
+          [
+            117.4596802210001,
+            36.329607988000078
+          ],
+          [
+            117.45948692000002,
+            36.329663038000035
+          ],
+          [
+            117.45947412600003,
+            36.329669387000024
+          ],
+          [
+            117.45909254900005,
+            36.329855165000026
+          ],
+          [
+            117.4590499740001,
+            36.32942354000005
+          ],
+          [
+            117.45900740000002,
+            36.328991913000038
+          ],
+          [
+            117.45879459000002,
+            36.32899726200003
+          ],
+          [
+            117.45879598300007,
+            36.329234866000036
+          ],
+          [
+            117.45858093300001,
+            36.329262672000027
+          ],
+          [
+            117.45825333100004,
+            36.329305028000078
+          ],
+          [
+            117.45771067800001,
+            36.329375187000039
+          ],
+          [
+            117.45716802400011,
+            36.329445343000032
+          ],
+          [
+            117.4571579410001,
+            36.329446647000054
+          ],
+          [
+            117.45715864200008,
+            36.329566773000067
+          ],
+          [
+            117.45714639900007,
+            36.329567380000071
+          ],
+          [
+            117.45674650500007,
+            36.329587174000039
+          ],
+          [
+            117.45634661100007,
+            36.329606966000028
+          ],
+          [
+            117.45633193300011,
+            36.329607692000025
+          ],
+          [
+            117.45600376300001,
+            36.32962393300005
+          ],
+          [
+            117.45598202700012,
+            36.32962500900004
+          ],
+          [
+            117.45594431400002,
+            36.329564491000042
+          ],
+          [
+            117.45594079300008,
+            36.329565817000059
+          ],
+          [
+            117.45576419500003,
+            36.329614569000057
+          ],
+          [
+            117.45568835300003,
+            36.329646332000038
+          ],
+          [
+            117.45560026300006,
+            36.329693956000028
+          ],
+          [
+            117.45520215900001,
+            36.330275759000074
+          ],
+          [
+            117.45519418900005,
+            36.330284860000063
+          ],
+          [
+            117.45510779600011,
+            36.33037339100008
+          ],
+          [
+            117.45511347100012,
+            36.330377036000073
+          ],
+          [
+            117.4551083880001,
+            36.330382830000076
+          ],
+          [
+            117.45505609500003,
+            36.33044244000007
+          ],
+          [
+            117.45505346800007,
+            36.33044374900004
+          ],
+          [
+            117.45487784000011,
+            36.330531239000038
+          ],
+          [
+            117.45486133800011,
+            36.330554839000058
+          ],
+          [
+            117.45478929600006,
+            36.330657872000074
+          ],
+          [
+            117.45530655100004,
+            36.331051656000056
+          ],
+          [
+            117.45531552200009,
+            36.33120346700008
+          ],
+          [
+            117.45518336400005,
+            36.331254781000041
+          ],
+          [
+            117.45518373100003,
+            36.331317927000043
+          ],
+          [
+            117.45530918300005,
+            36.331467738000072
+          ],
+          [
+            117.45531251900002,
+            36.331471721000071
+          ],
+          [
+            117.45531031600001,
+            36.331471898000075
+          ],
+          [
+            117.45531198800006,
+            36.331478035000032
+          ],
+          [
+            117.45502454000007,
+            36.331494785000075
+          ],
+          [
+            117.45465333900006,
+            36.331505615000026
+          ],
+          [
+            117.45429302900004,
+            36.33151570900003
+          ],
+          [
+            117.45399502400005,
+            36.331548500000054
+          ],
+          [
+            117.45358894800006,
+            36.331594753000047
+          ],
+          [
+            117.4532424030001,
+            36.331606476000047
+          ],
+          [
+            117.45278415200005,
+            36.331621977000054
+          ],
+          [
+            117.45263608100004,
+            36.331614693000063
+          ],
+          [
+            117.45224109700007,
+            36.331573075000051
+          ],
+          [
+            117.45184100100005,
+            36.331593415000043
+          ],
+          [
+            117.45166379000011,
+            36.331643407000058
+          ],
+          [
+            117.45157976300004,
+            36.331652228000053
+          ],
+          [
+            117.45134869500009,
+            36.331680021000068
+          ],
+          [
+            117.45102079500009,
+            36.331670275000079
+          ],
+          [
+            117.45067198600009,
+            36.331650053000033
+          ],
+          [
+            117.45067020400006,
+            36.331664162000038
+          ],
+          [
+            117.45065416200009,
+            36.331662832000063
+          ],
+          [
+            117.45061806500007,
+            36.331659838000064
+          ],
+          [
+            117.45061016900002,
+            36.331782238000073
+          ],
+          [
+            117.45057747200008,
+            36.331841036000071
+          ],
+          [
+            117.45054952400005,
+            36.331871481000064
+          ],
+          [
+            117.45053475700001,
+            36.331883541000025
+          ],
+          [
+            117.45051861800005,
+            36.331890147000024
+          ],
+          [
+            117.45048542800009,
+            36.331894053000042
+          ],
+          [
+            117.45040014800009,
+            36.331884863000028
+          ],
+          [
+            117.45032510500005,
+            36.331892740000058
+          ],
+          [
+            117.45025262800004,
+            36.331905491000043
+          ],
+          [
+            117.45019797600003,
+            36.331923663000055
+          ],
+          [
+            117.45016389700004,
+            36.331953042000066
+          ],
+          [
+            117.45014835400002,
+            36.331989681000039
+          ],
+          [
+            117.4501757920001,
+            36.332142565000026
+          ],
+          [
+            117.45019316900004,
+            36.33216709900006
+          ],
+          [
+            117.45020108900007,
+            36.332178282000029
+          ],
+          [
+            117.45022158200004,
+            36.332183774000043
+          ],
+          [
+            117.45019709300004,
+            36.332193807000067
+          ],
+          [
+            117.45007723700007,
+            36.332177566000041
+          ],
+          [
+            117.44987035400004,
+            36.332165949000057
+          ],
+          [
+            117.44951301100002,
+            36.332145883000067
+          ],
+          [
+            117.44903792200012,
+            36.332119202000058
+          ],
+          [
+            117.44894878600007,
+            36.332114196000077
+          ],
+          [
+            117.44841461100009,
+            36.332058091000079
+          ],
+          [
+            117.44836429000009,
+            36.332283234000045
+          ],
+          [
+            117.44835617800004,
+            36.332315206000033
+          ],
+          [
+            117.44832238100003,
+            36.332448408000062
+          ],
+          [
+            117.4483088720001,
+            36.33250165100003
+          ],
+          [
+            117.44822540400003,
+            36.332589261000066
+          ],
+          [
+            117.44822290500008,
+            36.332591884000067
+          ],
+          [
+            117.44814858600012,
+            36.332669890000034
+          ],
+          [
+            117.44812704300011,
+            36.332930741000041
+          ],
+          [
+            117.44798318000005,
+            36.332949907000057
+          ],
+          [
+            117.44782235800005,
+            36.333025015000032
+          ],
+          [
+            117.44769862800001,
+            36.33329715800005
+          ],
+          [
+            117.44776693300003,
+            36.33332976500003
+          ],
+          [
+            117.44791709100002,
+            36.333388090000028
+          ],
+          [
+            117.44792281500008,
+            36.333454986000049
+          ],
+          [
+            117.44785823200004,
+            36.333521709000024
+          ],
+          [
+            117.44793411400008,
+            36.333562874000052
+          ],
+          [
+            117.4479369500001,
+            36.33356374400006
+          ],
+          [
+            117.44803844500007,
+            36.33359486300003
+          ],
+          [
+            117.44808691200001,
+            36.333690500000046
+          ],
+          [
+            117.44808976200011,
+            36.333696125000074
+          ],
+          [
+            117.4484684900001,
+            36.333697298000061
+          ],
+          [
+            117.44848144400009,
+            36.333697338000036
+          ],
+          [
+            117.44847924500004,
+            36.333719444000053
+          ],
+          [
+            117.44847239300009,
+            36.333788322000032
+          ],
+          [
+            117.44846513700008,
+            36.333861256000034
+          ],
+          [
+            117.4483707710001,
+            36.334112005000065
+          ],
+          [
+            117.44837081500009,
+            36.334112118000064
+          ],
+          [
+            117.44842152100011,
+            36.334243595000032
+          ],
+          [
+            117.44845019400009,
+            36.334317942000041
+          ],
+          [
+            117.44850755400012,
+            36.33446667000004
+          ],
+          [
+            117.44854586300005,
+            36.334566000000052
+          ],
+          [
+            117.44857726400005,
+            36.334647420000067
+          ],
+          [
+            117.44859097000005,
+            36.33468295800003
+          ],
+          [
+            117.44830669800001,
+            36.33480636400003
+          ],
+          [
+            117.44830729500006,
+            36.334910568000055
+          ],
+          [
+            117.44830745600007,
+            36.334938695000062
+          ],
+          [
+            117.44830761600008,
+            36.33496669200008
+          ],
+          [
+            117.44848943400007,
+            36.335091485000078
+          ],
+          [
+            117.44878173400002,
+            36.335177582000028
+          ],
+          [
+            117.44897993500001,
+            36.335259169000039
+          ],
+          [
+            117.44955066400007,
+            36.335493755000073
+          ],
+          [
+            117.44955121500004,
+            36.335494330000074
+          ],
+          [
+            117.44955133000008,
+            36.335494377000032
+          ],
+          [
+            117.44991135200007,
+            36.335850082000036
+          ],
+          [
+            117.45027137700004,
+            36.33620578600005
+          ],
+          [
+            117.45047184400005,
+            36.336403845000063
+          ],
+          [
+            117.4509036820001,
+            36.336830490000068
+          ],
+          [
+            117.45105291800007,
+            36.336977930000046
+          ],
+          [
+            117.45111231400006,
+            36.337036612000077
+          ],
+          [
+            117.45156962900001,
+            36.337488419000067
+          ],
+          [
+            117.45155745200009,
+            36.337496820000069
+          ],
+          [
+            117.45155933100011,
+            36.337498577000076
+          ],
+          [
+            117.45193822700003,
+            36.337852888000043
+          ],
+          [
+            117.45194246900007,
+            36.337856854000051
+          ],
+          [
+            117.45194330200002,
+            36.337857971000062
+          ],
+          [
+            117.45194716200001,
+            36.337877543000047
+          ],
+          [
+            117.45202084100004,
+            36.338251004000028
+          ],
+          [
+            117.45203391400003,
+            36.338317268000026
+          ],
+          [
+            117.45214516800002,
+            36.338881176000029
+          ],
+          [
+            117.45225642300011,
+            36.339445083000044
+          ],
+          [
+            117.45226539800001,
+            36.339451451000059
+          ],
+          [
+            117.45230561000005,
+            36.339479985000025
+          ],
+          [
+            117.452411299,
+            36.33955497900007
+          ],
+          [
+            117.45258948700007,
+            36.339681416000076
+          ],
+          [
+            117.45229102900009,
+            36.339930378000076
+          ],
+          [
+            117.45228708000002,
+            36.339933673000075
+          ],
+          [
+            117.45219178100001,
+            36.340085572000078
+          ],
+          [
+            117.4521655420001,
+            36.340127395000025
+          ],
+          [
+            117.45202415100005,
+            36.340352759000041
+          ],
+          [
+            117.45211409400008,
+            36.340521914000078
+          ],
+          [
+            117.45214622100002,
+            36.340582336000068
+          ],
+          [
+            117.45270728900005,
+            36.340663864000078
+          ],
+          [
+            117.45254532100012,
+            36.34099210800008
+          ],
+          [
+            117.45203554300008,
+            36.34099403700003
+          ],
+          [
+            117.45174325000005,
+            36.340995142000054
+          ],
+          [
+            117.45201652700007,
+            36.341157779000071
+          ],
+          [
+            117.45224077700004,
+            36.341291239000043
+          ],
+          [
+            117.45229933600001,
+            36.341326089000063
+          ],
+          [
+            117.4522998220001,
+            36.341326183000035
+          ],
+          [
+            117.45238134500005,
+            36.341341917000079
+          ],
+          [
+            117.45309259600003,
+            36.341479181000068
+          ],
+          [
+            117.45313981900006,
+            36.341483452000034
+          ],
+          [
+            117.45350551600006,
+            36.341551692000053
+          ],
+          [
+            117.45364608400007,
+            36.341577921000066
+          ],
+          [
+            117.45407748000002,
+            36.341658418000065
+          ],
+          [
+            117.45476633300007,
+            36.341730434000056
+          ],
+          [
+            117.45490490700001,
+            36.341781734000051
+          ],
+          [
+            117.45497822800007,
+            36.341808876000073
+          ],
+          [
+            117.45537875500008,
+            36.341957099000069
+          ],
+          [
+            117.45537875700006,
+            36.341957149000052
+          ],
+          [
+            117.45538383600001,
+            36.342034349000073
+          ],
+          [
+            117.45538491800005,
+            36.342050801000028
+          ],
+          [
+            117.45542474700005,
+            36.342656257000044
+          ],
+          [
+            117.45524668500002,
+            36.342679326000052
+          ],
+          [
+            117.45472831200004,
+            36.342746480000073
+          ],
+          [
+            117.45403187700003,
+            36.342836700000078
+          ],
+          [
+            117.45333543900006,
+            36.342926915000078
+          ],
+          [
+            117.45330364800009,
+            36.342928048000033
+          ],
+          [
+            117.45278125700008,
+            36.34294664500004
+          ],
+          [
+            117.45276790800006,
+            36.342947120000076
+          ],
+          [
+            117.45272681100005,
+            36.342942108000045
+          ],
+          [
+            117.45262219200004,
+            36.343216178000034
+          ],
+          [
+            117.45253458600007,
+            36.343557875000045
+          ],
+          [
+            117.45244697900011,
+            36.343899572000055
+          ],
+          [
+            117.45248177600001,
+            36.343903960000034
+          ],
+          [
+            117.4529653190001,
+            36.343963255000062
+          ],
+          [
+            117.45344886400005,
+            36.344022549000044
+          ],
+          [
+            117.45342175600001,
+            36.344066929000064
+          ],
+          [
+            117.45339090900006,
+            36.344247642000028
+          ],
+          [
+            117.45340421900005,
+            36.344247592000045
+          ],
+          [
+            117.45358961000011,
+            36.344246890000079
+          ],
+          [
+            117.4536943280001,
+            36.344246493000071
+          ],
+          [
+            117.45375764700009,
+            36.344246254000041
+          ],
+          [
+            117.45398550800007,
+            36.344229838000047
+          ],
+          [
+            117.45428681500005,
+            36.344208130000027
+          ],
+          [
+            117.45433669500005,
+            36.344224052000072
+          ],
+          [
+            117.45438486300009,
+            36.344239427000048
+          ],
+          [
+            117.45439863900003,
+            36.344243825000035
+          ],
+          [
+            117.45439943100007,
+            36.34424449800008
+          ],
+          [
+            117.45439980000003,
+            36.344244813000046
+          ],
+          [
+            117.4544130920001,
+            36.344256131000066
+          ],
+          [
+            117.4547575900001,
+            36.344549478000033
+          ],
+          [
+            117.45482503400001,
+            36.344558909000057
+          ],
+          [
+            117.45482512000001,
+            36.344569639000042
+          ],
+          [
+            117.45501704700007,
+            36.344572716000073
+          ],
+          [
+            117.45491342800005,
+            36.34487792300007
+          ],
+          [
+            117.45513545200004,
+            36.344903689000034
+          ],
+          [
+            117.45516018800004,
+            36.344906560000027
+          ],
+          [
+            117.45520202800003,
+            36.345278239000038
+          ],
+          [
+            117.45510363200003,
+            36.345355790000042
+          ],
+          [
+            117.45502582300003,
+            36.345548676000078
+          ],
+          [
+            117.45488889800004,
+            36.345888098000046
+          ],
+          [
+            117.45472257500001,
+            36.345891933000075
+          ],
+          [
+            117.45476579500007,
+            36.34630856800004
+          ],
+          [
+            117.45480260000011,
+            36.346663356000079
+          ],
+          [
+            117.45533467300004,
+            36.346452828000054
+          ],
+          [
+            117.45534117300008,
+            36.346450256000026
+          ],
+          [
+            117.45551075200001,
+            36.346351387000027
+          ],
+          [
+            117.45561483400002,
+            36.346280328000034
+          ],
+          [
+            117.45570724100003,
+            36.346217238000065
+          ],
+          [
+            117.45602602600002,
+            36.34599958900003
+          ],
+          [
+            117.45602613800008,
+            36.345635495000067
+          ],
+          [
+            117.45608062800011,
+            36.34556475200003
+          ],
+          [
+            117.45617908600002,
+            36.345508317000053
+          ],
+          [
+            117.45638209100002,
+            36.345527062000031
+          ],
+          [
+            117.4565645350001,
+            36.345609979000074
+          ],
+          [
+            117.45661431500002,
+            36.34554025500006
+          ],
+          [
+            117.45665705900001,
+            36.345466001000034
+          ],
+          [
+            117.45671634500002,
+            36.345210663000046
+          ],
+          [
+            117.4567432660001,
+            36.345185192000031
+          ],
+          [
+            117.45674378000001,
+            36.34518337600008
+          ],
+          [
+            117.45677987300007,
+            36.34499723600004
+          ],
+          [
+            117.45680852200007,
+            36.344849488000079
+          ],
+          [
+            117.45681107300004,
+            36.344836328000042
+          ],
+          [
+            117.45684556000003,
+            36.344517820000078
+          ],
+          [
+            117.45685473200001,
+            36.344445634000067
+          ],
+          [
+            117.45685857700005,
+            36.34441537500004
+          ],
+          [
+            117.45686027700003,
+            36.344385021000051
+          ],
+          [
+            117.45686093900008,
+            36.344379403000062
+          ],
+          [
+            117.45683228900009,
+            36.344342385000061
+          ],
+          [
+            117.45683710500009,
+            36.344140923000054
+          ],
+          [
+            117.45680659800007,
+            36.343870224000057
+          ],
+          [
+            117.45680554600006,
+            36.343860899000049
+          ],
+          [
+            117.45742847600002,
+            36.343541090000031
+          ],
+          [
+            117.4578846280001,
+            36.343306900000073
+          ],
+          [
+            117.45803145800005,
+            36.343467271000065
+          ],
+          [
+            117.45804116200009,
+            36.343477872000051
+          ],
+          [
+            117.45810144900008,
+            36.343518005000078
+          ],
+          [
+            117.45841621700004,
+            36.343434716000047
+          ],
+          [
+            117.45848075900005,
+            36.34342928600006
+          ],
+          [
+            117.45849095200003,
+            36.343428456000026
+          ],
+          [
+            117.45852630800005,
+            36.34370395600007
+          ],
+          [
+            117.45850928600009,
+            36.344039447000057
+          ],
+          [
+            117.45849060500007,
+            36.344241500000066
+          ],
+          [
+            117.45849412200005,
+            36.344765633000065
+          ],
+          [
+            117.45849577600006,
+            36.34501212400005
+          ],
+          [
+            117.4584966000001,
+            36.345134794000046
+          ],
+          [
+            117.45897943700004,
+            36.345144807000054
+          ],
+          [
+            117.45900397800006,
+            36.345145316000071
+          ],
+          [
+            117.45964035100008,
+            36.345156951000035
+          ],
+          [
+            117.4602767240001,
+            36.345168582000042
+          ],
+          [
+            117.46030462200008,
+            36.345169092000049
+          ],
+          [
+            117.46030855800007,
+            36.345169164000026
+          ],
+          [
+            117.46032513300008,
+            36.345128331000069
+          ],
+          [
+            117.46034429000008,
+            36.345130417000064
+          ],
+          [
+            117.46110148100001,
+            36.345212833000062
+          ],
+          [
+            117.46109641600003,
+            36.345333507000078
+          ],
+          [
+            117.46109399500006,
+            36.345391169000038
+          ],
+          [
+            117.46127484800002,
+            36.345388718000038
+          ],
+          [
+            117.46160530200007,
+            36.345384239000055
+          ],
+          [
+            117.46180352300007,
+            36.34538155100006
+          ],
+          [
+            117.46234389000006,
+            36.345386341000051
+          ],
+          [
+            117.46245452400001,
+            36.345385517000068
+          ],
+          [
+            117.46247294200009,
+            36.345386278000035
+          ],
+          [
+            117.46264578900002,
+            36.345393428000079
+          ],
+          [
+            117.46269909000011,
+            36.345383155000036
+          ],
+          [
+            117.46270212000002,
+            36.345293986000058
+          ],
+          [
+            117.46275325900001,
+            36.34528309500007
+          ],
+          [
+            117.46281665400011,
+            36.345269595000048
+          ],
+          [
+            117.46309550900003,
+            36.345610156000077
+          ],
+          [
+            117.46337436700003,
+            36.345950717000051
+          ],
+          [
+            117.46337528900006,
+            36.345951844000069
+          ],
+          [
+            117.46385632500005,
+            36.346140879000075
+          ],
+          [
+            117.46391058400002,
+            36.346162201000027
+          ],
+          [
+            117.46438113700003,
+            36.346347115000071
+          ],
+          [
+            117.46438234400011,
+            36.346347589000061
+          ],
+          [
+            117.46477581800002,
+            36.346031018000076
+          ],
+          [
+            117.46516928800008,
+            36.345714445000056
+          ],
+          [
+            117.46556275600005,
+            36.345397870000056
+          ],
+          [
+            117.46557856800007,
+            36.345393048000062
+          ],
+          [
+            117.46581881200007,
+            36.345500437000055
+          ],
+          [
+            117.46585452800002,
+            36.345516409000027
+          ],
+          [
+            117.46586505200003,
+            36.345521116000043
+          ],
+          [
+            117.46587860300008,
+            36.345527176000076
+          ],
+          [
+            117.46589227800007,
+            36.345533291000038
+          ],
+          [
+            117.4659041220001,
+            36.345538591000036
+          ],
+          [
+            117.46590680200006,
+            36.345539789000043
+          ],
+          [
+            117.46592782000005,
+            36.345549187000074
+          ],
+          [
+            117.46596264100003,
+            36.345564725000031
+          ],
+          [
+            117.46614214800002,
+            36.345692671000052
+          ],
+          [
+            117.46623535800006,
+            36.345759108000038
+          ],
+          [
+            117.4662653900001,
+            36.345768264000071
+          ],
+          [
+            117.4663333100001,
+            36.345788971000047
+          ],
+          [
+            117.46637934600005,
+            36.34580300500005
+          ],
+          [
+            117.46658658000001,
+            36.345819297000048
+          ],
+          [
+            117.46682335800006,
+            36.345954984000059
+          ],
+          [
+            117.46687046800002,
+            36.345981980000033
+          ],
+          [
+            117.4669346610001,
+            36.346030093000024
+          ],
+          [
+            117.46694988100001,
+            36.346041500000069
+          ],
+          [
+            117.46694999500005,
+            36.346041587000059
+          ],
+          [
+            117.46696925100002,
+            36.34605601800007
+          ],
+          [
+            117.46697632100006,
+            36.34605846900007
+          ],
+          [
+            117.46698741600005,
+            36.34606231500004
+          ],
+          [
+            117.4669955600001,
+            36.346065138000029
+          ],
+          [
+            117.46721084400008,
+            36.346139764000043
+          ],
+          [
+            117.46746204600004,
+            36.346238870000036
+          ],
+          [
+            117.46746246100008,
+            36.346239764000075
+          ],
+          [
+            117.46753692800007,
+            36.346400366000069
+          ],
+          [
+            117.46757131000004,
+            36.346474516000058
+          ],
+          [
+            117.46757197800002,
+            36.346475185000031
+          ],
+          [
+            117.46776888900001,
+            36.34644693000007
+          ],
+          [
+            117.46796198800007,
+            36.346402008000041
+          ],
+          [
+            117.46823511400009,
+            36.346359481000036
+          ],
+          [
+            117.46827551100012,
+            36.346353191000048
+          ],
+          [
+            117.46828841200011,
+            36.346356595000032
+          ],
+          [
+            117.46829967000008,
+            36.346359566000046
+          ],
+          [
+            117.46833296000011,
+            36.346368351000024
+          ],
+          [
+            117.46833383300009,
+            36.346390989000042
+          ],
+          [
+            117.46841195900004,
+            36.34638912500003
+          ],
+          [
+            117.46856922400002,
+            36.346385595000072
+          ],
+          [
+            117.4687973340001,
+            36.346382435000066
+          ],
+          [
+            117.46882351000011,
+            36.346391521000044
+          ],
+          [
+            117.46884267400003,
+            36.346444624000071
+          ],
+          [
+            117.46886947300004,
+            36.346468704000074
+          ],
+          [
+            117.46885832900011,
+            36.34648780200007
+          ],
+          [
+            117.46886598200001,
+            36.346509008000055
+          ],
+          [
+            117.46892817100002,
+            36.346953126000074
+          ],
+          [
+            117.46892330200001,
+            36.346984576000068
+          ],
+          [
+            117.46886234800002,
+            36.347377838000057
+          ],
+          [
+            117.46881140200003,
+            36.347872614000039
+          ],
+          [
+            117.46880950400009,
+            36.347927859000038
+          ],
+          [
+            117.46879579400002,
+            36.348025367000048
+          ],
+          [
+            117.46876504400007,
+            36.348244064000028
+          ],
+          [
+            117.46876037000004,
+            36.348299736000058
+          ],
+          [
+            117.4687332960001,
+            36.348622208000052
+          ],
+          [
+            117.46871453400001,
+            36.348792486000036
+          ],
+          [
+            117.46871322000004,
+            36.348804401000052
+          ],
+          [
+            117.46871227300005,
+            36.348824295000043
+          ],
+          [
+            117.46941258700008,
+            36.348797156000046
+          ],
+          [
+            117.46987020600011,
+            36.348779419000039
+          ],
+          [
+            117.47043078900003,
+            36.34875769000007
+          ],
+          [
+            117.47078255300005,
+            36.348759858000051
+          ],
+          [
+            117.47093314200004,
+            36.348752472000058
+          ],
+          [
+            117.47109142600004,
+            36.348783825000055
+          ],
+          [
+            117.47113187100001,
+            36.348787644000026
+          ],
+          [
+            117.47113016700007,
+            36.348777128000052
+          ],
+          [
+            117.47130399500008,
+            36.348746506000055
+          ],
+          [
+            117.47133810800005,
+            36.348740497000051
+          ],
+          [
+            117.47134270200002,
+            36.348740875000033
+          ],
+          [
+            117.47181559500007,
+            36.348779770000078
+          ],
+          [
+            117.47180383900002,
+            36.348843312000042
+          ],
+          [
+            117.47167458200011,
+            36.348980714000049
+          ],
+          [
+            117.47165239300011,
+            36.349066874000073
+          ],
+          [
+            117.47162863900007,
+            36.349159109000027
+          ],
+          [
+            117.47155074300008,
+            36.349461575000078
+          ],
+          [
+            117.4715598030001,
+            36.349486759000058
+          ],
+          [
+            117.47156647400004,
+            36.349505308000062
+          ],
+          [
+            117.47156820000009,
+            36.349510106000025
+          ],
+          [
+            117.4715687480001,
+            36.349511628000073
+          ],
+          [
+            117.47157810600004,
+            36.349537643000076
+          ],
+          [
+            117.47158082800001,
+            36.349545212000066
+          ],
+          [
+            117.47158451300004,
+            36.349555455000029
+          ],
+          [
+            117.47159317800003,
+            36.34957954500004
+          ],
+          [
+            117.47159293800007,
+            36.349588906000065
+          ],
+          [
+            117.47159268500002,
+            36.349598765000053
+          ],
+          [
+            117.47159101800003,
+            36.34966365300005
+          ],
+          [
+            117.47158974800004,
+            36.349713118000068
+          ],
+          [
+            117.47160914800008,
+            36.349802419000071
+          ],
+          [
+            117.47161762300004,
+            36.349841427000058
+          ],
+          [
+            117.47162022500004,
+            36.349853405000033
+          ],
+          [
+            117.47163322400002,
+            36.349864396000044
+          ],
+          [
+            117.4718143560001,
+            36.350131078000061
+          ],
+          [
+            117.47196041500001,
+            36.350128829000028
+          ],
+          [
+            117.4721452770001,
+            36.350125983000055
+          ],
+          [
+            117.4721469540001,
+            36.35033512800004
+          ],
+          [
+            117.47215236300008,
+            36.350344449000033
+          ],
+          [
+            117.47240743800012,
+            36.350521522000065
+          ],
+          [
+            117.47239988000001,
+            36.350546206000047
+          ],
+          [
+            117.47240405500008,
+            36.350549547000071
+          ],
+          [
+            117.47237611000003,
+            36.350628407000045
+          ],
+          [
+            117.47242083000003,
+            36.350638074000074
+          ],
+          [
+            117.47258756800011,
+            36.350683351000043
+          ],
+          [
+            117.47240986500003,
+            36.351254418000053
+          ],
+          [
+            117.47261540300008,
+            36.351258173000076
+          ],
+          [
+            117.47253377200002,
+            36.351832781000041
+          ],
+          [
+            117.47281709400011,
+            36.351837857000078
+          ],
+          [
+            117.47281813500001,
+            36.351851134000071
+          ],
+          [
+            117.47283436900011,
+            36.351852144000077
+          ],
+          [
+            117.47285675300009,
+            36.352196582000033
+          ],
+          [
+            117.47287913700006,
+            36.352541020000047
+          ],
+          [
+            117.47336308200011,
+            36.352529570000058
+          ]
+        ]
+      },
+      "properties" : {
+        "OBJECTID_1" : 1,
+        "FID_寨里" : 0,
+        "OBJECTID" : 736,
+        "BSM" : "370116124000000707",
+        "YSDM" : "1000600400",
+        "ZLDWDM" : "3701161070180000000",
+        "ZLDWMC" : "后裴王村",
+        "DCMJ" : 736632.79000000004,
+        "JSMJ" : 736632.79000000004,
+        "MSSM" : "00",
+        "HDMC" : " ",
+        "BZ" : " ",
+        "SHAPE_Leng" : 8630.5993617999993,
+        "Shape_Length" : 0.15936124929188195
+      }
+    }
+  ]
+}

+ 288 - 51
src/components/CrMap.vue

@@ -146,15 +146,79 @@
 			</el-button>
 			<template #dropdown>
 				<el-dropdown-menu>
-					<el-dropdown-item><Button id="straightArrow" @click="MilitaryPlotting('straightArrow')">粗单尖直线箭头</Button></el-dropdown-item>
+					<!-- <el-dropdown-item><Button id="straightArrow" @click="MilitaryPlotting('straightArrow')">粗单尖直线箭头</Button></el-dropdown-item>
 					<el-dropdown-item><Button id="attackArrow" @click="MilitaryPlotting('attackArrow')">燕尾攻击箭头</Button></el-dropdown-item>
 					<el-dropdown-item><Button id="pincerArrow" @click="MilitaryPlotting('pincerArrow')">钳击箭头</Button></el-dropdown-item>
+					<el-dropdown-item><Button id="drawGatheringPlace" @click="MilitaryPlotting('drawGatheringPlace')">集结地</Button></el-dropdown-item>
+					<el-dropdown-item><Button id="drawClosedCurve" @click="MilitaryPlotting('drawClosedCurve')">闭合曲面</Button></el-dropdown-item>
+					<el-dropdown-item><Button id="drawSector" @click="MilitaryPlotting('drawSector')">扇形</Button></el-dropdown-item>
+					<el-dropdown-item><Button id="drawCurve" @click="MilitaryPlotting('drawCurve')">曲线</Button></el-dropdown-item>
+					<el-dropdown-item><Button id="drawCurveFlag" @click="MilitaryPlotting('drawCurveFlag')">曲线旗帜</Button></el-dropdown-item>
+					<el-dropdown-item><Button id="drawTriangleFlag" @click="MilitaryPlotting('drawTriangleFlag')">三角旗帜</Button></el-dropdown-item>
+					<el-dropdown-item><Button id="drawRectFlag" @click="MilitaryPlotting('drawRectFlag')">矩形直角旗帜</Button></el-dropdown-item>
+
+					<el-dropdown-item><Button id="drawArc" @click="MilitaryPlotting('drawArc')">弓形</Button></el-dropdown-item>
+					<el-dropdown-item><Button id="drawLune" @click="MilitaryPlotting('drawLune')">弓形面</Button></el-dropdown-item>
+
+
 					<el-dropdown-item><Button id="clear" @click="MilitaryPlotting('clearAll')">全部删除</Button></el-dropdown-item>
 					<el-dropdown-item><Button id="clear" @click="MilitaryPlotting('clearOne')">单击删除</Button></el-dropdown-item>
 					<el-dropdown-item><Button id="save" @click="MilitaryPlotting('save')">保存</Button></el-dropdown-item>
 					<el-dropdown-item><Button id="show" @click="MilitaryPlotting('show')">展示</Button></el-dropdown-item>
 
-					<el-dropdown-item><Button id="straightArrow" @click="MilitaryPlotting('edit')">编辑</Button></el-dropdown-item>
+					<el-dropdown-item><Button id="straightArrow" @click="MilitaryPlotting('edit')">编辑</Button></el-dropdown-item> -->
+
+					<!-- <el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawPoint')">点</el-button>
+					</el-dropdown-item>
+					<el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawCircle')">圆</el-button>
+					</el-dropdown-item> -->
+					<!-- <el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawRectangle')">矩形</el-button>
+					</el-dropdown-item>
+					<el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawPolyline')">折线</el-button>
+					</el-dropdown-item>
+					<el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawPolygon')">多边形</el-button>
+					</el-dropdown-item> -->
+					<el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawStraightArrow')">直线箭头</el-button>
+					</el-dropdown-item>
+					<el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawAttackArrow')">绘制攻击箭头</el-button>
+					</el-dropdown-item>
+					<el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawPincerArrow')">绘制钳击箭头</el-button>
+					</el-dropdown-item>
+					<el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawGatheringPlace')">绘制集结地</el-button>
+					</el-dropdown-item>
+					<el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawClosedCurve')">绘制闭合曲面</el-button>
+					</el-dropdown-item>
+					<el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawArc')">绘制弓形</el-button>
+					</el-dropdown-item>
+					<el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawLune')">绘制弓形面</el-button>
+					</el-dropdown-item>
+					<el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawSector')">绘制扇形</el-button>
+					</el-dropdown-item>
+					<el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawCurve')">曲线</el-button>
+					</el-dropdown-item>
+					<el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawCurveFlag')">曲线旗帜</el-button>
+					</el-dropdown-item>
+					<el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawTriangleFlag')">三角旗帜</el-button>
+					</el-dropdown-item>
+					<el-dropdown-item>
+						<el-button @click="MilitaryPlotting('DrawRectFlag')">矩形直角旗帜</el-button>
+					</el-dropdown-item>
 				</el-dropdown-menu>
 			</template>
 		</el-dropdown>
@@ -207,6 +271,7 @@
 					<el-dropdown-item><Button @click="PolylineObject1()">根据坐标生成点</Button></el-dropdown-item>
 					<el-dropdown-item><Button @click="PolylineObject2()">根据坐标生成线</Button></el-dropdown-item>
 					<el-dropdown-item><Button @click="PolylineObject3()">根据坐标生成面</Button></el-dropdown-item>
+					<el-dropdown-item><Button @click="PolylineObject4()">根据坐标生成动态圆</Button></el-dropdown-item>
 				</el-dropdown-menu>
 			</template>
 		</el-dropdown>
@@ -722,10 +787,14 @@
 
 	import map_xzqh_zj from '../assets/dataFile/map_xzqh_zj.json';
 	import arrowJson from '../assets/dataFile/arrow.json';
+	// import point_zhamen from '../assets/dataFile/point_zhamen.json';
 	import point_zhamen from '../assets/dataFile/point_zhamen.json';
 
 	// import mupinglogo from '../assets/gltf/mupinglogo.glb';//这样加载失败
 
+	import fanweixian2 from '../assets/dataFile/fanweixian2.json';
+	// import fanweixian2 from 'dataFile/fanweixian2.json';
+
 	import h337 from 'heatmapjs'
 
 	let crMap = undefined;
@@ -903,6 +972,10 @@
 						title: 'GeoJsonPoint',
 						type: 'GeoJsonPoint'
 					},
+					{
+						title: 'GeoJsonWall',
+						type: 'GeoJsonWall'
+					},
 				],
 				serviceIds: {
 					DEM_id: undefined,
@@ -918,6 +991,7 @@
 					scenePrimitivesGltf_id: undefined,
 					GeoJsonPolyline_id: undefined,
 					GeoJsonPoint_id: undefined,
+					GeoJsonWall_id: undefined
 				}
 			}
 		},
@@ -1362,13 +1436,26 @@
 			//军事标绘
 			MilitaryPlotting(type) {
 
-				let param = {
-					id: type,
-					polygonColor: 'rgba(255,0,0,0.9)',
-					outlineWidth: 1,
-					outlineColor: 'rgba(0,0,0,0.9)',
-					color: 'rgba(255,0,0,0.9)',
-				};
+				// 创建标绘实例
+				crMap.DrawMilitaryPlot.onEditProperty = {}
+				crMap.DrawMilitaryPlot.drawActivate(type);
+
+				// 标绘完成返回数据
+				// Draw.DrawEndEvent.addEventListener((entity, positions, drawType) => {
+				// 	console.log({
+				// 		entity,
+				// 		positions,
+				// 		drawType
+				// 	});
+				// });
+
+				// let param = {
+				// 	id: type,
+				// 	polygonColor: 'rgba(255,0,0,0.9)',
+				// 	outlineWidth: 1,
+				// 	outlineColor: 'rgba(0,0,0,0.9)',
+				// 	color: 'rgba(255,0,0,0.9)',
+				// };
 
 				/* 创建监听 */
 				// crMap.DrawMilitaryPlot.onEditProperty = param => {
@@ -1379,35 +1466,35 @@
 				// 	alert('监听编辑')
 				// };
 
-				crMap.DrawMilitaryPlot.onEditProperty = {}
+				// crMap.DrawMilitaryPlot.onEditProperty = {}
+
+				// if (type === "clearOne") {
+				// 	crMap.DrawMilitaryPlot.clearOne();
+				// } else if (type === "clearAll") {
+				// 	crMap.DrawMilitaryPlot.clearAll();
+				// } else if (type === "save") {
+				// 	let saveData = crMap.DrawMilitaryPlot.saveData();
+				// 	saveData.then(function(jsonData) {
+				// 		console.log("保存的数据2:" + JSON.stringify(jsonData));
+				// 	})
+				// } else if (type === "show") {
+				// 	// $.getJSON(arrowJson, function(jsonData) {
+				// 	// 	debugger
+				// 	// 	crMap.DrawMilitaryPlot.showData(jsonData);
+				// 	// });
+				// 	crMap.DrawMilitaryPlot.showData(arrowJson);
 
-				if (type === "clearOne") {
-					crMap.DrawMilitaryPlot.clearOne();
-				} else if (type === "clearAll") {
-					crMap.DrawMilitaryPlot.clearAll();
-				} else if (type === "save") {
-					let saveData = crMap.DrawMilitaryPlot.saveData();
-					saveData.then(function(jsonData) {
-						console.log("保存的数据2:" + JSON.stringify(jsonData));
-					})
-				} else if (type === "show") {
-					// $.getJSON(arrowJson, function(jsonData) {
-					// 	debugger
-					// 	crMap.DrawMilitaryPlot.showData(jsonData);
-					// });
-					crMap.DrawMilitaryPlot.showData(arrowJson);
-
-				} else if (type === "edit") {
-					crMap.DrawMilitaryPlot.updateEditEntityProperty(param);
+				// } else if (type === "edit") {
+				// 	crMap.DrawMilitaryPlot.updateEditEntityProperty(param);
 
-				} else {
-					crMap.DrawMilitaryPlot.draw(type, {
-						onComplete(catesian3, Latlng) {
-							// alert('绘制完成', catesian3.length, Latlng.length)
-							// crMap.DrawMilitaryPlot.updateEditEntityProperty(param);		
-						},
-					});
-				}
+				// } else {
+				// 	crMap.DrawMilitaryPlot.draw(type, {
+				// 		onComplete(catesian3, Latlng) {
+				// 			// alert('绘制完成', catesian3.length, Latlng.length)
+				// 			// crMap.DrawMilitaryPlot.updateEditEntityProperty(param);		
+				// 		},
+				// 	});
+				// }
 			},
 
 			//地形开挖
@@ -1439,7 +1526,7 @@
 			drawGraphicsPoint(type) {
 				crMap.DrawTools.Clear();
 				crMap.DrawToolsEdit.Clear();
-				
+
 				if (type === 'clearAll') {
 					crMap.DrawPointEdit.clearAll();
 				} else {
@@ -1459,7 +1546,7 @@
 			//绘制
 			drawGraphics(type) {
 				crMap.DrawPointEdit.clearAll();
-				
+
 				let _self = this;
 				crMap.DrawTools.draw(type, {
 					onComplete(cPoint, gPoint) {
@@ -1545,7 +1632,7 @@
 
 			//根据坐标生成点
 			PolylineObject1() {
-				let point = crMap.PointObject.generatePoint(
+				let point = crMap.PointObject.addPoint(
 					[121.561965, 37.379948]
 				);
 
@@ -1710,6 +1797,37 @@
 				// 	}
 				// })
 			},
+			//根据坐标生成动态圆
+			PolylineObject4() {
+				crMap.CircleObject = new jt3d.CircleObject(crMap._viewer);
+
+				let CircleObject = crMap.CircleObject.drawCircle([121.561965, 37.379948], 100, {
+					// color: [255, 255, 0, 0.8]
+					color: [255, 0, 0, 1],
+					// outline: true,
+					// outlineColor: [255, 255, 255, 1],
+					// outlineWidth: 5,
+
+					CircleType: 'DynamicCircle',
+					count: 5,
+					duration: 3000
+				});
+				CircleObject.then(function(entity, flyEntity) {
+					debugger
+					let options = {};
+					// 初始化参数默认值
+					options.duration = Cesium.defaultValue(options.duration, 2);
+					options.heading = Cesium.defaultValue(options.heading, 0);
+					options.pitch = Cesium.defaultValue(options.pitch, -60);
+					options.range = Cesium.defaultValue(options.range, 1000);
+
+					let flyToEntity = crMap.LocateUtil.flyToEntity(entity, options);
+					flyToEntity.then(function(entity11) {
+						// alert(1111)
+					});
+				});
+
+			},
 			/**
 			 * 动态线
 			 */
@@ -2538,7 +2656,7 @@
 						// 	});
 						// });
 
-						let generatePoint = crMap.PointObject.generatePoint([121.582205, 37.307908], {
+						let generatePoint = crMap.PointObject.addPoint([121.582205, 37.307908], {
 							label: {
 								text: "aaa"
 							}
@@ -3695,9 +3813,9 @@
 							// });
 
 
-							let flyToEntity = crMap.LocateUtil.flyToEntityByPoints([
-								[116.5921405, 36.9094254, 25.64]
-							], 'point');
+							// let flyToEntity = crMap.LocateUtil.flyToEntityByPoints([
+							// 	[116.5921405, 36.9094254, 25.64]
+							// ], 'point');
 
 							// crMap.PointObject.addBillboardByGeoJson(point_zhamen, {
 							// 	id: 'GeoJsonPoint',
@@ -3719,17 +3837,48 @@
 								url: point_zhamen,
 								billboard: {
 									// imgUrl: "jt3dSDK/imgs/point/point3.png",
+									scaleByDistance: {
+										near: 1000, //相机范围的下界,非必填
+										nearValue: 1, //相机范围下界的值,非必填
+										far: 1000000, //相机范围的上限,非必填
+										farValue: 0 //该值位于摄像机范围的上界,非必填
+									}
 								},
-								label: {
-									// text: "aaa",
-									textField: "objid",
-									pixelOffset: -65, //偏移量
-									fillColor: [255, 255, 0, 1]
-								}
+								// label: {
+								// 	// text: "aaa",
+								// 	textField: "objid",
+								// 	pixelOffset: -65, //偏移量
+								// 	fillColor: [255, 255, 0, 1]
+								// }
 							}, function(serviceId) {
 								_self.serviceIds.GeoJsonPoint_id = serviceId;
 							})
 
+							// crMap.layer.addBillboardByJson({
+							// 		id: 'GeoJsonPoint',
+							// 		url: "http://218.59.194.82:12681/geoserver/sd-jnlw/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=sd-jnlw%3Aghh&outputFormat=application%2Fjson",
+							// 		billboard: {
+							// 			// imgUrl: "jt3dSDK/imgs/point/point3.png",
+							// 			scaleByDistance: {
+							// 				near: 1000, //相机范围的下界,非必填
+							// 				nearValue: 1, //相机范围下界的值,非必填
+							// 				far: 1000000, //相机范围的上限,非必填
+							// 				farValue: 0 //该值位于摄像机范围的上界,非必填
+							// 			}
+							// 		},
+							// 		// label: {
+							// 		// 	// text: "aaa",
+							// 		// 	textField: "o_name",
+							// 		// 	pixelOffset: -65, //偏移量
+							// 		// 	fillColor: [255, 255, 0, 1]
+							// 		// }
+							// 	},
+							// 	function(serviceId) {
+							// 		_self.serviceIds.GeoJsonPoint_id = serviceId;
+							// 	})
+
+
+
 
 							//添加广告牌,用于单击显示信息
 							// fetch("/dataFile/point_zhamen.json").then(res => {
@@ -3776,6 +3925,71 @@
 							});
 						}
 						break;
+					case "GeoJsonWall": //GeoJson Wall
+						if (selNode.checked) {
+
+							// crMap.WallObject.drawWallByGeoJson("http://218.59.194.82:13480/ocean_data/hyshp.json").then(res => {
+							// 	_self.serviceIds.GeoJsonWall_id = "GeoJsonWall";
+							// });
+
+							// .json文件需要放到public文件夹下,直接调用,
+							crMap.WallObject.drawWallByGeoJson("dataFile/fanweixian2.json", {
+								minimunHeights: 0,
+								maximumHeights: 1000,
+								color: [255, 255, 0, 1],
+								trailImage: 'jt3dSDK/imgs/wallmaterial/wl.png',
+								duration: 3000,
+								count: 5,
+								direction: 'vertical',
+								order: '-'
+							}).then(res => {
+								_self.serviceIds.GeoJsonWall_id = "GeoJsonWall";
+							});
+							//.json文件放到public下不能import,放到assets下import路径有问题
+							// crMap.WallObject.drawWallByGeoJson(fanweixian2).then(res => {
+							// 	_self.serviceIds.GeoJsonWall_id = "GeoJsonWall";
+							// });
+
+						} else {
+							crMap.layer.removeDataSources({
+								serviceId: _self.serviceIds.GeoJsonWall_id,
+							});
+						}
+
+
+						// // 初始化项目区域范围视角
+						// let optionsS = {
+						// 	west: 110.88459807402462,
+						// 	south: 15.598579935800508,
+						// 	east: 119.0687931142047,
+						// 	north: 21.8052784272975,
+						// 	isRemove: false, //定位完成后是否删除
+						// 	duration: 3, //飞行时间
+						// 	heading: 0,
+						// 	pitch: -90,
+						// 	range: 1052000
+						// };
+
+						// let optionsE = {
+						// 	west: 110.88459807402462,
+						// 	south: 15.598579935800508,
+						// 	east: 119.0687931142047,
+						// 	north: 21.8052784272975,
+						// 	isRemove: true, //定位完成后是否删除
+						// 	duration: 3, //飞行时间
+						// 	heading: 0,
+						// 	pitch: -60,
+						// 	range: 1052000
+						// };
+
+						// var fullMapPromise = crMap.fullMap(optionsS);
+						// fullMapPromise.then(function(flyPromise) {
+						// 	crMap.fullMap(optionsE);
+						// });
+
+						break;
+
+
 					default:
 						break;
 				}
@@ -3788,6 +4002,8 @@
 
 				crMap.DrawTools.Clear();
 				crMap.DrawToolsEdit.Clear();
+				crMap.DrawPointEdit.clearAll();
+				crMap.DrawMilitaryPlot.clearAll();
 			},
 
 			/**
@@ -4030,8 +4246,28 @@
 			});
 			crMap.DrawPointEdit = new jt3d.DrawPoint(crMap._viewer);
 
-			crMap.DrawMilitaryPlot = new jt3d.DrawMilitaryPlot(crMap._viewer);
-			// jt3d.DrawMilitaryPlot.init(crMap._viewer);
+			// crMap.DrawMilitaryPlot = new jt3d.DrawMilitaryPlot(crMap._viewer);
+
+			crMap.DrawMilitaryPlot = new jt3d.DrawMilitaryPlot({
+				viewer: crMap._viewer,
+				Cesium: Cesium,
+			});
+
+			// 创建编辑
+			// jt3d.DrawMilitaryPlot.init({
+			// 	viewer: crMap._viewer,
+			// 	Cesium: Cesium,
+			// });
+			// crMap.Enit = jt3d.DrawMilitaryPlot.editActivate();
+			// // 编辑修改实体完成返回数据
+			// crMap.Enit.EditEndEvent.addEventListener((entity) => {
+			// 	let position = entity._Position;
+			// 	let id = entity._id;
+			// 	console.log({
+			// 		position,
+			// 		id
+			// 	})
+			// })
 
 			crMap.ParticleSystem = new jt3d.SceneEffects.ParticleSystem(crMap._viewer);
 
@@ -4061,6 +4297,7 @@
 			crMap.PolylineObject = new jt3d.PolylineObject(crMap._viewer);
 			crMap.PointObject = new jt3d.PointObject(crMap._viewer);
 			crMap.PolygonObject = new jt3d.PolygonObject(crMap._viewer);
+			crMap.WallObject = new jt3d.WallObject(crMap._viewer);
 
 			window["viewer"] = crMap._viewer;
 

+ 99 - 0
src/jtMap3d/Assets/styles/tooltip.css

@@ -0,0 +1,99 @@
+.twipsy {
+    display: block;
+    position: absolute;
+    visibility: visible;
+    max-width: 200px;
+    min-width: 100px;
+    padding: 5px;
+    font-size: 11px;
+    z-index: 1000;
+    opacity: 0.8;
+    -khtml-opacity: 0.8;
+    -moz-opacity: 0.8;
+    filter: alpha(opacity=80);
+}
+.twipsy.left .twipsy-arrow {
+    top: 50%;
+    right: 0;
+    margin-top: -5px;
+    border-top: 5px solid transparent;
+    border-bottom: 5px solid transparent;
+    border-left: 5px solid #000000;
+}
+.twipsy.right .twipsy-arrow {
+    top: 50%;
+    left: 0;
+    margin-top: -5px;
+    border-top: 5px solid transparent;
+    border-bottom: 5px solid transparent;
+    border-right: 5px solid #000000;
+}
+.twipsy-inner {
+    padding: 3px 8px;
+    background-color: #000000;
+    color: white;
+    text-align: center;
+    max-width: 200px;
+    text-decoration: none;
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+    border-radius: 4px;
+}
+.twipsy-arrow {
+    position: absolute;
+    width: 0;
+    height: 0;
+}
+
+/*
+css rules for the draw helper components
+*/
+
+.toolbar {
+    margin: 0px;
+    padding: 0px;
+    background: white;
+}
+
+.toolbar > .button {
+    margin: 5px;
+    padding: 5px;
+    border: 1px solid #eee;
+    cursor: pointer;
+}
+
+.toolbar > .button:hover {
+    background: #eee;
+}
+
+/*
+css rules for the infowindow
+*/
+
+.infoWindow {
+    position: absolute;
+    min-width: 100px;
+    max-width: 300px;
+}
+.infoWindow #frame {
+    padding: 10px;
+    border: 1px solid black;
+    background: white;
+}
+.infoWindow #close {
+    float: right;
+    margin: 5px 2px;
+    font-size: small;
+    color: gray;
+    cursor: pointer;
+}
+.infoWindow #arrow {
+    position: absolute;
+    bottom: -8px;
+    left: 50%;
+    margin-left: -10px;
+    border-right: 10px solid transparent;
+    border-left: 10px solid transparent;
+    border-top: 10px solid white;
+}
+

+ 160 - 0
src/jtMap3d/Widgets/CircleObject.js

@@ -0,0 +1,160 @@
+/* 引入Cesium */
+// import * as Cesium from 'Cesium';
+
+import {
+	setSessionid
+} from "./common/common.js";
+
+/**
+ *流动纹理
+ */
+import CircleMaterialProperty from "./CircleObject/CircleMaterialProperty.js";
+import CircleRippleMaterialProperty from "./CircleObject/CircleRippleMaterialProperty.js";
+
+/**
+ * 墙体对象
+ */
+class CircleObject {
+	/**
+	 * 默认初始化
+	 */
+	constructor(viewer) {
+		if (!viewer) throw new Cesium.DeveloperError('no viewer object!');
+		this._viewer = viewer;
+	}
+}
+
+/**
+ * 通用对外公开函数 
+ */
+Object.assign(CircleObject.prototype, /** @lends CircleObject.prototype */ {
+
+	/**
+	 * @description 绘制动态圆
+	 * @param {String} centerPoint 圆心坐标
+	 * @param {String} radius 圆半径
+	 * @param {Object} [options] 圆的样式,具有以下属性:
+	 * @param {Number} [options.id] 用于移除
+	 * @param {Number} [options.clampToGround=true] 是否贴地
+	 * @param {String} [options.color="#FF0000"] 指定圆的颜色
+
+	 * @param {String} [options.outlineColor="#FFFF00"] 指定点轮廓的颜色
+	 * @param {Number} [options.outlineWidth=0] 指定点轮廓的宽度
+	 * 
+	 * @param {Number} [options.CircleType='ColorCircle'] ColorCircle / DynamicCircle
+	 * @param {Number} [options.duration=3000] 持续时间 毫秒,越小越快
+	 * @param {Number} [options.count=1] 重复次数
+	 */
+	drawCircle: function(centerPoint, radius, options) {
+		return new Promise((resolve, reject) => {
+			let _self = this;
+			let viewer = this._viewer;
+
+			if (!Cesium.defined(centerPoint)) {
+				throw new Cesium.DeveloperError("centerPoint is required.");
+			}
+
+			if (!Cesium.defined(radius)) {
+				throw new Cesium.DeveloperError("radius is required.");
+			}
+
+			//坐标位置
+			let position;
+			if (centerPoint instanceof Cesium.Cartesian3) {
+				position = centerPoint;
+			} else {
+				position = Cesium.Cartesian3.fromDegrees(centerPoint[0], centerPoint[1], centerPoint[2] || 0);
+			}
+
+			//半径
+			if (typeof radius === 'number' && radius > 0) {
+				radius = radius;
+			} else {
+				radius = 100
+			}
+
+			options = options || {};
+			options.id = options.id || setSessionid();
+			options.clampToGround = Cesium.defaultValue(options.clampToGround, true);
+			options.CircleType = Cesium.defaultValue(options.CircleType, 'ColorCircle');
+
+			options.duration = Cesium.defaultValue(options.duration, 3000);
+			options.count = Cesium.defaultValue(options.count, 1);
+
+			if (options.color) {
+				if (options.color instanceof Array) {
+					options.color = new Cesium.Color(options.color[0] / 255, options.color[1] / 255, options.color[2] / 255, options.color[3]);
+				} else if (typeof(options.color) === 'string') {
+					options.color = new Cesium.Color.fromCssColorString(options.color);
+				} else {
+					options.color = new Cesium.Color.fromCssColorString("#FFFF00");
+				}
+			}
+
+			if (options.outlineColor) {
+				if (options.outlineColor instanceof Array) {
+					options.outlineColor = new Cesium.Color(options.outlineColor[0] / 255, options.outlineColor[1] / 255, options.outlineColor[2] / 255, options.outlineColor[3]);
+				} else if (typeof(options.outlineColor) === 'string') {
+					options.outlineColor = new Cesium.Color.fromCssColorString(options.outlineColor);
+				} else {
+					options.outlineColor = new Cesium.Color.fromCssColorString("#FFFF00");
+				}
+			}
+			options.outlineWidth = Cesium.defaultValue(options.outlineWidth, 0);
+
+
+			/* 创建面材质 */
+			let polygonMaterial = options.color;
+			/* 创建线材质 */
+			// let outlineMaterial = new Cesium.PolylineDashMaterialProperty({//虚线
+			// 	dashLength: 16,
+			// 	color: options.outlineColor
+			// });
+			let outlineMaterial = options.outlineColor;
+
+			if (options.CircleType === 'DynamicCircle') {
+				// polygonMaterial = new CircleMaterialProperty({
+				// 	viewer: viewer,
+				// 	duration: options.duration,
+				// 	color: options.color,
+				// 	count: options.count,
+				// });
+
+				polygonMaterial = new Cesium.CircleRippleMaterialProperty({
+					color: options.color,
+					speed: options.duration/1000,
+					count: options.count,
+					gradient: 0.2
+				})
+			}
+
+			let entity = new Cesium.Entity({
+				id: options.id,
+				//位置
+				position: position,
+				//椭圆
+				ellipse: {
+					//半短轴(画圆:半短轴和半长轴一致即可)
+					semiMinorAxis: radius,
+					// 半长轴
+					semiMajorAxis: radius,
+					// 填充色
+					material: polygonMaterial,
+					// 是否有边框
+					outline: true,
+					// 边框颜色
+					outlineColor: options.outlineColor,
+					// 边框宽度
+					outlineWidth: options.outlineWidth
+				}
+			});
+
+			let flyEntity = viewer.entities.add(entity);
+
+			resolve(entity, flyEntity)
+
+		});
+	},
+});
+
+export default CircleObject;

+ 181 - 0
src/jtMap3d/Widgets/CircleObject/CircleMaterialProperty.js

@@ -0,0 +1,181 @@
+/**
+ * 创建者:王成
+ * 操作系统:MAC
+ * 创建日期:2022年12月29日
+ * 描述:动态扩散圆材质
+ */
+class CircleMaterialProperty {
+	/**
+	 * 构造方法
+	 * @ignore 无需公开
+	 * @param {JSON} options 配置项
+	 * @param {Cesium.Viewer} options.viewer 着色器运行所需的视图
+	 * @param {Cesium.Color} options.color [圆环的颜色,默认蓝色] 可选
+	 * @param {Number} options.duration [循环时间 默认1000] 可选
+	 * @param {Number} options.count [圆环的数量 可选 默认为1]
+	 */
+	constructor(options) {
+		/* 着色器运行依赖的视图 */
+		this._viewer = options.viewer;
+		/* 变更事件 */
+		this._definitionChanged = new Cesium.Event();
+		this._color = undefined;
+		/* 扩算圆环的颜色 */
+		this.color = options.color || Cesium.Color.BLUE;
+		/* 扩散圆环的数量 */
+		this.count = options.count || 1.0;
+		/* 动态循环周期 */
+		this.duration = options.duration || 1000;
+		/* 默认时间 */
+		this._time = (new Date()).getTime();
+		/* 材质类型名称 */
+		this._materialTypeName = 'jtCircleMaterial'
+		/* 存储相关参数的属性 以便后期进行追踪修改 */
+		this._param = {
+			color: this.color._value.toCssColorString(),
+			duration: this.duration,
+			count: this.count,
+		}
+		/* 将材质加入缓存 以便重复利用 */
+		Cesium.Material._materialCache.addMaterial(this._materialTypeName, {
+			fabric: {
+				type: this._materialTypeName,
+				uniforms: {
+					time: 0,
+					color: new Cesium.Color(1.0, 0.0, 0.0, 0.5),
+					count: 1.0,
+				},
+				source: this._getCircleMaterial(),
+			},
+			translucent: function(material) {
+				/* 材质是否半透明 */
+				return true;
+			}
+		});
+	}
+
+	/**
+	 * @ignore 无需公开
+	 * 获取材质着色器Shader
+	 */
+	_getCircleMaterial() {
+		let circleMaterial = "czm_material czm_getMaterial(czm_materialInput materialInput)\n" +
+			"{\n" +
+			"  czm_material material = czm_getDefaultMaterial(materialInput);\n" +
+			"  material.diffuse = 1.5 * color.rgb;\n" +
+			"  vec2 st = materialInput.st;\n" +
+			"  vec3 str = materialInput.str;\n" +
+			"  float dis = distance(st, vec2(0.5, 0.5));\n" +
+			"  float per = fract(time);\n" +
+			"  if (abs(str.z) > 0.001)\n" +
+			"  {\n" +
+			"     //着色器渲染停止,不在绘制内容  \n" +
+			"     discard;\n" +
+			"  }\n" +
+			"  if (dis > 0.5)\n" +
+			"  {\n" +
+			"     //超出半径范围时,着色器渲染停止  \n" +
+			"     discard;\n" +
+			"  } else {\n" +
+			"     //把半径分成count份,每两份之间的间隔距离  \n" +
+			"     float perDis = 0.5 / count;\n" +
+			"     float disNum;\n" +
+			"     float bl = 0.0;\n" +
+			"     //循环,最多999个环  \n" +
+			"     for (int i = 0; i <= 999; i++)\n" +
+			"     {\n" +
+			"        //判断是否属于数量内的环  \n" +
+			"        if (float(i) <= count)\n" +
+			"        {\n" +
+			"           disNum = perDis * float(i) - dis + per / count;\n" +
+			"           if (disNum > 0.0)\n" +
+			"           {\n" +
+			"               if (disNum < perDis)\n" +
+			"               {\n" +
+			"                  bl = 1.0 - disNum / perDis;\n" +
+			"               } else if (disNum - perDis < perDis) {\n" +
+			"                  bl = 1.0 - abs(1.0 - disNum / perDis);\n" +
+			"               }\n" +
+			"               material.alpha = color.a * pow(bl, 3.0);\n" +
+			"           }\n" +
+			"        }\n" +
+			"     }\n" +
+			"  }\n" +
+			"  return material;\n" +
+			"}\n";
+		return circleMaterial;
+	}
+}
+
+/**
+ * @ignore 无需公开
+ * 必须重写的方法
+ */
+Object.assign(CircleMaterialProperty.prototype, {
+	/**
+	 * 重新获取类型方法
+	 * @ignore 无需公开
+	 * @param {Cesium.JulianDate} time 时间
+	 */
+	getType: function(time) {
+		return this._materialTypeName;
+	},
+
+	/**
+	 * 重写获取值方法
+	 * @ignore 无需公开
+	 * @param {Cesium.JulianDate} time
+	 * @param {JSON} result 
+	 */
+	getValue: function(time, result) {
+		if (!Cesium.defined(result)) {
+			result = {};
+		}
+		result.color = Cesium.Property.getValueOrClonedDefault(this._color, time, Cesium.Color.BLUE, result
+			.color);
+		result.count = this.count;
+		if (this.duration) {
+			result.time = (((new Date()).getTime() - this._time) % this.duration) / this.duration;
+		}
+		this._viewer.scene.requestRender();
+		return result;
+	},
+
+	/**
+	 * 重写对比函数
+	 * @ignore 无需公开
+	 * @param {Object} other 传入对比对象
+	 */
+	equals: function(other) {
+		return (this === other || (other instanceof CircleMaterialProperty && Cesium.Property.equals(this
+			._color, other._color)));
+	}
+})
+
+/**
+ * 默认属性
+ */
+Object.defineProperties(CircleMaterialProperty.prototype, {
+	/**
+	 * 判断是否相等,返回false表示属性一直在变化中
+	 * @ignore 无需公开
+	 */
+	isConstant: {
+		get: function() {
+			return false;
+		}
+	},
+	/**
+	 * 事件变更
+	 * @ignore 无需公开
+	 */
+	definitionChanged: {
+		get: function() {
+			return this._definitionChanged;
+		}
+	},
+	/* 颜色属性 */
+	color: Cesium.createPropertyDescriptor('color')
+})
+
+export default CircleMaterialProperty;

+ 132 - 0
src/jtMap3d/Widgets/CircleObject/CircleRippleMaterialProperty.js

@@ -0,0 +1,132 @@
+/*
+ * @Description: 波纹圆效果(和水波纹扩散类似,参考开源代码)
+ * @Version: 1.0
+ * @Author: Julian
+ * @Date: 2022-03-03 21:59:17
+ * @LastEditors: Julian
+ * @LastEditTime: 2022-03-03 23:09:02
+ */
+class CircleRippleMaterialProperty {
+    constructor(options) {
+        this._definitionChanged = new Cesium.Event();
+        this._color = undefined;
+        this._speed = undefined;
+        this.color = options.color;
+        this.speed = options.speed;
+        this.count = options.count;
+        this.gradient = options.gradient;
+    };
+
+    get isConstant() {
+        return false;
+    }
+
+    get definitionChanged() {
+        return this._definitionChanged;
+    }
+
+    getType(time) {
+        return Cesium.Material.CircleRippleMaterialType;
+    }
+
+    getValue(time, result) {
+        if (!Cesium.defined(result)) {
+            result = {};
+        }
+
+        result.color = Cesium.Property.getValueOrDefault(this._color, time, Cesium.Color.RED, result.color);
+        result.speed = Cesium.Property.getValueOrDefault(this._speed, time, 10, result.speed);
+        result.count = this.count;
+        result.gradient = this.gradient;
+        return result
+    }
+
+    equals(other) {
+        return (this === other ||
+            (other instanceof CircleRippleMaterialProperty &&
+                Cesium.Property.equals(this._color, other._color) &&
+                Cesium.Property.equals(this._speed, other._speed) &&
+                Cesium.Property.equals(this.count, other.count) &&
+                Cesium.Property.equals(this.gradient, other.gradient))
+        )
+    }
+}
+
+Object.defineProperties(CircleRippleMaterialProperty.prototype, {
+    color: Cesium.createPropertyDescriptor('color'),
+    speed: Cesium.createPropertyDescriptor('speed'),
+    count: Cesium.createPropertyDescriptor('count'),
+    gradient: Cesium.createPropertyDescriptor('gradient')
+})
+
+Cesium.CircleRippleMaterialProperty = CircleRippleMaterialProperty;
+Cesium.Material.CircleRippleMaterialProperty = 'CircleRippleMaterialProperty';
+Cesium.Material.CircleRippleMaterialType = 'CircleRippleMaterialType';
+Cesium.Material.CircleRippleMaterialSource = `
+                                            uniform vec4 color;
+                                            uniform float speed;
+                                            uniform float count;
+                                            uniform float gradient;
+
+                                            czm_material czm_getMaterial(czm_materialInput materialInput)
+                                            {
+                                            czm_material material = czm_getDefaultMaterial(materialInput);
+                                            material.diffuse = 1.5 * color.rgb;
+                                            vec2 st = materialInput.st;
+                                            float dis = distance(st, vec2(0.5, 0.5));
+                                            float per = fract(czm_frameNumber * speed / 1000.0);
+                                            if(count == 1.0){
+                                                if(dis > per * 0.5){
+                                                discard;
+                                                }else {
+                                                material.alpha = color.a  * dis / per / 2.0;
+                                                }
+                                            } else {
+                                                vec3 str = materialInput.str;
+                                                if(abs(str.z)  > 0.001){
+                                                discard;
+                                                }
+                                                if(dis > 0.5){
+                                                discard;
+                                                } else {
+                                                float perDis = 0.5 / count;
+                                                float disNum;
+                                                float bl = 0.0;
+                                                for(int i = 0; i <= 999; i++){
+                                                    if(float(i) <= count){
+                                                    disNum = perDis * float(i) - dis + per / count;
+                                                    if(disNum > 0.0){
+                                                        if(disNum < perDis){
+                                                        bl = 1.0 - disNum / perDis;
+                                                        }
+                                                        else if(disNum - perDis < perDis){
+                                                        bl = 1.0 - abs(1.0 - disNum / perDis);
+                                                        }
+                                                        material.alpha = pow(bl,(1.0 + 10.0 * (1.0 - gradient)));
+                                                    }
+                                                    }
+                                                }
+                                                }
+                                            }
+                                            return material;
+                                            }
+                                            `
+
+Cesium.Material._materialCache.addMaterial(Cesium.Material.CircleRippleMaterialType, {
+    fabric: {
+        type: Cesium.Material.CircleRippleMaterialType,
+        uniforms: {
+            color: new Cesium.Color(1.0, 0.0, 0.0, 1.0),
+            speed: 3.0,
+            count: 4,
+            gradient: 0.2
+        },
+        source: Cesium.Material.CircleRippleMaterialSource
+    },
+    translucent: function(material) {
+        return true;
+    }
+})
+
+
+export default CircleRippleMaterialProperty;

+ 0 - 9
src/jtMap3d/Widgets/DrawTools/CrEditProperty.ce.vue

@@ -406,15 +406,6 @@
 			isShowLineWidth.value = true;
 			isShowOrder.value = true;
 			isShowArcHeight.value = true;
-		} else if (params.id === 'straightArrow') {
-			title.value = '直线箭头标绘';
-			isShowColor.value = true;
-		} else if (params.id === 'attackArrow') {
-			title.value = '攻击箭头编辑';
-			isShowColor.value = true;
-		} else if (params.id === 'pincerArrow') {
-			title.value = '钳击箭头编辑';
-			isShowColor.value = true;
 		} else {
 			_setShowControls(false);
 		}

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 388 - 0
src/jtMap3d/Widgets/DrawTools/CrEditProperty_MilitaryPlot.ce.vue


+ 478 - 350
src/jtMap3d/Widgets/DrawTools/DrawMilitaryPlot.js

@@ -1,17 +1,52 @@
-import {
-	StraightArrow,
-	AttackArrow,
-	PincerArrow
-} from "./drawArrow/arrowClass.js";
+import MilitaryPlot from './/MilitaryPlot/drawingMethod/index.js'
+
+//编辑类
+import EntityEdit from './MilitaryPlot/EntityEdit.js';
 
 /* 引入属性编辑框 */
-import DialogEditProperty from './CrEditProperty.ce.vue'
+import DialogEditProperty from './CrEditProperty_MilitaryPlot.ce.vue'
 /* 引入组件注册 */
 import {
 	defineCustomElement
 } from 'vue'
 
 /**
+ * 设置附加参数
+ * @ignore 生成方法时不对外公开
+ * @param {JSON} params 参数
+ */
+Cesium.Entity.prototype.setParams = function(params) {
+	this._params = params;
+}
+
+/**
+ * 获取附加参数
+ * @ignore 生成方法时不对外公开
+ */
+Cesium.Entity.prototype.getParams = function() {
+	return this._params;
+}
+
+
+/**
+ * 设置实体是否可编辑
+ * @ignore 生成方法时不对外公开
+ * @param {Boolean} isEdit 是否可编辑
+ */
+Cesium.Entity.prototype.setIsEdit = function(isEdit) {
+	this._isEdit = isEdit;
+}
+
+/**
+ * 获取实体是否可编辑
+ * @ignore 生成方法时不对外公开
+ * @return {Boolean} isEdit
+ */
+Cesium.Entity.prototype.getIsEdit = function() {
+	return this._isEdit;
+}
+
+/**
  * 军事标绘
  */
 class DrawMilitaryPlot {
@@ -19,108 +54,421 @@ class DrawMilitaryPlot {
 	 * 默认初始化
 	 * @param {Object} viewer 三维场景
 	 */
-	constructor(viewer) {
-		if (!viewer) throw new DeveloperError('no viewer object!');
-		this.viewer = viewer;
-		this.isActivate = false;
+	constructor(options) {
+		if (!options.viewer) throw new DeveloperError('no options.viewer object!');
+		if (!options.Cesium) throw new DeveloperError('no options.Cesium object!');
+
+		this._viewer = options.viewer;
+		this.cesium = options.Cesium;
+
 		this.drawArr = [];
-		this.handler = null;
-		this.nowArrowObj = null;
-		this.init();
+		this.Draw = '';
+		// 鼠标点击获取实体修改事件
+		this.edit = new EntityEdit(this._viewer);
+		this.edit.activate(); //激活编辑
+		//获取得到实体 cesium回调机制
+		this.edit.EditEndEntity.addEventListener((result) => {
+			if (result.Type) {
+				this.handleFirstPosition(result.Type);
+				this.edit.DrawExample = this.Draw;
+			}
+			this._editEntity = result; //选中的实体
+		})
 	}
 
-	init() {
-		if (!this.isActivate) {
-			this.isActivate = true;
-			this.bindEdit();
+	/**
+	 * 静态方法 初始化并获取属性编辑参数
+	 */
+	static initEditPropertyParams() {
+		return {
+			id: undefined, //用于标识及传递当前编辑的实体类型 内容为DrawTools.DrawType
+			color: 'rgba(0,255,0,0.75)', //用于颜色标识
+			outlineWidth: 0, //用于标识描边线宽度
+			outlineColor: 'rgba(255,255,255,1)', //用于标识描边线颜色
 		}
+	}
 
-		this._closePropertyEditDialog();
+	// 编辑时获取到实体时调用
+	editActivate() {
+		return this.edit
 	}
 
+	handleFirstPosition(type) {
+		/* 开启地形检测 必须开启 否则会导致获取地形高度时异常 导致鼠标移动时位置哆嗦 */
+		this._viewer.scene.globe.depthTestAgainstTerrain = true;
+		
+		switch (type) {
+			case "DrawStraightArrow":
+				// 绘制直线箭头
+				this.Draw = new MilitaryPlot.DrawStraightArrow({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+			case "DrawAttackArrow":
+				// 绘制攻击箭头
+				this.Draw = new MilitaryPlot.DrawAttackArrow({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+			case "DrawPincerArrow":
+				//绘制钳击箭头
+				this.Draw = new MilitaryPlot.DrawPincerArrow({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+			case "DrawGatheringPlace":
+				this.Draw = new MilitaryPlot.DrawGatheringPlace({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+			case "DrawClosedCurve":
+				this.Draw = new MilitaryPlot.DrawClosedCurve({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+			case "DrawSector":
+				this.Draw = new MilitaryPlot.DrawSector({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+			case "DrawArc":
+				this.Draw = new MilitaryPlot.DrawArc({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+			case "DrawLune":
+				this.Draw = new MilitaryPlot.DrawLune({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+			case "DrawCurve":
+				//绘制曲线
+				this.Draw = new MilitaryPlot.DrawCurve({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+			case "DrawCurveFlag":
+				//绘制曲线旗帜
+				this.Draw = new MilitaryPlot.DrawCurveFlag({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+			case "DrawRectFlag":
+				//绘制矩形直角旗帜
+				this.Draw = new MilitaryPlot.DrawRectFlag({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+			case "DrawTriangleFlag":
+				//绘制三角旗帜
+				this.Draw = new MilitaryPlot.DrawTriangleFlag({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+
+			case "DrawPoint":
+				//绘制点
+				this.Draw = new MilitaryPlot.DrawPoint({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+			case "DrawPolyline":
+				// 绘制线
+				this.Draw = new MilitaryPlot.DrawPolyline({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+			case "DrawPolygon":
+				// 多边形
+				this.Draw = new MilitaryPlot.DrawPolygon({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+			case "DrawRectangle":
+				// 绘制矩形
+				this.Draw = new MilitaryPlot.DrawRectangle({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				})
+				break;
+			case "DrawCircle":
+				//绘制圆
+				this.Draw = new MilitaryPlot.DrawCircle({
+					viewer: this._viewer,
+					Cesium: this.cesium
+				});
+				break;
+		}
+	}
+
+	// 加载数据
+	addEntity(data) {
+		this.handleFirstPosition(data.type);
+		if (this.Draw) {
+			let entity = this.Draw.addload(data.position);
+			entity._id = data.id
+			return entity
+		}
+	}
+}
+
+/**
+ * 通用对外公开函数-鼠标事件 
+ */
+Object.assign(DrawMilitaryPlot.prototype, /** @lends DrawMilitaryPlot.prototype */ {
 	/**
-	 * 编辑事件
+	 * 设置鼠标为十字样式
+	 * @ignore 生成方法时不对外公开
+	 */
+	_setMousePointerStyle() {
+		document.querySelector('body').style.cursor = 'crosshair';
+	},
+
+	/**
+	 * 恢复鼠标指针为默认样式
+	 * @ignore 生成方法时不对外公开
+	 */
+	_setMouseDefaultStyle() {
+		document.querySelector('body').style.cursor = 'default';
+	},
+
+	/**
+	 * 注册鼠标左键点击事件
+	 * @ignore 生成方法时不对外公开
+	 * @param {Cesium.ScreenSpaceEventHandler} handler 事件句柄
+	 * @param {Function} callChange 回调callChange(event)
+	 */
+	_registerLeftClickEvent(handler, callChange) {
+		let _self = this;
+		if (!handler) return;
+
+		handler.setInputAction(function(event) {
+			/* 锁定点击事件 以免和移动事件冲突 */
+			_self._lock = true;
+			clearTimeout(_self._timer);
+			_self._timer = setTimeout(function() {
+				if (callChange) callChange(event);
+				/* 解除锁定 */
+				_self._lock = false;
+			}, 200);
+		}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+	},
+
+	/**
+	 * 注册鼠标移动事件
+	 * @ignore 生成方法时不对外公开
+	 * @param {Cesium.ScreenSpaceEventHandler} handler 事件句柄
+	 * @param {Function} callChange 回调callChange(event)
+	 */
+	_registerMouseMoveEvent(handler, callChange) {
+		let _self = this;
+		if (!handler) return;
+
+		handler.setInputAction(function(event) {
+			if (_self._lock === undefined || _self._lock === false) {
+				if (callChange) callChange(event);
+			}
+		}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+	},
+
+	/**
+	 * 注册鼠标左键按下事件
+	 * @ignore 生成方法时不对外公开
+	 * @param {Cesium.ScreenSpaceEventHandler} handler 事件句柄
+	 * @param {Function} callChange 回调callChange(event)
+	 */
+	_registerLeftDownEvent(handler, callChange) {
+		if (!handler) return;
+		handler.setInputAction(function(event) {
+			if (callChange) callChange(event);
+		}, Cesium.ScreenSpaceEventType.LEFT_DOWN);
+	},
+
+	/**
+	 * 注册鼠标左键抬起事件
+	 * @ignore 生成方法时不对外公开
+	 * @param {Cesium.ScreenSpaceEventHandler} handler 事件句柄
+	 * @param {Function} callChange 回调callChange(event)
+	 */
+	_registerLeftUpEvent(handler, callChange) {
+		if (!handler) return;
+		handler.setInputAction(function(event) {
+			if (callChange) callChange(event);
+		}, Cesium.ScreenSpaceEventType.LEFT_UP);
+	},
+
+	/**
+	 * 清除事件
 	 * @ignore
+	 * @param {Cesium.ScreenSpaceEventHandler} handler
 	 */
-	bindEdit() {
-		var _self = this;
-		this.handler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
-		this.handler.setInputAction(function(evt) { //单机开始绘制
+	_clearEvent(handler) {
+		if (!handler) return;
+
+		/* 干掉事件句柄 释放资源 */
+		handler.destroy();
+		handler = null;
+	}
+
+});
+
+/**
+ * 属性编辑相关
+ */
+Object.assign(DrawMilitaryPlot.prototype, {
+
+	/**
+	 * 设置实体可编辑,编辑的实体必须包含编辑类型
+	 * @ignore 生成方法时不对外公开
+	 * @param {Cesium.Entity} entity 编辑的实体
+	 */
+	_setEntityIsEdit(entity) {
+		let _self = this;
+
+		/* 关闭属性编辑框 */
+		this._closePropertyEditDialog();
+
+		/* 设置实体要素可编辑 */
+		entity.setIsEdit(true);
+		this.edit.handlePickEditEntity(entity);
+
+		/* 激活编辑 并显示属性编辑框 */
+		this._sendShowPropertyDialog(entity);
+
+		/* 注册统一事件 用于单击拾取实体 */
+		let handler = new Cesium.ScreenSpaceEventHandler(this._viewer.scene.canvas);
+		this._registerLeftClickEvent(handler, function(event) {
+			/* 只要点击 关闭属性编辑框 */
 			_self._closePropertyEditDialog();
-			if (_self.nowArrowObj) {
-				// _self.nowArrowObj.disableHandler();
-				// _self.nowArrowObj.floatPoint.show = false;
-				
-				if (_self.nowArrowObj.firstPoint) {
-					_self.nowArrowObj.firstPoint.show = false;
-				}
-				if (_self.nowArrowObj.floatPoint) {
-					_self.nowArrowObj.floatPoint.show = false;
-				}
-				if (_self.nowArrowObj.pointArr) {
-					for (var i = 0; i < _self.nowArrowObj.pointArr.length; i++) {
-						_self.nowArrowObj.pointArr[i].show = false;
-					}
+
+			let feature = _self._viewer.scene.pick(event.position);
+			if (feature !== undefined && feature.id instanceof Cesium.Entity) {
+				let editEntity = feature.id;
+				if (
+					editEntity.Type == 'DrawStraightArrow' ||
+					editEntity.Type == 'DrawAttackArrow' ||
+					editEntity.Type == 'DrawPincerArrow' ||
+					editEntity.Type == 'DrawGatheringPlace' ||
+					editEntity.Type == 'DrawClosedCurve' ||
+					editEntity.Type == "DrawSector" ||
+					editEntity.Type == "DrawArc" ||
+					editEntity.Type == "DrawLune" ||
+					editEntity.Type == 'DrawCurve' ||
+					editEntity.Type == 'DrawCurveFlag' ||
+					editEntity.Type == 'DrawRectFlag' ||
+					editEntity.Type == 'DrawTriangleFlag' ||
+
+					editEntity.Type == 'DrawPoint' ||
+					editEntity.Type == 'DrawPolyline' ||
+					editEntity.Type == 'DrawPolygon' ||
+					editEntity.Type == 'DrawRectangle' ||
+					editEntity.Type == 'DrawCircle'
+				) {
+					_self._sendShowPropertyDialog(feature.id);
 				}
 			}
-			var pick = _self.viewer.scene.pick(evt.position);
-			if (Cesium.defined(pick) && pick.id) {
-
-				for (var i = 0; i < _self.drawArr.length; i++) {
-
-					if (pick.id.objId == _self.drawArr[i].objId) {
-						_self.nowArrowObj = _self.drawArr[i];
-						//图形修改
-						_self.nowArrowObj.startModify({
-							onComplete: function(pickObjId) {
-
-								for (var i = 0; i < _self.drawArr.length; i++) {
-									_self.drawArr[i].disableHandler();
-
-									if (pickObjId == _self.drawArr[i].objId) {
-
-										_self.nowArrowObj = _self.drawArr[i];
-										//图形修改
-										_self.nowArrowObj.startModify({
-											onComplete: function(pickObjId) {
-												var editProperty = _self.nowArrowObj._param;
-												if (editProperty !== undefined && _self.onEditProperty !== undefined) {
-													// _self.onEditProperty(editProperty);
-
-													/* 更改测试 */
-													_self._openPropertyEditDialog(editProperty, function(params) {
-														_self.updateEditEntityProperty(params);
-													}, function() {
-														_self.clearOne();
-													});
-												}
-											}
-										});
-									}
-								}
-							}
-						});
-
-						//监听编辑属性
-						var editProperty = _self.nowArrowObj._param;
-						if (editProperty !== undefined && _self.onEditProperty !== undefined) {
-							// _self.onEditProperty(editProperty);
-
-							/* 更改测试 */
-							_self._openPropertyEditDialog(editProperty, function(params) {
-								_self.updateEditEntityProperty(params);
-							}, function() {
-								_self.clearOne();
-							});
-						}
-
-						break;
-					}
+		});
+	},
+
+	/**
+	 * 打开实体编辑对话框
+	 * @ignore 生成方法时不对外公开
+	 * @param {Cesium.Entity} entity
+	 */
+	_sendShowPropertyDialog(entity) {
+
+		let _self = this;
+		/* 获取可编辑实体的类型 */
+		let editEntityType = entity.Type;
+		if (entity.getIsEdit() === undefined || entity.getIsEdit() === false || editEntityType === undefined) {
+			/* 选择的实体不可编辑 */
+			return;
+		}
+
+		/* 编辑属性 */
+		let editProperty = entity.getParams();
+		if (editProperty !== undefined && this.onEditProperty !== undefined) {
+			editProperty.id = editEntityType;
+
+			/* 更改测试 */
+			_self._openPropertyEditDialog(editProperty,
+				//编辑回调
+				function(params) {
+					_self.updateEditEntityProperty(params);
+				},
+				//移除回调
+				function() {
+					// _self.Draw.clear();
+					_self._viewer.entities.remove(entity);
+					_self.edit.clearAllEditVertex(); //禁用编辑
 				}
-			}
-		}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+			);
+		}
+	},
+	
+	/**
+	 * 更新当前编辑的实体属性
+	 * @param {JSON} params
+	 */
+	updateEditEntityProperty: function(params) {
+		let _self = this;
+		
+		if (this._editEntity === undefined) return;
+		if (this._editEntity.getIsEdit() === undefined || this._editEntity.getIsEdit() === false) return;
+		let editEntityType = this._editEntity.Type;
+		if (editEntityType === undefined) return;
+		
+		let material = this._editEntity.polygon.material;
+		if (material instanceof Cesium.ColorMaterialProperty) {
+			let newMaterial = this._materialColorProperty({
+				color: params.color,
+			});
+			this._editEntity.polygon.material = newMaterial;
+		}
+		if (this._editEntity.polyline !== undefined) {
+			let newMaterial = this._materialColorProperty({
+				color: params.outlineColor,
+			});
+			this._editEntity.polyline.material = newMaterial;
+			this._editEntity.polyline.width = parseFloat(params.outlineWidth);
+		}
+		/* 重新关联墙实体的属性 */
+		this._editEntity.setParams(params);
+	},
+	
+	/**
+	 * 颜色材质
+	 * @ignore 生成方法时不对外公开
+	 * @param {JSON} options 配置项
+	 * @param {String} options.color 文字颜色 rgba(r,g,b,a)
+	 */
+	_materialColorProperty(options) {
+		let mColor = 'rgba(0,255,0,1)';
+		if (options !== undefined && options.color !== undefined) mColor = options.color;
+		/* 创建材质 */
+		let colorMaterial = new Cesium.ColorMaterialProperty(Cesium.Color.fromCssColorString(mColor));
+		colorMaterial._param = {
+			color: mColor,
+		}
+		/* 返回材质 */
+		return colorMaterial;
 	}
-}
+})
 
 /**
  * 通用对外公开函数 
@@ -129,208 +477,60 @@ Object.assign(DrawMilitaryPlot.prototype, /** @lends DrawMilitaryPlot.prototype
 
 	/**
 	 * 开始绘制
-	 * @param {String} type 绘制类型
-	 * @param {Object} options 
-	 * @param {String} [options.polygonColor] 面填充颜色
-	 * @param {Function} [options.onComplete(points)] 完成回调 可选
+	 * @param {String} type 绘制类型 鼠标点击绘制时调用
 	 */
-	draw: function(type, options) {
-		let _self = this;
+	drawActivate(type) {
+		/* 设置鼠标样式为十字 */
+		this._setMousePointerStyle();
 
-		for (var i = 0; i < this.drawArr.length; i++) {
-			this.drawArr[i].disableHandler();
-		}
+		this.handleFirstPosition(type);
+		this.Draw.startCreate(type)
 
-		switch (type) {
-			case DrawMilitaryPlot.DrawType.StraightArrow: //直箭头
-				var straightArrow = new StraightArrow(this.viewer, options);
-				straightArrow.startDraw({
-					onComplete: function(catesian3, Latlng) {
-
-						//绘制完成后,启用图形修改
-						straightArrow.startModify({
-							onComplete: function(pickObjId) {
-								for (var i = 0; i < _self.drawArr.length; i++) {
-									_self.drawArr[i].disableHandler();
-									if (pickObjId == _self.drawArr[i].objId) {
-										_self.nowArrowObj = _self.drawArr[i];
-										//图形修改
-										_self.nowArrowObj.startModify({
-											onComplete: function(pickObjId) {
-												var editProperty = _self.nowArrowObj._param;
-												if (editProperty !== undefined && _self.onEditProperty !== undefined) {
-													// _self.onEditProperty(editProperty);
-
-													/* 更改测试 */
-													_self._openPropertyEditDialog(editProperty, function(params) {
-														_self.updateEditEntityProperty(params);
-													}, function() {
-														_self.clearOne();
-													});
-												}
-											}
-										});
-									}
-								}
-							}
-						});
-
-						var editProperty = _self.nowArrowObj._param;
-						if (editProperty !== undefined && _self.onEditProperty !== undefined) {
-							// _self.onEditProperty(editProperty);
-
-							/* 更改测试 */
-							_self._openPropertyEditDialog(editProperty, function(params) {
-								_self.updateEditEntityProperty(params);
-							}, function() {
-								_self.clearOne();
-							});
-						}
-
-						/* 返回坐标 */
-						if (options.onComplete) options.onComplete(catesian3, Latlng);
-					}
-				});
-				this.nowArrowObj = straightArrow;
-				this.drawArr.push(straightArrow);
-				break;
-			case DrawMilitaryPlot.DrawType.AttackArrow: //攻击箭头
-				var attackArrow = new AttackArrow(this.viewer, options);
-				attackArrow.startDraw({
-					onComplete: function(catesian3, Latlng) {
-						//图形修改
-						attackArrow.startModify({
-							onComplete: function(pickObjId) {
-								for (var i = 0; i < _self.drawArr.length; i++) {
-									_self.drawArr[i].disableHandler();
-									if (pickObjId == _self.drawArr[i].objId) {
-										_self.nowArrowObj = _self.drawArr[i];
-										//图形修改
-										_self.nowArrowObj.startModify({
-											onComplete: function(pickObjId) {
-												var editProperty = _self.nowArrowObj._param;
-												if (editProperty !== undefined && _self.onEditProperty !== undefined) {
-													// _self.onEditProperty(editProperty);
-
-													/* 更改测试 */
-													_self._openPropertyEditDialog(editProperty, function(params) {
-														_self.updateEditEntityProperty(params);
-													}, function() {
-														_self.clearOne();
-													});
-												}
-											}
-										});
-									}
-								}
-							}
-						});
-
-						var editProperty = _self.nowArrowObj._param;
-						if (editProperty !== undefined && _self.onEditProperty !== undefined) {
-							// _self.onEditProperty(editProperty);
-
-							/* 更改测试 */
-							_self._openPropertyEditDialog(editProperty, function(params) {
-								_self.updateEditEntityProperty(params);
-							}, function() {
-								_self.clearOne();
-							});
-						}
-
-						/* 返回坐标 */
-						if (options.onComplete) options.onComplete(catesian3, Latlng);
-					}
-				});
-				this.nowArrowObj = attackArrow;
-				this.drawArr.push(attackArrow);
-				break;
-			case DrawMilitaryPlot.DrawType.PincerArrow: //钳击箭头
-				var pincerArrow = new PincerArrow(this.viewer, options);
-				pincerArrow.startDraw({
-					onComplete: function(catesian3, Latlng) {
-						//图形修改
-						pincerArrow.startModify({
-							onComplete: function(pickObjId) {
-								for (var i = 0; i < _self.drawArr.length; i++) {
-									_self.drawArr[i].disableHandler();
-									if (pickObjId == _self.drawArr[i].objId) {
-										_self.nowArrowObj = _self.drawArr[i];
-										//图形修改
-										_self.nowArrowObj.startModify({
-											onComplete: function(pickObjId) {
-												var editProperty = _self.nowArrowObj._param;
-												if (editProperty !== undefined && _self.onEditProperty !== undefined) {
-													// _self.onEditProperty(editProperty);
-
-													/* 更改测试 */
-													_self._openPropertyEditDialog(editProperty, function(params) {
-														_self.updateEditEntityProperty(params);
-													}, function() {
-														_self.clearOne();
-													});
-												}
-											}
-										});
-									}
-								}
-							}
-						});
-
-						var editProperty = _self.nowArrowObj._param;
-						if (editProperty !== undefined && _self.onEditProperty !== undefined) {
-							// _self.onEditProperty(editProperty);
-
-							/* 更改测试 */
-							_self._openPropertyEditDialog(editProperty, function(params) {
-
-								_self.updateEditEntityProperty(params);
-							}, function() {
-								_self.clearOne();
-							});
-						}
-
-						/* 返回坐标 */
-						if (options.onComplete) options.onComplete(catesian3, Latlng);
-					}
-				});
-				this.nowArrowObj = pincerArrow;
-				this.drawArr.push(pincerArrow);
-			default:
-				break;
-		}
-	},
+		// 标绘完成返回数据
+		this.Draw.DrawEndEvent.addEventListener((entity, positions, drawType) => {
+			console.log({
+				entity,
+				positions,
+				drawType
+			});
 
-	/**
-	 * 编辑属性
-	 * @param {Object} params
-	 */
-	updateEditEntityProperty(params) {
-		params.polygonColor = params.color;
-		this.nowArrowObj._updatePolygonProperty(params); //编辑属性
+			// 恢复鼠标指针为默认样式
+			this._setMouseDefaultStyle();
+
+			if (entity) {
+
+
+				let entityParam = DrawMilitaryPlot.initEditPropertyParams();
+				entity.setParams(entityParam);
+
+				// 设置实体可编辑,编辑的实体必须包含编辑类型
+				this._setEntityIsEdit(entity);
+			}
+		});
+
+		this.drawArr.push(this.Draw);
+
+		return this.Draw
 	},
 
 	/**
 	 * 删除选定图形
 	 */
 	clearOne: function() {
-		var $this = this;
-		$this.nowArrowObjID = $this.nowArrowObj.objId
-		for (var i = 0; i < $this.drawArr.length; i++) {
-			if ($this.nowArrowObjID == $this.drawArr[i].objId) {
-				$this.drawArr[i].clear();
-				$this.drawArr.splice(i, 1);
-			}
-		}
+
+		this.Draw.clear();
+		// this.edit.deactivate(); //禁用编辑
 	},
 
 	/**
 	 * 删除所有图形
 	 */
 	clearAll: function() {
+
 		for (var i = 0; i < this.drawArr.length; i++) {
 			this.drawArr[i].clear();
 		}
+		this.edit.deactivate(); //禁用编辑
 
 		/* 关闭属性编辑框 */
 		this._closePropertyEditDialog();
@@ -341,68 +541,6 @@ Object.assign(DrawMilitaryPlot.prototype, /** @lends DrawMilitaryPlot.prototype
 			document.body.removeChild(buttonDiv);
 		}
 	},
-
-	/**
-	 * 保存绘图坐标
-	 */
-	saveData: function() { //保存用户数据
-
-		return new Promise((resolve, reject) => {
-			var jsonData = {
-				straightArrowData: [],
-				attackArrowData: [],
-				pincerArrowData: []
-			}
-			for (var step = 0; step < this.drawArr.length; step++) {
-				var item = this.drawArr[step];
-				var positions = item.getLnglats();
-				if (item.type == "StraightArrow") {
-					jsonData.straightArrowData.push(positions);
-				} else if (item.type == "AttackArrow") {
-					jsonData.attackArrowData.push(positions);
-				} else {
-					jsonData.pincerArrowData.push(positions);
-				}
-			}
-			// console.log("保存的数据:" + JSON.stringify(jsonData));
-
-			resolve(jsonData);
-		});
-	},
-
-	/**
-	 * 根据已知数据进行展示
-	 * @param {Object} jsonData
-	 */
-	showData: function(jsonData) { //展示用户保存的数据
-		if (!jsonData) return;
-		var straightArrowArr = jsonData.straightArrowData;
-		var attackArrowArr = jsonData.attackArrowData;
-		var pincerArrowArr = jsonData.pincerArrowData;
-		//展示直线箭头
-		for (var i = 0; i < straightArrowArr.length; i++) {
-			var item = straightArrowArr[i];
-			var straightArrow = new StraightArrow(viewer);
-			straightArrow.createByData(item);
-			this.drawArr.push(straightArrow);
-		}
-
-		//展示攻击箭头
-		for (var j = 0; j < attackArrowArr.length; j++) {
-			var item = attackArrowArr[j];
-			var attackArrow = new AttackArrow(viewer);
-			attackArrow.createByData(item);
-			this.drawArr.push(attackArrow);
-		}
-		//展示钳击箭头
-		for (var z = 0; z < pincerArrowArr.length; z++) {
-			var item = pincerArrowArr[z];
-			var pincerArrow = new PincerArrow(viewer);
-			pincerArrow.createByData(item);
-			this.drawArr.push(pincerArrow);
-		}
-	},
-
 });
 
 /**
@@ -417,8 +555,8 @@ Object.assign(DrawMilitaryPlot.prototype, {
 	 * @param {Function} callRemove 移除回调
 	 */
 	_openPropertyEditDialog: function(params, callEdit, callRemove) {
-		this._editPropertyDialogDomId = 'dialog-property-dom2';
-		this._registerDOMPropertyEdit = 'dialog-edit-property2'
+		this._editPropertyDialogDomId = 'dialog-property-dom-militaryplot';
+		this._registerDOMPropertyEdit = 'dialog-edit-property-militaryplot'
 		/* 获取一个属性编辑组件 */
 		let PropertyEditComponent = customElements.get(this._registerDOMPropertyEdit);
 		/* 如果组件还未注册 则进行注册 否则不在注册 避免重复注册的BUG */
@@ -468,14 +606,4 @@ Object.assign(DrawMilitaryPlot.prototype, {
 
 })
 
-
-/**
- * 绘制类型
- */
-DrawMilitaryPlot.DrawType = Object.freeze({
-	StraightArrow: 'straightArrow', //直箭头
-	AttackArrow: 'attackArrow', //攻击箭头
-	PincerArrow: 'pincerArrow', //钳击箭头
-})
-
 export default DrawMilitaryPlot;

+ 672 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/EntityEdit.js

@@ -0,0 +1,672 @@
+import * as turf from "@turf/turf"
+
+export default class EntityEdit {
+	constructor(viewer) {
+		this.viewer = viewer;
+		this.DrawExample = '';
+		this.midVertexEntities = [];
+		this.initEventHandler();
+	}
+
+	//鼠标事件
+	initEventHandler() {
+		this.eventHandler = new Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
+		this.EditEndEvent = new Cesium.Event();
+		this.EditEndEntity = new Cesium.Event();
+	}
+
+	//激活编辑
+	activate() {
+		this.deactivate();
+		//鼠标左键点击事件 鼠标左键点击拾取需要编辑的对象
+		this.initLeftClickEventHandler();
+	}
+
+	//禁用编辑
+	deactivate() {
+		this.DrawExample = '';
+		this.eventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
+		this.unRegisterEvents();
+		this.clearAllEditVertex();
+	}
+
+	//清空编辑节点
+	clearAllEditVertex() {
+		this.clearEditVertex();
+		this.clearMidVertex();
+	}
+
+	//左键点击事件
+	initLeftClickEventHandler() {
+		this.eventHandler.setInputAction(e => {
+
+			let id = this.viewer.scene.pick(e.position);
+			if (!id || !id.id) {
+				this.handleEditEntity();
+				return; // 没有拾取到对象 直接返回 不做任何操作
+			}
+
+			// 拾取到对象 判断拾取到的对象类型
+			if (!id.id || !id.id.Type) return;
+			//重复点击同一个对象
+			if (this.editEntity && this.editEntity.id == id.id.id) return;
+			// if (this.editEntity) return
+			//拾取到新的GeoPlot对象
+			this.handleEditEntity(); //处理上一个编辑对象
+			this.handlePickEditEntity(id.id);
+		}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+	}
+
+	//处理编辑对象
+	handleEditEntity() {
+		this.unRegisterEvents();
+		this.clearAllEditVertex();
+		let editEntity = this.editEntity;
+		if (!editEntity) return;
+		this.closeEntityEditMode();
+		this.editEntity = undefined;
+		if (!this.isEdited) return; //没有任何编辑 直接返回   
+
+		// console.log("对象被编辑过是否需要保存操作??");
+
+		//触发编辑事件  
+		this.EditEndEvent.raiseEvent(editEntity);
+		this.isEdited = false;
+		this.isEditing = false;
+	}
+
+	//处理拾取到的对象
+	handlePickEditEntity(pickId) {
+		const EditableTypes = ["DrawAttackArrow", "DrawCircle", "DrawCurve", 'DrawPincerArrow', 'DrawPoint', 'DrawPolygon', 'DrawPolyline', 'DrawRectangle', 'DrawStraightArrow', 'DrawGatheringPlace', 'DrawSector', 'DrawClosedCurve', 'DrawArc', 'DrawLune', 'DrawRectFlag', 'DrawTriangleFlag', 'DrawCurveFlag'];
+		if (EditableTypes.indexOf(pickId.Type) == -1) return;
+		this.editEntity = pickId;
+		this.EditEndEntity.raiseEvent(this.editEntity);
+		this.isEditing = false;
+		this.isEdited = false;
+
+		this.editPositions = this.getEditEntityPositions();
+		this.EditMoveCenterPositoin = this.getCenterPosition();
+
+		this.openEntityEditModel();
+
+		this.clearAllEditVertex();
+		this.unRegisterEvents();
+		this.createEditVertex();
+		this.createMidVertex();
+		this.registerEvents();
+	}
+
+	openEntityEditModel() {
+		if (this.DrawExample == '') return
+		switch (this.editEntity.Type) {
+			case "DrawStraightArrow":
+				this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions);
+				}, false);
+				break;
+			case "DrawAttackArrow":
+				this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions);
+				}, false);
+				break;
+			case "DrawPincerArrow":
+				this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions);
+				}, false);
+				break;
+			case "DrawGatheringPlace":
+				this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions);
+				}, false);
+				break;
+			case "DrawClosedCurve":
+				this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions).PolygonHierarchy;
+				}, false);
+				this.editEntity.polyline.positions = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions).pList;
+				}, false);
+				break;
+			case "DrawCircle":
+				this.editEntity.position = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions).position
+				}, false)
+				this.editEntity.ellipse.semiMinorAxis = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions).r
+				}, false);
+				this.editEntity.ellipse.semiMajorAxis = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions).r
+				}, false);
+				break;
+			case "DrawCurve":
+				this.editEntity.polyline.positions = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions);
+				}, false);
+				break;
+
+			case "DrawPoint":
+				this.editEntity.position = new Cesium.CallbackProperty(e => {
+					return this.editPositions[0];
+				}, false);
+				break;
+			case "DrawPolygon":
+				this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions);
+				}, false);
+				break;
+			case "DrawPolyline":
+				this.editEntity.polyline.positions = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions);
+				}, false);
+				break;
+			case "DrawRectangle":
+				this.editEntity.rectangle.coordinates = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions);
+				}, false);
+				break;
+
+			case "DrawSector":
+				this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions);
+				}, false);
+				break;
+
+			case "DrawArc":
+				this.editEntity.polyline.positions = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions);
+				}, false);
+				break;
+			case "DrawLune":
+				this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions);
+				}, false);
+				break;
+			case "DrawRectFlag":
+				this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions)[0]
+				}, false);
+				this.editEntity.polyline.positions = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions)[1];
+				}, false);
+				break;
+
+			case "DrawTriangleFlag":
+				this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions)[0]
+				}, false);
+				this.editEntity.polyline.positions = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions)[1];
+				}, false);
+				break;
+
+			case "DrawCurveFlag":
+				this.editEntity.polygon.hierarchy = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions)[0]
+				}, false);
+				this.editEntity.polyline.positions = new Cesium.CallbackProperty(e => {
+					return this.DrawExample.computePosition(this.editPositions)[1];
+				}, false);
+				break;
+		}
+	}
+
+	closeEntityEditMode() {
+		if (this.DrawExample == '') return
+		let position = '';
+		switch (this.editEntity.Type) {
+			case "DrawStraightArrow":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.polygon.hierarchy = position;
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+			case "DrawAttackArrow":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.polygon.hierarchy = position;
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+			case "DrawPincerArrow":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.polygon.hierarchy = position;
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+			case "DrawGatheringPlace":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.polygon.hierarchy = position;
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+			case "DrawClosedCurve":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.polygon.hierarchy = position.PolygonHierarchy;
+				this.editEntity.polyline.positions = position.pList;
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+			case "DrawCircle":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.position = position.position
+				this.editEntity.ellipse.semiMinorAxis = position.r;
+				this.editEntity.ellipse.semiMajorAxis = position.r;
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+			case "DrawCurve":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.polyline.positions = position;
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+
+			case "DrawPoint":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.position = position;
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+			case "DrawPolygon":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.polygon.hierarchy = position;
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+			case "DrawPolyline":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.polyline.positions = position;
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+			case "DrawRectangle":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.rectangle.coordinates = position;
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+
+			case "DrawSector":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.polygon.hierarchy = position;
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+
+			case "DrawArc":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.polyline.positions = position;
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+			case "DrawLune":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.polygon.hierarchy = position;
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+
+			case "DrawRectFlag":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.polygon.hierarchy = position[0];
+				this.editEntity.polyline.positions = position[1];
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+
+			case "DrawTriangleFlag":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.polygon.hierarchy = position[0];
+				this.editEntity.polyline.positions = position[1];
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+
+			case "DrawCurveFlag":
+				position = this.DrawExample.computePosition(this.editPositions);
+				this.editEntity.polygon.hierarchy = position[0];
+				this.editEntity.polyline.positions = position[1];
+				this.editEntity.Position = this.DrawExample.getData();
+				break;
+		}
+	}
+
+	getEditEntityPositions() {
+		let position = this.editEntity.Position;
+		let positionArr = [];
+		switch (this.editEntity.Type) {
+			case "DrawAttackArrow":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+			case "DrawCircle":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+			case "DrawCurve":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+			case "DrawPincerArrow":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+			case "DrawPoint":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+			case "DrawPolygon":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+			case "DrawPolyline":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+			case "DrawRectangle":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+			case "DrawStraightArrow":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+			case "DrawGatheringPlace":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+			case "DrawSector":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+			case "DrawClosedCurve":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+			case "DrawArc":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+			case "DrawLune":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+			case "DrawRectFlag":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+
+			case "DrawTriangleFlag":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+
+			case "DrawCurveFlag":
+				for (let i = 0; i < position.length; i++) {
+					positionArr.push(this.LatlngTocartesian(position[i]))
+				}
+				return positionArr;
+		}
+	}
+
+	//注册事件监听
+	registerEvents() {
+		//鼠标左键按下事件 当有对象被选中时 如果拾取到编辑辅助要素 表示开始改变对象的位置
+		this.initLeftDownEventHandler();
+		//鼠标移动事件 鼠标移动 如果有编辑对象 表示改变编辑对象的位置
+		this.initMouseMoveEventHandler();
+		//鼠标左键抬起事件 当有编辑对象时  
+		this.initLeftUpEventHandler();
+	}
+
+	//取消事件监听
+	unRegisterEvents() {
+		this.eventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN);
+		this.eventHandler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP);
+		this.eventHandler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+	}
+
+	//场景鼠标左键按下事件
+	initLeftDownEventHandler() {
+		this.eventHandler.setInputAction((e) => {
+			let id = this.viewer.scene.pick(e.position);
+			// 拾取到对象 判断拾取到的对象类型 
+			if (!id || !id.id || !id.id.type) return;
+			//拾取到具有type 属性的entity对象 
+			if (id.id.type == "EditVertex" || id.id.type == "EditMove") {
+				this.isEditing = true;
+				//禁用场景的旋转移动功能 保留缩放功能
+				this.viewer.scene.screenSpaceCameraController.enableRotate = false;
+				//改变鼠标状态
+				this.viewer.enableCursorStyle = false;
+				this.viewer._element.style.cursor = '';
+				document.body.style.cursor = "move";
+				this.editVertext = id.id;
+				this.editVertext.show = false;
+				this.clearMidVertex();
+			} else if (id.id.type == "EditMidVertex") {
+				this.editPositions.splice(id.id.vertexIndex, 0, id.id.position._value);
+				this.clearAllEditVertex();
+				this.createEditVertex();
+				this.createMidVertex();
+				this.isEdited = true;
+			} else {
+				return
+			}
+		}, Cesium.ScreenSpaceEventType.LEFT_DOWN);
+	}
+
+	//场景鼠标左键抬起事件
+	initLeftUpEventHandler() {
+		this.eventHandler.setInputAction(((e) => {
+			if (!this.isEditing) return;
+			this.viewer.enableCursorStyle = true;
+			document.body.style.cursor = "default";
+			this.viewer.scene.screenSpaceCameraController.enableRotate = true;
+			this.editVertext.show = true;
+			this.isEditing = false;
+			this.clearMidVertex();
+			this.createMidVertex();
+		}), Cesium.ScreenSpaceEventType.LEFT_UP);
+	}
+
+	//场景鼠标移动事件
+	initMouseMoveEventHandler() {
+		this.eventHandler.setInputAction(((e) => {
+			var position = e.endPosition;
+			var ray = this.viewer.scene.camera.getPickRay(position);
+			var cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+			if (!cartesian) return;
+
+			if (!this.isEditing) return;
+			if (this.editVertext.type == "EditMove") {
+				let startPosition = this.EditMoveCenterPositoin;
+				if (!startPosition) return;
+				this.moveEntityByOffset(startPosition, cartesian);
+			} else if (this.editVertext.type == "EditVertex" || this.editVertext.type == "EditMidVertex") {
+				this.editPositions[this.editVertext.vertexIndex] = cartesian;
+			}
+			this.isEdited = true;
+			this.EditMoveCenterPositoin = this.getCenterPosition();
+		}), Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+	}
+
+	//获取编辑对象中心点
+	getCenterPosition() {
+		let points = [];
+		let maxHeight = 0;
+		//如果是点 返回第一个点作为移动点
+		if (this.editEntity.Type == "DrawCircle" || this.editEntity.Type == "DrawPoint" || this.editEntity.Type == "DrawSector") {
+			return this.editPositions[0];
+		}
+
+		//获取所有节点的最高位置
+		this.editPositions.forEach(position => {
+			const point3d = this.cartesian3ToPoint3D(position);
+			points.push([point3d.x, point3d.y]);
+			if (maxHeight < point3d.z) maxHeight = point3d.z;
+		})
+
+		//构建turf.js  lineString
+		let geo = turf.lineString(points);
+		let bbox = turf.bbox(geo);
+		let bboxPolygon = turf.bboxPolygon(bbox);
+		let pointOnFeature = turf.center(bboxPolygon);
+		let lonLat = pointOnFeature.geometry.coordinates;
+		return Cesium.Cartesian3.fromDegrees(lonLat[0], lonLat[1], maxHeight);
+	}
+
+	//根据偏移量移动实体
+	moveEntityByOffset(startPosition, endPosition) {
+		let startPoint3d = this.cartesian3ToPoint3D(startPosition);
+		let endPoint3d = this.cartesian3ToPoint3D(endPosition);
+		let offsetX = endPoint3d.x - startPoint3d.x;
+		let offsetY = endPoint3d.y - startPoint3d.y;
+		//设置偏移量
+		let element;
+		for (let i = 0; i < this.editPositions.length; i++) {
+			element = this.cartesian3ToPoint3D(this.editPositions[i]);
+			element.x += offsetX;
+			element.y += offsetY;
+			this.editPositions[i] = Cesium.Cartesian3.fromDegrees(element.x, element.y, element.z)
+		}
+	}
+
+	//创建编辑节点
+	createEditVertex() {
+		this.vertexEntities = [];
+		this.editPositions.forEach((p, index) => {
+			const entity = this.viewer.entities.add({
+				position: new Cesium.CallbackProperty(e => {
+					return this.editPositions[index];
+				}, false),
+				type: "EditVertex",
+				vertexIndex: index, //节点索引 
+				point: {
+					show: true,
+					pixelSize: 10,
+					color: new Cesium.Color(0, 0, 1, 1),
+					outlineWidth: 1,
+					outlineColor: new Cesium.Color(1, 1, 1, 1),
+					disableDepthTestDistance: 1.5e12, //小于该数值后关闭深度检测默认为空
+					heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+				},
+			})
+			this.vertexEntities.push(entity);
+		});
+		// 如果是圆则隐藏中心点
+		if (this.editEntity.Type == 'DrawCircle') {
+			this.vertexEntities[0].show = false
+		}
+		if (this.editPositions.length == 1) { //只有一个节点表示点类型 不需要创建整体移动节点
+			return;
+		}
+		this.createEditMoveCenterEntity();
+	}
+
+	//整体移动
+	createEditMoveCenterEntity() {
+		this.EditMoveCenterEntity = this.viewer.entities.add({
+			position: new Cesium.CallbackProperty(e => {
+				return this.EditMoveCenterPositoin;
+			}, false),
+			type: "EditMove",
+			point: {
+				show: true,
+				pixelSize: 12,
+				color: new Cesium.Color(0, 1, 0, 0.1),
+				outlineWidth: 2,
+				outlineColor: new Cesium.Color(1, 1, 1, 1),
+				disableDepthTestDistance: 1.5e12, //小于该数值后关闭深度检测默认为空
+				heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+			},
+		})
+	}
+
+	//清空编辑节点
+	clearEditVertex() {
+		if (this.vertexEntities) {
+			this.vertexEntities.forEach(item => {
+				this.viewer.entities.remove(item);
+			})
+		}
+		this.vertexEntities = [];
+		this.viewer.entities.remove(this.EditMoveCenterEntity);
+	}
+
+	//创建中点节点
+	createMidVertex() {
+		if (this.editEntity.Type == 'DrawCircle' || this.editEntity.Type == 'DrawPincerArrow' || this.editEntity.Type == 'DrawRectangle' || this.editEntity.Type == 'DrawStraightArrow' || this.editEntity.Type == 'DrawGatheringPlace' || this.editEntity.Type == "DrawSector" || this.editEntity.Type == "DrawArc" || this.editEntity.Type == "DrawLune" || this.editEntity.Type == "DrawRectFlag" || this.editEntity.Type == "DrawTriangleFlag" || this.editEntity.Type == "DrawCurveFlag") {
+			return
+		}
+		this.midVertexEntities = [];
+		for (let i = 0; i < this.editPositions.length; i++) {
+			const p1 = this.editPositions[i];
+			const p2 = this.editPositions[i + 1];
+			let mideP = this.midPosition(p1, p2);
+			const entity = this.viewer.entities.add({
+				position: mideP,
+				type: "EditMidVertex",
+				vertexIndex: i + 1, //节点索引 
+				point: {
+					show: true,
+					pixelSize: 10,
+					color: new Cesium.Color(0, 1, 0, 1),
+					outlineWidth: 1,
+					outlineColor: new Cesium.Color(1, 1, 1, 1),
+					disableDepthTestDistance: 1.5e12, //小于该数值后关闭深度检测默认为空
+					heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+				},
+			})
+			this.midVertexEntities.push(entity);
+		}
+	}
+
+	//清空中点节点
+	clearMidVertex() {
+		if (this.midVertexEntities) {
+			this.midVertexEntities.forEach(item => {
+				this.viewer.entities.remove(item);
+			})
+		}
+		this.midVertexEntities = [];
+	}
+
+	//笛卡尔坐标转为经纬度xyz
+	cartesian3ToPoint3D(position) {
+		const cartographic = Cesium.Cartographic.fromCartesian(position);
+		const lon = Cesium.Math.toDegrees(cartographic.longitude);
+		const lat = Cesium.Math.toDegrees(cartographic.latitude);
+		return {
+			x: lon,
+			y: lat,
+			z: cartographic.height
+		};
+	}
+
+	//获取两个节点的中心点
+	midPosition(first, second) {
+		if (!first || !second) return null;
+		let point3d1 = this.cartesian3ToPoint3D(first);
+		let point3d2 = this.cartesian3ToPoint3D(second);
+		let midLonLat = {
+			x: (point3d1.x + point3d2.x) / 2,
+			y: (point3d1.y + point3d2.y) / 2,
+			z: (point3d1.z + point3d2.z) / 2
+		}
+		return Cesium.Cartesian3.fromDegrees(midLonLat.x, midLonLat.y, midLonLat.z);
+	}
+
+
+	cartesianToLatlng(cartesian) {
+		let cartographic = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+		let lat = new Cesium.Math.toDegrees(cartographic.latitude);
+		let lng = new Cesium.Math.toDegrees(cartographic.longitude);
+		let alt = cartographic.height;
+		return [lng, lat];
+	}
+
+	LatlngTocartesian(latlng) {
+		let cartesian3 = new Cesium.Cartesian3.fromDegrees(latlng[0], latlng[1]);
+		return cartesian3
+	}
+}

+ 534 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawArc.js

@@ -0,0 +1,534 @@
+
+/*
+九、绘制弓形
+ */
+class DrawArc {
+	constructor(arg) {
+		this.viewer = arg.viewer;
+		this.Cesium = arg.Cesium;
+		this.tt = 0.4;
+		this.floatingPoint = null; //标识点
+		this.drawHandler = null; //画事件
+		this.DrawArc = null; //弓形
+		this._DrawArcLast = null; //最后一个弓形
+		this._positions = []; //活动点
+		this._entities_point = []; //脏数据
+		this._entities_PincerArrow = []; //脏数据
+		this._DrawArcData = null; //用于构造弓形
+		this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+		this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+		
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+		
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+		
+	}
+
+	//返回弓形
+	get PincerArrow() {
+		return this._DrawArcLast;
+	}
+
+	//返回弓形数据用于加载弓形
+	getData() {
+		return this._DrawArcData;
+	}
+
+	// 修改编辑调用计算
+	computePosition(data) {
+		var $this = this;
+		if (data.length < 3) {
+			return;
+		}
+		var DrawArc = [];
+		let positions = [];
+		for (var i = 0; i < data.length; i++) {
+			positions.push($this.cartesianToLatlng(data[i]));
+			var cart3 = $this.lonLatToMercator($this.cartesianToLatlng(data[i]));
+			DrawArc.push(cart3);
+		}
+		let [pnt1, pnt2, pnt3, startAngle, endAngle] = [DrawArc[0], DrawArc[2], DrawArc[1], null, null];
+		let center = $this.getCircleCenterOfThreePoints(pnt1, pnt2, pnt3)
+		let radius = $this.MathDistance(pnt1, center)
+		let angle1 = $this.getAzimuth(pnt1, center)
+		let angle2 = $this.getAzimuth(pnt2, center)
+		if ($this.isClockWise(pnt1, pnt2, pnt3)) {
+			startAngle = angle2
+			endAngle = angle1
+		} else {
+			startAngle = angle1
+			endAngle = angle2
+		}
+		let getArcPoint = $this.getArcPoints(center, radius, startAngle, endAngle);
+		let pHierarchy = [];
+		for (var l = 0; l < getArcPoint.length; l++) {
+			var cart3 = $this.LatlngTocartesian($this.WebMercator2lonLat(getArcPoint[l]));
+			pHierarchy.push(cart3);
+		}
+		$this._DrawArcData = positions
+		return pHierarchy
+	}
+
+	//加载
+	addload(data) {
+		var $this = this;
+		if (data.length < 3) {
+			return;
+		}
+		var DrawArc = [];
+		for (var i = 0; i < data.length; i++) {
+			var cart3 = $this.lonLatToMercator(data[i]);
+			DrawArc.push(cart3);
+		}
+		let [pnt1, pnt2, pnt3, startAngle, endAngle] = [DrawArc[0], DrawArc[2], DrawArc[1], null, null];
+		let center = $this.getCircleCenterOfThreePoints(pnt1, pnt2, pnt3)
+		let radius = $this.MathDistance(pnt1, center)
+		let angle1 = $this.getAzimuth(pnt1, center)
+		let angle2 = $this.getAzimuth(pnt2, center)
+		if ($this.isClockWise(pnt1, pnt2, pnt3)) {
+			startAngle = angle2
+			endAngle = angle1
+		} else {
+			startAngle = angle1
+			endAngle = angle2
+		}
+		let getArcPoint = $this.getArcPoints(center, radius, startAngle, endAngle);
+		// console.log(getArcPoint)
+		let pHierarchy = [];
+		for (var l = 0; l < getArcPoint.length; l++) {
+			var cart3 = $this.LatlngTocartesian($this.WebMercator2lonLat(getArcPoint[l]));
+			pHierarchy.push(cart3);
+		}
+		var arrowEntity = $this.viewer.entities.add({
+			Type: 'DrawArc',
+			Position: data,
+			id: data.id || $this.objId,
+			polyline: {
+				positions: pHierarchy,
+				show: true,
+				material: $this.Cesium.Color.YELLOW,
+				width: 3,
+				clampToGround: true
+			}
+		})
+		return arrowEntity
+	}
+
+
+	// 开始创建
+	startCreate(drawType) {
+		this.drawType = drawType
+		var $this = this;
+		this.handler = new $this.Cesium.ScreenSpaceEventHandler($this.viewer.scene.canvas);
+		this.handler.setInputAction(function(event) {
+			//屏幕坐标转世界坐标
+			var position = event.position;
+			if (!$this.Cesium.defined(position)) {
+				return;
+			}
+			var ray = $this.viewer.camera.getPickRay(position);
+			if (!$this.Cesium.defined(ray)) {
+				return;
+			}
+			var cartesian = $this.viewer.scene.globe.pick(ray, $this.viewer.scene);
+			if (!$this.Cesium.defined(cartesian)) {
+				return;
+			}
+
+			if ($this._positions.length == 0) {
+				$this._positions.push(cartesian.clone());
+				$this.floatingPoint = $this.createPoint(cartesian);
+			}
+
+			if ($this._positions.length <= 2) {
+				$this.createPoint(cartesian); // 绘制点
+				$this._positions.push(cartesian);
+			}
+		}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+
+
+		this.handler.setInputAction(function(event) { //移动时绘制面
+			//console.log("_positions",_positions);
+			if ($this._positions.length < 2) {
+				return;
+			}
+
+			//屏幕坐标转世界坐标
+			var position = event.endPosition;
+			if (!$this.Cesium.defined(position)) {
+				return;
+			}
+			var ray = $this.viewer.camera.getPickRay(position);
+			if (!$this.Cesium.defined(ray)) {
+				return;
+			}
+			var cartesian = $this.viewer.scene.globe.pick(ray, $this.viewer.scene);
+			if (!$this.Cesium.defined(cartesian)) {
+				return;
+			}
+			//console.log("点击地图移动采集的点:",cartesian);
+			if (!$this.Cesium.defined($this.DrawArc)) {
+				$this.DrawArc = $this.createDrawArc();
+			}
+			$this.floatingPoint.position.setValue(cartesian);
+			if ($this.DrawArc) {
+				//替换最后一个点
+				// _positions.pop();
+				// _positions.push(cartesian);
+				//替换中间点
+				if ($this._positions.length == 3) {
+					$this._positions[1] = cartesian;
+				} else {
+					$this._positions.pop();
+					$this._positions.push(cartesian);
+				}
+
+			}
+		}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+
+
+		//右击停止采集
+		this.handler.setInputAction(function(movement) {
+
+			if ($this._positions.length >= 3) {
+				$this._DrawArcData = $this._positions.concat();
+				$this.viewer.entities.remove($this.DrawArc); //移除
+				$this.DrawArc = null;
+				var lnglatArr = [];
+				for (var i = 0; i < $this._DrawArcData.length; i++) {
+					var lnglat = $this.cartesianToLatlng($this._DrawArcData[i]);
+					lnglatArr.push(lnglat)
+				}
+				$this._DrawArcData = lnglatArr;
+				var pincerArrow = $this.addload(lnglatArr); //加载
+				$this._entities_PincerArrow.push(pincerArrow);
+				$this._DrawArcLast = pincerArrow;
+				$this.viewer.entities.remove($this.floatingPoint);
+				$this.floatingPoint = null;
+
+				//删除关键点
+				$this.clearPoint();
+				$this.destroy()
+			}
+		}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+
+	}
+
+	//创建弓形
+	createDrawArc() {
+		let $this = this
+		var DrawArcEntity = $this.viewer.entities.add({
+			polyline: {
+				positions: new $this.Cesium.CallbackProperty(function() {
+					if ($this._positions.length < 3) {
+						return;
+					}
+					var DrawArc = [];
+					for (var i = 0; i < $this._positions.length; i++) {
+						var cart3 = $this.lonLatToMercator($this.cartesianToLatlng($this._positions[i]));
+						DrawArc.push(cart3);
+					}
+					let [pnt1, pnt2, pnt3, startAngle, endAngle] = [DrawArc[0], DrawArc[2], DrawArc[1], null, null];
+					let center = $this.getCircleCenterOfThreePoints(pnt1, pnt2, pnt3)
+					let radius = $this.MathDistance(pnt1, center)
+					let angle1 = $this.getAzimuth(pnt1, center)
+					let angle2 = $this.getAzimuth(pnt2, center)
+					if ($this.isClockWise(pnt1, pnt2, pnt3)) {
+						startAngle = angle2
+						endAngle = angle1
+					} else {
+						startAngle = angle1
+						endAngle = angle2
+					}
+					let getArcPoint = $this.getArcPoints(center, radius, startAngle, endAngle);
+					// console.log(getArcPoint)
+					let pHierarchy = [];
+					for (var l = 0; l < getArcPoint.length; l++) {
+						var cart3 = $this.LatlngTocartesian($this.WebMercator2lonLat(getArcPoint[l]));
+						pHierarchy.push(cart3);
+					}
+					return pHierarchy
+				}, false),
+				show: true,
+				material: $this.Cesium.Color.YELLOW,
+				width: 3,
+				clampToGround: true
+			}
+		})
+		//$this._entities_DrawArc.push(DrawArcEntity);
+		// DrawArcEntity.valueFlag = "value";
+		$this._entities_PincerArrow.push(DrawArcEntity);
+		return DrawArcEntity
+	}
+
+	//创建点
+	createPoint(cartesian) {
+		var $this = this;
+		var point = this.viewer.entities.add({
+			position: cartesian,
+			point: {
+				pixelSize: 10,
+				color: $this.Cesium.Color.RED,
+				heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+			}
+		});
+		$this._entities_point.push(point);
+		return point;
+	}
+
+	cartesianToLatlng(cartesian) {
+		let cartographic = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+		let lat = this.Cesium.Math.toDegrees(cartographic.latitude);
+		let lng = this.Cesium.Math.toDegrees(cartographic.longitude);
+		let alt = cartographic.height;
+		return [lng, lat];
+	}
+
+	//销毁
+	destroy() {
+		if (this.handler) {
+			this.handler.destroy();
+			this.handler = null;
+		}
+	}
+
+	clearPoint() {
+		this.DrawEndEvent.raiseEvent(this._DrawArcLast, this._DrawArcData, this.drawType);
+		for (var i = 0; i < this._entities_point.length; i++) {
+			this.viewer.entities.remove(this._entities_point[i]);
+		}
+		this._entities_point = []; //脏数据
+	}
+
+	//清空实体对象
+	clear() {
+		for (var i = 0; i < this._entities_point.length; i++) {
+			this.viewer.entities.remove(this._entities_point[i]);
+		}
+		for (var i = 0; i < this._entities_PincerArrow.length; i++) {
+			this.viewer.entities.remove(this._entities_PincerArrow[i]);
+		}
+
+		this.floatingPoint = null; //标识点
+		this._PincerArrow = null; //活动弓形
+		this._PincerArrowLast = null; //最后一个弓形
+		this._positions = []; //活动点
+		this._entities_point = []; //脏数据
+		this._entities_PincerArrow = []; //脏数据
+		this._PincerArrowData = null; //用于构造弓形数据
+	}
+
+	getCatesian3FromPX(px) {
+		var cartesian;
+		var ray = this.viewer.camera.getPickRay(px);
+		if (!ray) return null;
+		cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+		return cartesian;
+	}
+
+	_computeTempPositions() {
+		var _this = this;
+
+		var pnts = [].concat(_this._positions);
+		var num = pnts.length;
+		var first = pnts[0];
+		var last = pnts[num - 1];
+		if (_this._isSimpleXYZ(first, last) == false) {
+			pnts.push(first);
+			num += 1;
+		}
+		_this.tempPositions = [];
+		for (var i = 1; i < num; i++) {
+			var p1 = pnts[i - 1];
+			var p2 = pnts[i];
+			var cp = _this._computeCenterPotition(p1, p2);
+			_this.tempPositions.push(p1);
+			_this.tempPositions.push(cp);
+		}
+	}
+
+	_isSimpleXYZ(p1, p2) {
+		if (p1.x == p2.x && p1.y == p2.y && p1.z == p2.z) {
+			return true;
+		}
+		return false;
+	}
+
+	_computeCenterPotition(p1, p2) {
+		var _this = this;
+		var c1 = _this.viewer.scene.globe.ellipsoid.cartesianToCartographic(p1);
+		var c2 = _this.viewer.scene.globe.ellipsoid.cartesianToCartographic(p2);
+		var cm = new _this.Cesium.EllipsoidGeodesic(c1, c2).interpolateUsingFraction(0.5);
+		var cp = _this.viewer.scene.globe.ellipsoid.cartographicToCartesian(cm);
+		return cp;
+	}
+	/**
+	 * 笛卡尔坐标转经纬度坐标
+	 */
+	getLonLat(cartesian) {
+		var cartographic = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+		cartographic.height = this.viewer.scene.globe.getHeight(cartographic);
+		var pos = {
+			lon: cartographic.longitude,
+			lat: cartographic.latitude,
+			alt: cartographic.height
+		};
+		pos.lon = this.Cesium.Math.toDegrees(pos.lon);
+		pos.lat = this.Cesium.Math.toDegrees(pos.lat);
+		return pos;
+	}
+
+	LatlngTocartesian(latlng) {
+		let cartesian3 = this.Cesium.Cartesian3.fromDegrees(latlng[0], latlng[1]);
+		return cartesian3
+	}
+
+	/**
+	 * 经纬度坐标转墨卡托坐标
+	 */
+	// 墨卡托坐标系:展开地球,赤道作为x轴,向东为x轴正方,本初子午线作为y轴,向北为y轴正方向。
+	// 数字20037508.34是地球赤道周长的一半:地球半径6378137米,赤道周长2*PI*r = 2 * 20037508.3427892,墨卡托坐标x轴区间[-20037508.3427892,20037508.3427892]
+	lonLatToMercator(Latlng) {
+		var E = Latlng[0];
+		var N = Latlng[1];
+		var x = E * 20037508.34 / 180;
+		var y = Math.log(Math.tan((90 + N) * Math.PI / 360)) / (Math.PI / 180);
+		y = y * 20037508.34 / 180;
+		return [x, y]
+	}
+	/**
+	 * 墨卡托坐标转经纬度坐标转
+	 */
+	WebMercator2lonLat(mercator) {
+		let x = mercator[0] / 20037508.34 * 180;
+		let ly = mercator[1] / 20037508.34 * 180;
+		let y = 180 / Math.PI * (2 * Math.atan(Math.exp(ly * Math.PI / 180)) - Math.PI / 2)
+		return [x, y];
+	}
+
+	////////////////////////////////////////弓形/////////////////////////////////////////////////////
+	/**
+	 * 通过三个点确定一个圆的中心点
+	 * @param point1
+	 * @param point2
+	 * @param point3
+	 */
+	getCircleCenterOfThreePoints(point1, point2, point3) {
+		let pntA = [(point1[0] + point2[0]) / 2, (point1[1] + point2[1]) / 2]
+		let pntB = [pntA[0] - point1[1] + point2[1], pntA[1] + point1[0] - point2[0]]
+		let pntC = [(point1[0] + point3[0]) / 2, (point1[1] + point3[1]) / 2]
+		let pntD = [pntC[0] - point1[1] + point3[1], pntC[1] + point1[0] - point3[0]]
+		return this.getIntersectPoint(pntA, pntB, pntC, pntD)
+	}
+
+	/**
+	 * 获取交集的点
+	 * @param pntA
+	 * @param pntB
+	 * @param pntC
+	 * @param pntD
+	 * @returns {[*,*]}
+	 */
+	getIntersectPoint(pntA, pntB, pntC, pntD) {
+		if (pntA[1] === pntB[1]) {
+			let f = (pntD[0] - pntC[0]) / (pntD[1] - pntC[1])
+			let x = f * (pntA[1] - pntC[1]) + pntC[0]
+			let y = pntA[1]
+			return [x, y]
+		}
+		if (pntC[1] === pntD[1]) {
+			let e = (pntB[0] - pntA[0]) / (pntB[1] - pntA[1])
+			let x = e * (pntC[1] - pntA[1]) + pntA[0]
+			let y = pntC[1]
+			return [x, y]
+		}
+		let e = (pntB[0] - pntA[0]) / (pntB[1] - pntA[1])
+		let f = (pntD[0] - pntC[0]) / (pntD[1] - pntC[1])
+		let y = (e * pntA[1] - pntA[0] - f * pntC[1] + pntC[0]) / (e - f)
+		let x = e * y - e * pntA[1] + pntA[0]
+		return [x, y]
+	}
+
+
+	/**
+	 * 计算两个坐标之间的距离
+	 * @ignore
+	 * @param pnt1
+	 * @param pnt2
+	 * @returns {number}
+	 * @constructor
+	 */
+	MathDistance(pnt1, pnt2) {
+		return (Math.sqrt(Math.pow((pnt1[0] - pnt2[0]), 2) + Math.pow((pnt1[1] - pnt2[1]), 2)))
+	}
+
+
+	/**
+	 * 获取方位角(地平经度)
+	 * @param startPoint
+	 * @param endPoint
+	 * @returns {*}
+	 */
+	getAzimuth(startPoint, endPoint) {
+		let azimuth
+		let angle = Math.asin(Math.abs(endPoint[1] - startPoint[1]) / (this.MathDistance(startPoint, endPoint)))
+		if (endPoint[1] >= startPoint[1] && endPoint[0] >= startPoint[0]) {
+			azimuth = angle + Math.PI
+		} else if (endPoint[1] >= startPoint[1] && endPoint[0] < startPoint[0]) {
+			azimuth = Math.PI * 2 - angle
+		} else if (endPoint[1] < startPoint[1] && endPoint[0] < startPoint[0]) {
+			azimuth = angle
+		} else if (endPoint[1] < startPoint[1] && endPoint[0] >= startPoint[0]) {
+			azimuth = Math.PI - angle
+		}
+		return azimuth
+	}
+
+	/**
+	 * 判断是否是顺时针
+	 * @param pnt1
+	 * @param pnt2
+	 * @param pnt3
+	 * @returns {boolean}
+	 */
+	isClockWise(pnt1, pnt2, pnt3) {
+		return ((pnt3[1] - pnt1[1]) * (pnt2[0] - pnt1[0]) > (pnt2[1] - pnt1[1]) * (pnt3[0] - pnt1[0]))
+	}
+
+
+	/**
+	 * 插值弓形线段点
+	 * @param center
+	 * @param radius
+	 * @param startAngle
+	 * @param endAngle
+	 * @returns {null}
+	 */
+	getArcPoints(center, radius, startAngle, endAngle) {
+		let [x, y, pnts, angleDiff] = [null, null, [], (endAngle - startAngle)]
+		angleDiff = ((angleDiff < 0) ? (angleDiff + (Math.PI * 2)) : angleDiff)
+		for (let i = 0; i <= 100; i++) {
+			let angle = startAngle + angleDiff * i / 100
+			x = center[0] + radius * Math.cos(angle)
+			y = center[1] + radius * Math.sin(angle)
+			pnts.push([x, y])
+		}
+		return pnts
+	}
+
+}
+
+export default DrawArc

+ 574 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawAttackArrow.js

@@ -0,0 +1,574 @@
+import {
+	createTooltip
+} from "../../../common/common.js";
+
+import {
+	isRuntimeApp,
+	isRuntimeWeb,
+	createOperationMainDom,
+	showTooltipMessage
+} from "../../../common/RuntimeEnvironment.js";
+
+/*
+七、绘制攻击箭头
+ */
+class DrawAttackArrow {
+	constructor(arg) {
+		//设置唯一id 备用
+		this.objId = Number((new Date()).getTime() + "" + Number(Math.random() * 1000).toFixed(0));
+		this.viewer = arg.viewer;
+		this.Cesium = arg.Cesium;
+		// this.callback=arg.callback;
+		this.floatingPoint = null; //标识点
+		this._AttackArrow = null; //活动箭头
+		this._AttackArrowLast = null; //最后一个箭头
+		this._positions = []; //活动点
+		this._entities_point = []; //脏数据
+		this._entities_AttackArrow = []; //脏数据
+		this._AttackArrowData = null; //用于构造箭头数据
+		this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+		this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+
+		this._tooltip = createTooltip(this.viewer.container);
+
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+	}
+
+	//返回箭头
+	get AttackArrow() {
+		return this._AttackArrowLast;
+	}
+
+	//返回箭头数据用于加载箭头
+	getData() {
+		return this._AttackArrowData;
+	}
+
+	//加载箭头
+	addload(data) {
+		var $this = this;
+		if (data.length < 3) {
+			return null;
+		}
+		var res = $this.fineArrow(data);
+		var returnData = res.polygonalPoint;
+		var arrowEntity = $this.viewer.entities.add({
+			Type: 'DrawAttackArrow',
+			Position: data,
+			id: data.id || $this.objId,
+			polygon: {
+				hierarchy: new $this.Cesium.PolygonHierarchy(returnData),
+				show: true,
+				fill: true,
+				clampToGround: true,
+				material: $this.polygonMaterial
+			}
+		});
+		return arrowEntity
+	}
+
+	// 修改编辑调用计算
+	computePosition(data) {
+		//计算面
+		let $this = this
+		var lnglatArr = [];
+		for (var i = 0; i < data.length; i++) {
+			var lnglat = $this.cartesianToLatlng(data[i]);
+			lnglatArr.push(lnglat)
+		}
+		$this._AttackArrowData = lnglatArr;
+		var res = $this.fineArrow(lnglatArr);
+		var returnData = res.polygonalPoint;
+		return new $this.Cesium.PolygonHierarchy(returnData)
+	}
+
+	//开始创建
+	startCreate(drawType) {
+		if (isRuntimeApp()) {
+			showTooltipMessage("点击开始绘制");
+		}
+
+		var $this = this;
+
+		this.drawType = drawType;
+		this.handler = new $this.Cesium.ScreenSpaceEventHandler($this.viewer.scene.canvas);
+
+		//单击开始绘制
+		this.handler.setInputAction(function(evt) {
+
+			if (isRuntimeApp()) {
+
+				//屏幕坐标转地形上坐标
+				var cartesian = $this.getCatesian3FromPX(evt.position);
+				if (!cartesian) {
+					return;
+				}
+
+				$this.createPoint(cartesian); // 绘制点
+				$this._positions.push(cartesian);
+
+				if ($this._positions.length > 2) {
+					showTooltipMessage("点击添加点,点击完成按钮,结束绘制");
+				} else {
+					showTooltipMessage("点击添加点");
+					if ($this._positions.length === 2) {
+						if (!$this.Cesium.defined($this._AttackArrow)) {
+							$this._AttackArrow = $this.createAttackArrow();
+
+							//创建按钮
+							createOperationMainDom();
+							//完成绘制
+							document.getElementById("btnDrawComplete").onclick = () => {
+
+								$this._AttackArrowData = $this._positions.concat();
+								$this.viewer.entities.remove($this._AttackArrow); //移除
+								$this._AttackArrow = null;
+								$this._positions = [];
+
+								let lnglatArr = [];
+								for (var i = 0; i < $this._AttackArrowData.length; i++) {
+									var lnglat = $this.cartesianToLatlng($this._AttackArrowData[i]);
+									lnglatArr.push(lnglat)
+								}
+								$this._AttackArrowData = lnglatArr;
+								var straightArrow = $this.addload(lnglatArr); //加载
+								$this._entities_AttackArrow.push(straightArrow);
+								$this._AttackArrowLast = straightArrow;
+								$this.clearPoint();
+								$this.destroy();
+
+								let buttonDiv = document.getElementById("drawButtonDiv");
+								if (buttonDiv) {
+									//从页面移除
+									document.body.removeChild(buttonDiv);
+								}
+							}
+						}
+					}
+				}
+			} else {
+
+				console.log('监听鼠标事件', '单击')
+
+				/* 锁定点击事件 以免和双击事件冲突 */
+				clearTimeout($this._timer);
+				$this._timer = setTimeout(function() {
+					//屏幕坐标转地形上坐标
+					var cartesian = $this.getCatesian3FromPX(evt.position);
+					if (!cartesian) {
+						return;
+					}
+					if ($this._positions.length == 0) {
+						// $this._positions.push(cartesian.clone());
+						$this.floatingPoint = $this.createPoint(cartesian);
+						$this.createPoint(cartesian); // 绘制点
+					}
+					if ($this._positions.length == 1) {
+						$this._positions.push(cartesian.clone());
+						$this.createPoint(cartesian); // 绘制点
+					}
+					$this._positions.push(cartesian);
+
+				}, 200);
+			}
+
+		}, $this.Cesium.ScreenSpaceEventType.LEFT_CLICK);
+		//移动时绘制面
+		this.handler.setInputAction(function(evt) {
+
+			/* 如果运行环境是App 则禁止使用鼠标移动事件 */
+			if (isRuntimeApp()) return;
+
+			// console.log('监听鼠标事件', '移动')
+
+			if ($this._positions.length == 0) {
+				$this._tooltip.showAt(evt.endPosition, "点击开始绘制");
+			} else {
+				$this._tooltip.showAt(evt.endPosition, "点击添加点");
+			}
+
+			if ($this._positions.length < 3) return;
+
+			// $this._tooltip.showAt(evt.endPosition, "点击添加点,右键删除点,双击结束绘制");
+			$this._tooltip.showAt(evt.endPosition, "点击添加点,双击结束绘制");
+
+			if (!$this.Cesium.defined($this._AttackArrow)) {
+				$this._AttackArrow = $this.createAttackArrow();
+			}
+
+			var cartesian = $this.getCatesian3FromPX(evt.endPosition);
+			if (!cartesian) {
+				return;
+			}
+
+			$this.floatingPoint.position.setValue(cartesian);
+			if ($this._AttackArrow) {
+				$this._positions.pop();
+				$this._positions.push(cartesian);
+			}
+		}, $this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+		//右键结束改为双击结束
+		this.handler.setInputAction(function(evt) {
+			// var cartesian = $this.getCatesian3FromPX(evt.position);
+			// $this._positions.pop();
+			// // $this._positions.push(cartesian);
+			// $this._AttackArrowData = $this._positions.concat();
+			// $this.viewer.entities.remove($this._AttackArrow); //移除
+			// $this._AttackArrow = null;
+			// $this._positions = [];
+			// $this.floatingPoint.position.setValue(cartesian);
+			// let lnglatArr = [];
+			// for (var i = 0; i < $this._AttackArrowData.length; i++) {
+			// 	var lnglat = $this.cartesianToLatlng($this._AttackArrowData[i]);
+			// 	lnglatArr.push(lnglat)
+			// }
+			// $this._AttackArrowData = lnglatArr;
+			// var straightArrow = $this.addload(lnglatArr); //加载
+			// $this._entities_AttackArrow.push(straightArrow);
+			// $this._AttackArrowLast = straightArrow;
+			// $this.clearPoint();
+			// $this.destroy()
+		}, $this.Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+		//双击结束
+		this.handler.setInputAction(function(evt) {
+
+			/* 如果运行环境是App 则禁止使用鼠标双击事件 */
+			if (isRuntimeApp()) return;
+
+			console.log('监听鼠标事件', '双击')
+
+			/* 解除锁定 */
+			clearTimeout($this._timer);
+
+			var cartesian = $this.getCatesian3FromPX(evt.position);
+			$this._positions.pop();
+			$this._positions.push(cartesian);
+			$this._AttackArrowData = $this._positions.concat();
+			$this.viewer.entities.remove($this._AttackArrow); //移除
+			$this._AttackArrow = null;
+			$this._positions = [];
+			$this.floatingPoint.position.setValue(cartesian);
+			let lnglatArr = [];
+			for (var i = 0; i < $this._AttackArrowData.length; i++) {
+				var lnglat = $this.cartesianToLatlng($this._AttackArrowData[i]);
+				lnglatArr.push(lnglat)
+			}
+			$this._AttackArrowData = lnglatArr;
+			var straightArrow = $this.addload(lnglatArr); //加载
+			$this._entities_AttackArrow.push(straightArrow);
+			$this._AttackArrowLast = straightArrow;
+			$this.clearPoint();
+			$this.destroy();
+
+			$this._tooltip.setVisible(false);
+
+		}, $this.Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
+	}
+
+	//创建攻击箭头
+	createAttackArrow() {
+		var $this = this;
+		var arrowEntity = $this.viewer.entities.add({
+			polygon: {
+				hierarchy: new $this.Cesium.CallbackProperty(
+					function() {
+						//计算面
+						var lnglatArr = [];
+						for (var i = 0; i < $this._positions.length; i++) {
+							var lnglat = $this.cartesianToLatlng($this._positions[i]);
+							lnglatArr.push(lnglat)
+						}
+						var res = $this.fineArrow(lnglatArr);
+						var returnData = res.polygonalPoint;
+						return new $this.Cesium.PolygonHierarchy(returnData);
+					}, false),
+				show: true,
+				fill: true,
+				clampToGround: true,
+				material: $this.polygonMaterial
+			}
+		})
+		$this._entities_AttackArrow.push(arrowEntity);
+		return arrowEntity
+	}
+
+	//创建点
+	createPoint(cartesian) {
+		var $this = this;
+		var point = this.viewer.entities.add({
+			position: cartesian,
+			point: {
+				pixelSize: 10,
+				color: $this.Cesium.Color.RED,
+				heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+			}
+		});
+		point.objId = this.objId;
+		$this._entities_point.push(point);
+		return point;
+	}
+
+	cartesianToLatlng(cartesian) {
+		let cartographic = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+		let lat = this.Cesium.Math.toDegrees(cartographic.latitude);
+		let lng = this.Cesium.Math.toDegrees(cartographic.longitude);
+		let alt = cartographic.height;
+		return [lng, lat, alt];
+	}
+
+	//销毁
+	destroy() {
+		if (this.handler) {
+			this.handler.destroy();
+			this.handler = null;
+		}
+	}
+
+	clearPoint() {
+		this.DrawEndEvent.raiseEvent(this._AttackArrowLast, this._AttackArrowData, this.drawType);
+		for (var i = 0; i < this._entities_point.length; i++) {
+			this.viewer.entities.remove(this._entities_point[i]);
+		}
+		this._entities_point = []; //脏数据
+	}
+
+	//清空实体对象
+	clear() {
+		for (var i = 0; i < this._entities_point.length; i++) {
+			this.viewer.entities.remove(this._entities_point[i]);
+		}
+		for (var i = 0; i < this._entities_AttackArrow.length; i++) {
+			this.viewer.entities.remove(this._entities_AttackArrow[i]);
+		}
+
+		this.floatingPoint = null; //标识点
+		this._AttackArrow = null; //活动箭头
+		this._AttackArrowLast = null; //最后一个箭头
+		this._positions = []; //活动点
+		this._entities_point = []; //脏数据
+		this._entities_AttackArrow = []; //脏数据
+		this._AttackArrowData = null; //用于构造箭头数据
+	}
+
+	getCatesian3FromPX(px) {
+		var cartesian;
+		var ray = this.viewer.camera.getPickRay(px);
+		if (!ray) return null;
+		cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+		return cartesian;
+	}
+
+	////////////////////////////////////////求取箭头坐标函数/////////////////////////////////////////////////////
+	//箭头配置函数
+	fineArrowDefualParam() {
+		return {
+			headHeightFactor: .18,
+			headWidthFactor: .3,
+			neckHeightFactor: .85,
+			neckWidthFactor: .15,
+			tailWidthFactor: .1,
+			headTailFactor: .8,
+			swallowTailFactor: 1
+		}
+	}
+
+	fineArrow(inputPoint) {
+		var $this = this;
+		inputPoint = $this.dereplication(inputPoint);
+		let tailWidthFactor = $this.fineArrowDefualParam().tailWidthFactor;
+		let swallowTailFactor = $this.fineArrowDefualParam().swallowTailFactor;
+		let swallowTailPnt = $this.fineArrowDefualParam().swallowTailPnt;
+		//控制点
+		var result = {
+			controlPoint: null,
+			polygonalPoint: null
+		};
+		result.controlPoint = inputPoint;
+		var t = inputPoint.length;
+		if (!(2 > t)) {
+			if (2 == inputPoint.length) {
+				result.polygonalPoint = inputPoint;
+				return result;
+			}
+			var o = inputPoint,
+				e = o[0],
+				r = o[1];
+			$this.isClockWise(o[0], o[1], o[2]) && (e = o[1], r = o[0]);
+			var n = $this.mid(e, r),
+				g = [n].concat(o.slice(2)),
+				i = $this.getAttackArrowHeadPoints(g, e, r, $this.fineArrowDefualParam()),
+				s = i[0],
+				a = i[4],
+				l = $this.distance(e, r),
+				u = $this.getBaseLength(g),
+				c = u * tailWidthFactor * swallowTailFactor;
+			swallowTailPnt = $this.getThirdPoint(g[1], g[0], 0, c, !0);
+			var p = l / u,
+				h = $this.getAttackArrowBodyPoints(g, s, a, p),
+				t = h.length,
+				d = [e].concat(h.slice(0, t / 2));
+			d.push(s);
+			var f = [r].concat(h.slice(t / 2, t));
+			var newArray = [];
+			f.push(a),
+				d = $this.getQBSplinePoints(d),
+				f = $this.getQBSplinePoints(f),
+				newArray = $this.array2Dto1D(d.concat(i, f.reverse(), [swallowTailPnt, d[0]]));
+			result.polygonalPoint = $this.Cesium.Cartesian3.fromDegreesArray(newArray);
+		}
+		return result;
+	}
+
+	getArrowBodyPoints(t, o, e, r) {
+		var $this = this;
+		for (var n = $this.wholeDistance(t), g = $this.getBaseLength(t), i = g * r, s = $this.distance(o, e), a = (i - s) / 2, l = 0, u = [], c = [], p = 1; p < t.length - 1; p++) {
+			var h = $this.getAngleOfThreePoints(t[p - 1], t[p], t[p + 1]) / 2;
+			l += $this.distance(t[p - 1], t[p]);
+			var d = (i / 2 - l / n * a) / Math.sin(h),
+				f = $this.getThirdPoint(t[p - 1], t[p], Math.PI - h, d, !0),
+				E = $this.getThirdPoint(t[p - 1], t[p], h, d, !1);
+			u.push(f),
+				c.push(E)
+		}
+		return u.concat(c)
+	}
+
+	getAttackArrowHeadPoints(t, o, e, defaultParam) {
+		var $this = this;
+		let headHeightFactor = defaultParam.headHeightFactor;
+		let headTailFactor = defaultParam.headTailFactor;
+		let headWidthFactor = defaultParam.headWidthFactor;
+		let neckWidthFactor = defaultParam.neckWidthFactor;
+		let neckHeightFactor = defaultParam.neckHeightFactor;
+		var r = $this.getBaseLength(t),
+			n = r * headHeightFactor,
+			g = t[t.length - 1];
+		r = $this.distance(g, t[t.length - 2]);
+		var i = $this.distance(o, e);
+		n > i * headTailFactor && (n = i * headTailFactor);
+		var s = n * headWidthFactor,
+			a = n * neckWidthFactor;
+		n = n > r ? r : n;
+		var l = n * neckHeightFactor,
+			u = $this.getThirdPoint(t[t.length - 2], g, 0, n, !0),
+			c = $this.getThirdPoint(t[t.length - 2], g, 0, l, !0),
+			p = $this.getThirdPoint(g, u, Math.PI / 2, s, !1),
+			h = $this.getThirdPoint(g, u, Math.PI / 2, s, !0),
+			d = $this.getThirdPoint(g, c, Math.PI / 2, a, !1),
+			f = $this.getThirdPoint(g, c, Math.PI / 2, a, !0);
+		return [d, p, g, h, f]
+	}
+
+	getAttackArrowBodyPoints = function(t, o, e, r) {
+		var $this = this;
+		for (var n = $this.wholeDistance(t), g = $this.getBaseLength(t), i = g * r, s = $this.distance(o, e), a = (i - s) / 2, l = 0, u = [], c = [], p = 1; p < t.length - 1; p++) {
+			var h = $this.getAngleOfThreePoints(t[p - 1], t[p], t[p + 1]) / 2;
+			l += $this.distance(t[p - 1], t[p]);
+			var d = (i / 2 - l / n * a) / Math.sin(h),
+				f = $this.getThirdPoint(t[p - 1], t[p], Math.PI - h, d, !0),
+				E = $this.getThirdPoint(t[p - 1], t[p], h, d, !1);
+			u.push(f),
+				c.push(E)
+		}
+		return u.concat(c)
+	}
+
+	getAngleOfThreePoints(t, o, e) {
+		var r = this.getAzimuth(o, t) - this.getAzimuth(o, e);
+		return 0 > r ? r + Math.PI * 2 : r
+	}
+
+	dereplication(array) {
+		var last = array[array.length - 1];
+		var change = false;
+		var newArray = [];
+		newArray = array.filter(function(i) {
+			if (i[0] != last[0] && i[1] != last[1]) {
+				return i;
+			}
+			change = true;
+		});
+		if (change) newArray.push(last);
+		return newArray;
+	}
+
+	getBaseLength(t) {
+		return Math.pow(this.wholeDistance(t), .99)
+	}
+
+	wholeDistance(t) {
+		for (var o = 0, e = 0; e < t.length - 1; e++) o += this.distance(t[e], t[e + 1]);
+		return o
+	}
+
+	distance(t, o) {
+		return Math.sqrt(Math.pow(t[0] - o[0], 2) + Math.pow(t[1] - o[1], 2))
+	}
+
+	getThirdPoint(t, o, e, r, n) {
+		var g = this.getAzimuth(t, o),
+			i = n ? g + e : g - e,
+			s = r * Math.cos(i),
+			a = r * Math.sin(i);
+		return [o[0] + s, o[1] + a]
+	}
+
+	getAzimuth(t, o) {
+		var e, r = Math.asin(Math.abs(o[1] - t[1]) / this.distance(t, o));
+		return o[1] >= t[1] && o[0] >= t[0] ? e = r + Math.PI : o[1] >= t[1] && o[0] < t[0] ? e = 2 * Math.PI - r : o[1] < t[1] && o[0] < t[0] ? e = r : o[1] < t[1] && o[0] >= t[0] && (e = Math.PI - r), e
+	}
+
+	isClockWise(t, o, e) {
+		return (e[1] - t[1]) * (o[0] - t[0]) > (o[1] - t[1]) * (e[0] - t[0])
+	}
+
+	mid(t, o) {
+		return [(t[0] + o[0]) / 2, (t[1] + o[1]) / 2]
+	}
+
+	getQBSplinePoints = function(t) {
+		if (t.length <= 2) return t;
+		var o = 2,
+			e = [],
+			r = t.length - o - 1,
+			y = 0;
+		e.push(t[0]);
+		for (var n = 0; r >= n; n++)
+			for (var g = 0; 1 >= g; g += .05) {
+				for (var i = y = 0, s = 0; o >= s; s++) {
+					var a = this.getQuadricBSplineFactor(s, g);
+					i += a * t[n + s][0], y += a * t[n + s][1]
+				}
+				e.push([i, y])
+			}
+		return e.push(t[t.length - 1]), e
+	}
+	getQuadricBSplineFactor = function(t, o) {
+		return 0 == t ? Math.pow(o - 1, 2) / 2 : 1 == t ? (-2 * Math.pow(o, 2) + 2 * o + 1) / 2 : 2 == t ? Math.pow(o, 2) / 2 : 0
+	}
+	array2Dto1D = function(array) {
+		var newArray = [];
+		array.forEach(function(elt) {
+			newArray.push(elt[0]);
+			newArray.push(elt[1]);
+		});
+		return newArray;
+	}
+}
+
+export default DrawAttackArrow

+ 251 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawCircle.js

@@ -0,0 +1,251 @@
+// 四、圆
+/*
+绘制圆
+ */
+class DrawCircle {
+    constructor(arg) {
+        this.viewer = arg.viewer;
+        this.Cesium = arg.Cesium;
+        this._cicle = null; //活动圆
+        this.floatingPoint = null;
+        this._cicleLast = null; //最后一个圆
+        this._positions = [];  //活动点
+        this._entities_point = [];  //脏数据
+        this._entities_cicle = [];  //脏数据
+        this._cicleData = null; //用于构造圆形数据
+        this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+        this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+		
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+		
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+    }
+ 
+    get cicle() {
+        return this._cicleLast;
+    }
+ 
+    //加载圆
+    addload(data) {
+        var that = this;
+        let lnglatArr = [];
+            for (var i = 0; i < data.length; i++) {
+                var lnglat = that.LatlngTocartesian(data[i]);
+                lnglatArr.push(lnglat)
+        }
+        var value = lnglatArr;
+        var r = Math.sqrt(
+            Math.pow(value[0].x - value[value.length - 1].x, 2) +
+            Math.pow(value[0].y - value[value.length - 1].y, 2)
+        );
+        var position = value[0];
+        var shape = that.viewer.entities.add({
+            Type:'DrawCircle',
+            Position:[data[0],data[data.length - 1]],
+            position: position,
+            id:data.id || that.objId,
+            ellipse: {
+                semiMinorAxis: r,
+                semiMajorAxis: r,
+                material: that.Cesium.Color.RED.withAlpha(0.9),
+                // outline: true,
+                show: true,
+                clampToGround: true,
+            }
+        });
+        return shape;
+    }
+ 
+    //返回数据
+    getData() {
+        return this._cicleData;
+    }
+
+    // 修改编辑调用计算
+    computePosition(data){
+        var that = this;
+        let lnglatArr = [];
+            for (var i = 0; i < data.length; i++) {
+                var lnglat = that.cartesianToLatlng(data[i]);
+                lnglatArr.push(lnglat)
+        }
+        that._cicleData = lnglatArr;
+        var value = data;
+        var r = Math.sqrt(
+            Math.pow(value[0].x - value[value.length - 1].x, 2) +
+            Math.pow(value[0].y - value[value.length - 1].y, 2)
+        );
+        var position = value[0];
+        return   {position,r}
+    }
+ 
+    startCreate(drawType) {
+        this.drawType = drawType
+        this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
+        this.viewer.scene.globe.depthTestAgainstTerrain = true;
+        var $this = this;
+        this.handler.setInputAction(function (evt) { //单机开始绘制
+            $this.viewer.scene.globe.depthTestAgainstTerrain = true;
+            //屏幕坐标转地形上坐标
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            if ($this._positions.length == 0) {
+                $this._positions.push(cartesian.clone());
+                $this.floatingPoint = $this.createPoint(cartesian);
+                $this._positions.push(cartesian);
+            }
+            if (!$this._cicle) {
+                $this.createPoint(cartesian);// 绘制点
+            }
+            
+        }, $this.Cesium.ScreenSpaceEventType.LEFT_CLICK);
+        this.handler.setInputAction(function (evt) { //移动时绘制圆
+            if ($this._positions.length < 1) return;
+            var cartesian = $this.viewer.scene.pickPosition(evt.endPosition);// $this.getCatesian3FromPX(evt.endPosition);
+            if (!$this.Cesium.defined($this._cicle)) {
+                $this._cicle = $this.createCicle();
+            }
+            $this.floatingPoint.position.setValue(cartesian);
+            if ($this._cicle) {
+                $this._positions.pop();
+                $this._positions.push(cartesian);
+            }
+        }, $this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+        this.handler.setInputAction(function (evt) {
+            if (!$this._cicle) return;
+            $this.viewer.scene.globe.depthTestAgainstTerrain = false;
+            var cartesian = $this.viewer.scene.pickPosition(evt.position); // $this.getCatesian3FromPX(evt.position);
+            $this._positions.pop();
+            $this._positions.push(cartesian);
+            $this._cicleData = $this._positions.concat();
+            $this.viewer.entities.remove($this._cicle); //移除
+            $this._cicle = null;
+            $this._positions = [];
+            $this.floatingPoint.position.setValue(cartesian);
+            let lnglatArr = [];
+            for (var i = 0; i < $this._cicleData.length; i++) {
+                var lnglat = $this.cartesianToLatlng($this._cicleData[i]);
+                lnglatArr.push(lnglat)
+            }
+            $this._cicleData = lnglatArr;
+            var cicle = $this.addload($this._cicleData); //加载
+            $this._entities_cicle.push(cicle);
+            $this._cicleLast = cicle;
+            $this.clearPoint();
+            // if(typeof $this.callback=="function"){
+            //     $this.callback(cicle);
+            // }
+            $this.destroy()
+        }, $this.Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+    }
+ 
+    //创建圆
+    createCicle() {
+        var that = this;
+        var shape = this.viewer.entities.add({
+            position: that._positions[0],
+            ellipse: {
+                semiMinorAxis: new that.Cesium.CallbackProperty(function () {
+                    //半径 两点间距离
+                    var r = Math.sqrt(
+                        Math.pow(that._positions[0].x - that._positions[that._positions.length - 1].x, 2) +
+                        Math.pow(that._positions[0].y - that._positions[that._positions.length - 1].y, 2)
+                    );
+                    return r ? r : r + 1;
+                }, false),
+                semiMajorAxis: new that.Cesium.CallbackProperty(function () {
+                    var r = Math.sqrt(
+                        Math.pow(that._positions[0].x - that._positions[that._positions.length - 1].x, 2) +
+                        Math.pow(that._positions[0].y - that._positions[that._positions.length - 1].y, 2)
+                    );
+                    return r ? r : r + 1;
+                }, false),
+                material: that.Cesium.Color.RED.withAlpha(0.5),
+                outline: true
+            }
+        });
+        that._entities_cicle.push(shape);
+        return shape;
+    }
+ 
+    //创建点
+    createPoint(cartesian) {
+        var $this = this;
+        var point = this.viewer.entities.add({
+            position: cartesian,
+            point: {
+                pixelSize: 10,
+                color: $this.Cesium.Color.RED,
+                heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+            }
+        });;
+        $this._entities_point.push(point);
+        return point;
+    }
+ 
+    getCatesian3FromPX(px) {
+        var cartesian;
+        var ray = this.viewer.camera.getPickRay(px);
+        if (!ray) return null;
+        cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+        return cartesian;
+    }
+
+    cartesianToLatlng(cartesian) {
+        let cartographic = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+        let lat = this.Cesium.Math.toDegrees(cartographic.latitude);
+        let lng = this.Cesium.Math.toDegrees(cartographic.longitude);
+        let alt = cartographic.height;
+        return [lng, lat];
+    }
+    LatlngTocartesian(latlng){
+        let cartesian3 = this.Cesium.Cartesian3.fromDegrees(latlng[0],latlng[1],0);
+        return cartesian3
+    }
+ 
+    destroy() {
+        if (this.handler) {
+            this.handler.destroy();
+            this.handler = null;
+        }
+    }
+ 
+    clearPoint(){
+        this.DrawEndEvent.raiseEvent(this._cicleLast, this._cicleData, this.drawType);
+        for (var i = 0; i < this._entities_point.length; i++) {
+            this.viewer.entities.remove(this._entities_point[i]);
+        }
+        this._entities_point = [];  //脏数据
+    }
+    clear() {
+ 
+        for (var i = 0; i < this._entities_point.length; i++) {
+            this.viewer.entities.remove(this._entities_point[i]);
+        }
+ 
+        for (var i = 0; i < this._entities_cicle.length; i++) {
+            this.viewer.entities.remove(this._entities_cicle[i]);
+        }
+        this._cicle = null; //活动圆
+        this.floatingPoint = null;
+        this._cicleLast = null; //最后一个圆
+        this._positions = [];  //活动点
+        this._entities_point = [];  //脏数据
+        this._entities_cicle = [];  //脏数据
+        this._cicleData = null; //用于构造圆形数据
+    }
+}
+ 
+export default DrawCircle

+ 597 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawClosedCurve.js

@@ -0,0 +1,597 @@
+import {
+	createTooltip
+} from "../../../common/common.js";
+
+import {
+	isRuntimeApp,
+	isRuntimeWeb,
+	createOperationMainDom,
+	showTooltipMessage
+} from "../../../common/RuntimeEnvironment.js";
+
+
+// 闭合曲面
+class DrawClosedCurve {
+	constructor(arg) {
+		this.viewer = arg.viewer;
+		this.Cesium = arg.Cesium;
+		this.floatingPoint = null; //标识点
+		this._ClosedCurve = null; //活动闭合曲面
+		this._ClosedCurveLast = null; //最后一个闭合曲面
+		this._positions = []; //活动点
+		this._entities_point = []; //脏数据
+		this._entities_ClosedCurve = []; //脏数据
+		this._ClosedCurveData = null; //用于构造闭合曲面数据
+		this.ZERO_TOLERANCE = 0.0001;
+		this.FITTING_COUNT = 100;
+		this.t = 0.3
+		this.objId = Number((new Date()).getTime() + "" + Number(Math.random() * 1000).toFixed(0));
+		this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+		this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+
+		this._tooltip = createTooltip(this.viewer.container);
+
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+	}
+
+	//返回闭合曲面
+	get ClosedCurve() {
+		return this._ClosedCurveLast;
+	}
+
+	//返回闭合曲面数据用于加载闭合曲面
+	getData() {
+		return this._ClosedCurveData;
+	}
+
+	// 修改编辑调用计算
+	computePosition(data) {
+		let $this = this;
+		if (data.length < 2) return
+		let pnts = []
+		for (let p = 0; p < data.length; p++) {
+			pnts.push($this.cartesianToLatlng(data[p]))
+		}
+		this._ClosedCurveData = Array.from(pnts);
+		pnts.push(pnts[0], pnts[1])
+		let [normals, pList] = [
+			[],
+			[]
+		]
+		for (let i = 0; i < pnts.length - 2; i++) {
+			let normalPoints = $this.getBisectorNormals($this.t, pnts[i], pnts[i + 1], pnts[i + 2])
+			normals = normals.concat(normalPoints)
+		}
+		let count = normals.length
+		normals = [normals[count - 1]].concat(normals.slice(0, count - 1))
+		for (let i = 0; i < pnts.length - 2; i++) {
+			let pnt1 = pnts[i]
+			let pnt2 = pnts[i + 1]
+			pList.push($this.LatlngTocartesian(pnt1))
+			for (let t = 0; t <= $this.FITTING_COUNT; t++) {
+				let pnt = $this.getCubicValue(t / $this.FITTING_COUNT, pnt1, normals[i * 2], normals[i * 2 + 1], pnt2)
+				pList.push($this.LatlngTocartesian(pnt))
+			}
+			pList.push($this.LatlngTocartesian(pnt2))
+		}
+		let PolygonHierarchy = new $this.Cesium.PolygonHierarchy(pList);
+		return {
+			PolygonHierarchy,
+			pList
+		}
+	}
+
+	//加载闭合曲面
+	addload(data) {
+		let $this = this
+		if (data.length < 2) return
+		let pnts = Array.from(data);
+		pnts.push(pnts[0], pnts[1])
+		let [normals, pList] = [
+			[],
+			[]
+		]
+		for (let i = 0; i < pnts.length - 2; i++) {
+			let normalPoints = $this.getBisectorNormals($this.t, pnts[i], pnts[i + 1], pnts[i + 2])
+			normals = normals.concat(normalPoints)
+		}
+		let count = normals.length
+		normals = [normals[count - 1]].concat(normals.slice(0, count - 1))
+		for (let i = 0; i < pnts.length - 2; i++) {
+			let pnt1 = pnts[i]
+			let pnt2 = pnts[i + 1]
+			pList.push($this.LatlngTocartesian(pnt1))
+			for (let t = 0; t <= $this.FITTING_COUNT; t++) {
+				let pnt = $this.getCubicValue(t / $this.FITTING_COUNT, pnt1, normals[i * 2], normals[i * 2 + 1], pnt2)
+				pList.push($this.LatlngTocartesian(pnt))
+			}
+			pList.push($this.LatlngTocartesian(pnt2))
+		}
+		console.log(data, pnts)
+		var arrowEntity = $this.viewer.entities.add({
+			Type: 'DrawClosedCurve',
+			Position: data,
+			id: data.id || $this.objId,
+			polygon: {
+				hierarchy: new $this.Cesium.PolygonHierarchy(pList),
+				show: true,
+				fill: true,
+				clampToGround: true,
+				material: $this.polygonMaterial
+			},
+			polyline: {
+				positions: pList,
+				show: true,
+				material: new Cesium.PolylineDashMaterialProperty({
+					color: Cesium.Color.YELLOW,
+				}),
+				width: 3,
+				clampToGround: true
+			}
+
+		});
+		return arrowEntity;
+	}
+
+	//开始创建
+	startCreate(drawType) {
+
+		if (isRuntimeApp()) {
+			showTooltipMessage("点击开始绘制");
+		}
+
+		var $this = this;
+
+		this.drawType = drawType;
+		this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
+		//单击开始绘制
+		this.handler.setInputAction(function(evt) {
+			if (isRuntimeApp()) {
+
+				//屏幕坐标转地形上坐标
+				var cartesian = $this.getCatesian3FromPX(evt.position);
+				if (!cartesian) {
+					return;
+				}
+
+				$this.createPoint(cartesian); // 绘制点
+				$this._positions.push(cartesian);
+
+				if ($this._positions.length > 2) {
+					showTooltipMessage("点击添加点,点击完成按钮,结束绘制");
+					if ($this._positions.length === 3) {
+						
+						if (!$this.Cesium.defined($this._ClosedCurve)) {
+							$this._ClosedCurve = $this.createClosedCurve();
+
+							//创建按钮
+							createOperationMainDom();
+							//完成绘制
+							document.getElementById("btnDrawComplete").onclick = () => {
+
+								$this._ClosedCurveData = $this._positions.concat();
+								$this.viewer.entities.remove($this._ClosedCurve); //移除
+								$this._ClosedCurve = null;
+								$this._positions = [];
+								var lnglatArr = [];
+								for (var i = 0; i < $this._ClosedCurveData.length; i++) {
+									var lnglat = $this.cartesianToLatlng($this._ClosedCurveData[i]);
+									lnglatArr.push(lnglat)
+								}
+								$this._ClosedCurveData = lnglatArr;
+								var ClosedCurve = $this.addload(lnglatArr); //加载
+								$this._entities_ClosedCurve.push(ClosedCurve);
+								$this._ClosedCurveLast = ClosedCurve;
+								$this.clearPoint();
+								$this.destroy();
+
+								let buttonDiv = document.getElementById("drawButtonDiv");
+								if (buttonDiv) {
+									//从页面移除
+									document.body.removeChild(buttonDiv);
+								}
+							}
+						}
+					}
+
+				} else {
+					showTooltipMessage("点击添加点");
+				}
+
+			} else {
+				console.log('监听鼠标事件', '单击')
+
+				/* 锁定点击事件 以免和双击事件冲突 */
+				clearTimeout($this._timer);
+				$this._timer = setTimeout(function() {
+					//屏幕坐标转地形上坐标
+					var cartesian = $this.getCatesian3FromPX(evt.position);
+					if ($this._positions.length == 0) {
+						$this.floatingPoint = $this.createPoint(cartesian);
+					}
+					$this._positions.push(cartesian);
+					$this.createPoint(cartesian);
+				}, 200);
+			}
+		}, $this.Cesium.ScreenSpaceEventType.LEFT_CLICK);
+		//移动时绘制面
+		this.handler.setInputAction(function(evt) {
+
+			/* 如果运行环境是App 则禁止使用鼠标移动事件 */
+			if (isRuntimeApp()) return;
+
+			if ($this._positions.length == 0) {
+				$this._tooltip.showAt(evt.endPosition, "点击开始绘制");
+			} else {
+				$this._tooltip.showAt(evt.endPosition, "点击添加点");
+			}
+
+			if ($this._positions.length < 2) return;
+
+			$this._tooltip.showAt(evt.endPosition, "点击添加点,双击结束绘制");
+
+			var cartesian = $this.getCatesian3FromPX(evt.endPosition);
+			if ($this._positions.length == 2) {
+				$this._positions.push(cartesian);
+			}
+			$this._positions.pop();
+			$this._positions.push(cartesian);
+			if (!$this.Cesium.defined($this._ClosedCurve)) {
+				$this._ClosedCurve = $this.createClosedCurve();
+			}
+
+		}, $this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+		//右击停止采集改为双击结束
+		this.handler.setInputAction(function(evt) {
+			// if (!$this._ClosedCurve) return;
+			// var cartesian = $this.getCatesian3FromPX(evt.position);
+			// $this._positions.pop();
+			// $this._positions.push(cartesian);
+			// $this._ClosedCurveData = $this._positions.concat();
+			// $this.viewer.entities.remove($this._ClosedCurve); //移除
+			// $this._ClosedCurve = null;
+			// $this._positions = [];
+			// $this.floatingPoint.position.setValue(cartesian);
+			// var lnglatArr = [];
+			// for (var i = 0; i < $this._ClosedCurveData.length; i++) {
+			// 	var lnglat = $this.cartesianToLatlng($this._ClosedCurveData[i]);
+			// 	lnglatArr.push(lnglat)
+			// }
+			// $this._ClosedCurveData = lnglatArr;
+			// var ClosedCurve = $this.addload(lnglatArr); //加载
+			// $this._entities_ClosedCurve.push(ClosedCurve);
+			// $this._ClosedCurveLast = ClosedCurve;
+			// $this.clearPoint();
+			// $this.destroy()
+		}, $this.Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+		//双击结束
+		this.handler.setInputAction(function(evt) {
+			/* 如果运行环境是App 则禁止使用鼠标双击事件 */
+			if (isRuntimeApp()) return;
+
+			console.log('监听鼠标事件', '双击')
+
+			/* 解除锁定 */
+			clearTimeout($this._timer);
+
+			if (!$this._ClosedCurve) return;
+
+			var cartesian = $this.getCatesian3FromPX(evt.position);
+			$this._positions.pop();
+			$this._positions.push(cartesian);
+			$this._ClosedCurveData = $this._positions.concat();
+			$this.viewer.entities.remove($this._ClosedCurve); //移除
+			$this._ClosedCurve = null;
+			$this._positions = [];
+			$this.floatingPoint.position.setValue(cartesian);
+			var lnglatArr = [];
+			for (var i = 0; i < $this._ClosedCurveData.length; i++) {
+				var lnglat = $this.cartesianToLatlng($this._ClosedCurveData[i]);
+				lnglatArr.push(lnglat)
+			}
+			$this._ClosedCurveData = lnglatArr;
+			var ClosedCurve = $this.addload(lnglatArr); //加载
+			$this._entities_ClosedCurve.push(ClosedCurve);
+			$this._ClosedCurveLast = ClosedCurve;
+			$this.clearPoint();
+			$this.destroy();
+
+			$this._tooltip.setVisible(false);
+		}, $this.Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
+	}
+
+	//创建直线闭合曲面
+	createClosedCurve() {
+		// console.log(this._positions)
+		var $this = this;
+		$this.pLists = ''
+		var arrowEntity = $this.viewer.entities.add({
+			polygon: {
+				hierarchy: new $this.Cesium.CallbackProperty(
+					function() {
+						if ($this._positions.length < 2) return
+						let pnts = []
+						for (let p = 0; p < $this._positions.length; p++) {
+							pnts.push($this.cartesianToLatlng($this._positions[p]))
+						}
+						pnts.push(pnts[0], pnts[1])
+						let [normals, pList] = [
+							[],
+							[]
+						]
+						for (let i = 0; i < pnts.length - 2; i++) {
+							let normalPoints = $this.getBisectorNormals($this.t, pnts[i], pnts[i + 1], pnts[i + 2])
+							normals = normals.concat(normalPoints)
+						}
+						let count = normals.length
+						normals = [normals[count - 1]].concat(normals.slice(0, count - 1))
+						for (let i = 0; i < pnts.length - 2; i++) {
+							let pnt1 = pnts[i]
+							let pnt2 = pnts[i + 1]
+							pList.push($this.LatlngTocartesian(pnt1))
+							for (let t = 0; t <= $this.FITTING_COUNT; t++) {
+								let pnt = $this.getCubicValue(t / $this.FITTING_COUNT, pnt1, normals[i * 2], normals[i * 2 + 1], pnt2)
+								pList.push($this.LatlngTocartesian(pnt))
+							}
+							pList.push($this.LatlngTocartesian(pnt2))
+						}
+						$this.pLists = pList
+						return new $this.Cesium.PolygonHierarchy(pList);
+					}, false),
+				show: true,
+				fill: true,
+				clampToGround: true,
+				material: $this.polygonMaterial
+			},
+			polyline: {
+				positions: new $this.Cesium.CallbackProperty(
+					function() {
+						return $this.pLists
+					}, false
+				),
+				show: true,
+				material: new Cesium.PolylineDashMaterialProperty({
+					color: Cesium.Color.YELLOW,
+				}),
+				width: 3,
+				clampToGround: true
+			}
+		})
+		$this._entities_ClosedCurve.push(arrowEntity);
+		return arrowEntity
+	}
+
+	//创建点
+	createPoint(cartesian) {
+		var $this = this;
+		var point = this.viewer.entities.add({
+			position: cartesian,
+			point: {
+				pixelSize: 10,
+				color: $this.Cesium.Color.RED,
+				heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+			}
+		});
+		$this._entities_point.push(point);
+		return point;
+	}
+
+
+	/**
+	 * 世界坐标转经纬度
+	 */
+	cartesianToLatlng(cartesian) {
+		var latlng = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+		var lat = this.Cesium.Math.toDegrees(latlng.latitude);
+		var lng = this.Cesium.Math.toDegrees(latlng.longitude);
+		return [lng, lat];
+	}
+
+	/**
+	 * 经纬度转世界坐标
+	 */
+	LatlngTocartesian(latlng) {
+		let cartesian3 = this.Cesium.Cartesian3.fromDegrees(latlng[0], latlng[1]);
+		return cartesian3
+	}
+
+	/**
+	 * 经纬度坐标转墨卡托坐标
+	 */
+	// 墨卡托坐标系:展开地球,赤道作为x轴,向东为x轴正方,本初子午线作为y轴,向北为y轴正方向。
+	// 数字20037508.34是地球赤道周长的一半:地球半径6378137米,赤道周长2*PI*r = 2 * 20037508.3427892,墨卡托坐标x轴区间[-20037508.3427892,20037508.3427892]
+	lonLatToMercator(Latlng) {
+		var E = Latlng[0];
+		var N = Latlng[1];
+		var x = E * 20037508.34 / 180;
+		var y = Math.log(Math.tan((90 + N) * Math.PI / 360)) / (Math.PI / 180);
+		y = y * 20037508.34 / 180;
+		return [x, y]
+	}
+	/**
+	 * 墨卡托坐标转经纬度坐标转
+	 */
+	WebMercator2lonLat(mercator) {
+		let x = mercator[0] / 20037508.34 * 180;
+		let ly = mercator[1] / 20037508.34 * 180;
+		let y = 180 / Math.PI * (2 * Math.atan(Math.exp(ly * Math.PI / 180)) - Math.PI / 2)
+		return [x, y];
+	}
+
+	//销毁
+	destroy() {
+		if (this.handler) {
+			this.handler.destroy();
+			this.handler = null;
+		}
+	}
+
+	clearPoint() {
+		this.DrawEndEvent.raiseEvent(this._ClosedCurveLast, this._ClosedCurveData);
+		for (var i = 0; i < this._entities_point.length; i++) {
+			this.viewer.entities.remove(this._entities_point[i]);
+		}
+		this._entities_point = []; //脏数据
+	}
+
+	//清空实体对象
+	clear() {
+		for (var i = 0; i < this._entities_point.length; i++) {
+			this.viewer.entities.remove(this._entities_point[i]);
+		}
+		for (var i = 0; i < this._entities_ClosedCurve.length; i++) {
+			this.viewer.entities.remove(this._entities_ClosedCurve[i]);
+		}
+		this.floatingPoint = null; //标识点
+		this._ClosedCurve = null; //活动闭合曲面
+		this._ClosedCurveLast = null; //最后一个闭合曲面
+		this._positions = []; //活动点
+		this._entities_point = []; //脏数据
+		this._entities_ClosedCurve = []; //脏数据
+		this._ClosedCurveData = null; //用于构造闭合曲面数据
+	}
+
+	getCatesian3FromPX(px) {
+		var cartesian;
+		var ray = this.viewer.camera.getPickRay(px);
+		if (!ray) return null;
+		cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+		return cartesian;
+	}
+
+	// 求取闭合曲面坐标函数/
+	//闭合曲面配置函数
+	/**
+	 * getBisectorNormals
+	 * @param t
+	 * @param pnt1
+	 * @param pnt2
+	 * @param pnt3
+	 * @returns {[*,*]}
+	 */
+	getBisectorNormals(t, pnt1, pnt2, pnt3) {
+		let $this = this
+		let normal = $this.getNormal(pnt1, pnt2, pnt3)
+		let [bisectorNormalRight, bisectorNormalLeft, dt, x, y] = [null, null, null, null, null]
+		let dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1])
+		let uX = normal[0] / dist
+		let uY = normal[1] / dist
+		let d1 = $this.MathDistance(pnt1, pnt2)
+		let d2 = $this.MathDistance(pnt2, pnt3)
+
+		if (dist > $this.ZERO_TOLERANCE) {
+			if ($this.isClockWise(pnt1, pnt2, pnt3)) {
+				dt = t * d1
+				x = pnt2[0] - dt * uY
+				y = pnt2[1] + dt * uX
+				bisectorNormalRight = [x, y]
+				dt = t * d2
+				x = pnt2[0] + dt * uY
+				y = pnt2[1] - dt * uX
+				bisectorNormalLeft = [x, y]
+			} else {
+				dt = t * d1
+				x = pnt2[0] + dt * uY
+				y = pnt2[1] - dt * uX
+				bisectorNormalRight = [x, y]
+				dt = t * d2
+				x = pnt2[0] - dt * uY
+				y = pnt2[1] + dt * uX
+				bisectorNormalLeft = [x, y]
+			}
+		} else {
+			x = pnt2[0] + t * (pnt1[0] - pnt2[0])
+			y = pnt2[1] + t * (pnt1[1] - pnt2[1])
+			bisectorNormalRight = [x, y]
+			x = pnt2[0] + t * (pnt3[0] - pnt2[0])
+			y = pnt2[1] + t * (pnt3[1] - pnt2[1])
+			bisectorNormalLeft = [x, y]
+		}
+		return [bisectorNormalRight, bisectorNormalLeft]
+	}
+
+
+	/**
+	 * 获取默认三点的内切圆
+	 * @param pnt1
+	 * @param pnt2
+	 * @param pnt3
+	 * @returns {[*,*]}
+	 */
+	getNormal(pnt1, pnt2, pnt3) {
+		let dX1 = pnt1[0] - pnt2[0]
+		let dY1 = pnt1[1] - pnt2[1]
+		let d1 = Math.sqrt(dX1 * dX1 + dY1 * dY1)
+		dX1 /= d1
+		dY1 /= d1
+		let dX2 = pnt3[0] - pnt2[0]
+		let dY2 = pnt3[1] - pnt2[1]
+		let d2 = Math.sqrt(dX2 * dX2 + dY2 * dY2)
+		dX2 /= d2
+		dY2 /= d2
+		let uX = dX1 + dX2
+		let uY = dY1 + dY2
+		return [uX, uY]
+	}
+
+	/**
+	 * 计算两个坐标之间的距离
+	 * @ignore
+	 * @param pnt1
+	 * @param pnt2
+	 * @returns {number}
+	 * @constructor
+	 */
+	MathDistance(pnt1, pnt2) {
+		return (Math.sqrt(Math.pow((pnt1[0] - pnt2[0]), 2) + Math.pow((pnt1[1] - pnt2[1]), 2)))
+	}
+
+	/**
+	 * 判断是否是顺时针
+	 * @param pnt1
+	 * @param pnt2
+	 * @param pnt3
+	 * @returns {boolean}
+	 */
+	isClockWise(pnt1, pnt2, pnt3) {
+		return ((pnt3[1] - pnt1[1]) * (pnt2[0] - pnt1[0]) > (pnt2[1] - pnt1[1]) * (pnt3[0] - pnt1[0]))
+	}
+
+	/**
+	 * 获取立方值
+	 * @param t
+	 * @param startPnt
+	 * @param cPnt1
+	 * @param cPnt2
+	 * @param endPnt
+	 * @returns {[*,*]}
+	 */
+	getCubicValue(t, startPnt, cPnt1, cPnt2, endPnt) {
+		t = Math.max(Math.min(t, 1), 0)
+		let [tp, t2] = [(1 - t), (t * t)]
+		let t3 = t2 * t
+		let tp2 = tp * tp
+		let tp3 = tp2 * tp
+		let x = (tp3 * startPnt[0]) + (3 * tp2 * t * cPnt1[0]) + (3 * tp * t2 * cPnt2[0]) + (t3 * endPnt[0])
+		let y = (tp3 * startPnt[1]) + (3 * tp2 * t * cPnt1[1]) + (3 * tp * t2 * cPnt2[1]) + (t3 * endPnt[1])
+		return [x, y]
+	}
+
+}
+
+export default DrawClosedCurve

+ 510 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawCurve.js

@@ -0,0 +1,510 @@
+// 三、曲线
+// DrawCurve
+/*
+绘制曲线
+ */
+class DrawCurve {
+    constructor(arg) {
+        this.viewer = arg.viewer;
+        this.Cesium = arg.Cesium;
+        this.floatingPoint = null;//标识点
+        this._curveline = null; //活动曲线
+        this._curvelineLast = null; //最后一条曲线
+        this._positions = [];  //活动点
+        this._entities_point = [];  //脏数据
+        this._entities_line = [];  //脏数据
+        this._curvelineData = null; //用于构造曲线数据
+        this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+        this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+        this.ZERO_TOLERANCE = 0.0001;
+        this.FITTING_COUNT = 100;
+        this.t = 0.3;
+		
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+		
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+    }
+
+    //返回最后活动曲线
+    get curveline() {
+        return this._curvelineLast;
+    }
+
+    //返回线数据用于加载线
+    getData() {
+        return this._curvelineData;
+    }
+
+    //加载曲线
+    addload(data) {
+        var $this = this;
+        let pnts = []
+        for (let p = 0; p < data.length; p++) {
+            pnts.push($this.lonLatToMercator(data[p]))
+        }
+        let CurvePoints = $this.getCurvePoints(pnts)
+        let point = [];
+        for (let i = 0; i < CurvePoints.length; i++) {
+            point.push($this.LatlngTocartesian($this.WebMercator2lonLat(CurvePoints[i])))
+        }
+        var polyline = this.viewer.entities.add({
+            Type: 'DrawCurve',
+            Position: data,
+            id: data.id || $this.objId,
+            polyline: {
+                positions: point,
+                show: true,
+                material: $this.Cesium.Color.YELLOW,
+                width: 3,
+                clampToGround: true
+            }
+        });
+        return polyline;
+    }
+
+    // 修改编辑调用计算
+    computePosition(data) {
+        let pnts = [];
+        let position = [];
+        for (let p = 0; p < data.length; p++) {
+            position.push(this.cartesianToLatlng(data[p]));
+            pnts.push(this.lonLatToMercator(this.cartesianToLatlng(data[p])))
+        }
+        this._curvelineData = position;
+        let CurvePoints = this.getCurvePoints(pnts)
+        let point = [];
+        for (let i = 0; i < CurvePoints.length; i++) {
+            point.push(this.LatlngTocartesian(this.WebMercator2lonLat(CurvePoints[i])))
+        }
+        return point;
+    }
+
+    //开始创建
+    startCreate(drawType) {
+        this.drawType = drawType
+        var $this = this;
+        this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
+        this.handler.setInputAction(function (evt) { //单机开始绘制
+            //屏幕坐标转地形上坐标
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            if ($this._positions.length == 0) {
+                $this._positions.push(cartesian.clone());
+                $this.floatingPoint = $this.createPoint(cartesian);
+                $this.createPoint(cartesian);// 绘制点
+            }
+            $this._positions.push(cartesian);
+        }, $this.Cesium.ScreenSpaceEventType.LEFT_CLICK);
+        this.handler.setInputAction(function (evt) { //移动时绘制线
+            if ($this._positions.length < 3) return;
+            var cartesian = $this.getCatesian3FromPX(evt.endPosition);
+            if (!$this.Cesium.defined($this._curveline)) {
+                $this._curveline = $this.createCurveline();
+            }
+            $this.floatingPoint.position.setValue(cartesian);
+            if ($this._curveline) {
+                $this._positions.pop();
+                $this._positions.push(cartesian);
+            }
+        }, $this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+        this.handler.setInputAction(function (evt) {
+            if (!$this._curveline) return;
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            $this._positions.pop();
+            $this._positions.push(cartesian);
+            $this.createPoint(cartesian);// 绘制点
+            $this._curvelineData = $this._positions.concat();
+            $this.viewer.entities.remove($this._curveline); //移除
+            $this._curveline = null;
+            $this._positions = [];
+            $this.floatingPoint.position.setValue(cartesian);
+            let lnglatArr = [];
+            for (var i = 0; i < $this._curvelineData.length; i++) {
+                var lnglat = $this.cartesianToLatlng($this._curvelineData[i]);
+                lnglatArr.push(lnglat)
+            }
+            $this._curvelineData = lnglatArr;
+            var line = $this.addload($this._curvelineData); //加载曲线
+            $this._entities_line.push(line);
+            $this._curvelineLast = line;
+            $this.clearPoint()
+            $this.destroy()
+
+        }, $this.Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+    }
+
+    //创建点
+    createPoint(cartesian) {
+        var $this = this;
+        var point = this.viewer.entities.add({
+            position: cartesian,
+            point: {
+               pixelSize: 10,
+               color: $this.Cesium.Color.RED,
+               heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+            }
+        });
+        $this._entities_point.push(point);
+        return point;
+    }
+
+    //创建曲线
+    createCurveline() {
+        var $this = this;
+        var polyline = this.viewer.entities.add({
+            polyline: {
+                //使用cesium的peoperty
+                positions: new $this.Cesium.CallbackProperty(function () {
+                    let pnts = []
+                    for (let p = 0; p < $this._positions.length; p++) {
+                        pnts.push($this.lonLatToMercator($this.cartesianToLatlng($this._positions[p])))
+                    }
+                    let CurvePoints = $this.getCurvePoints(pnts)
+                    let point = [];
+                    for (let i = 0; i < CurvePoints.length; i++) {
+                        point.push($this.LatlngTocartesian($this.WebMercator2lonLat(CurvePoints[i])))
+                    }
+                    return point;
+                }, false),
+                show: true,
+                material: $this.Cesium.Color.YELLOW,
+                width: 3,
+                clampToGround: true
+            }
+        });
+        $this._entities_line.push(polyline);
+        return polyline;
+    }
+    clearPoint() {
+        this.DrawEndEvent.raiseEvent(this._curvelineLast, this._curvelineData, this.drawType);
+        for (var i = 0; i < this._entities_point.length; i++) {
+            this.viewer.entities.remove(this._entities_point[i]);
+        }
+        this._entities_point = [];  //脏数据
+    }
+
+    //销毁
+    destroy() {
+        if (this.handler) {
+            this.handler.destroy();
+            this.handler = null;
+        }
+    }
+
+    //清空实体对象
+    clear() {
+        for (var i = 0; i < this._entities_point.length; i++) {
+            this.viewer.entities.remove(this._entities_point[i]);
+        }
+        for (var i = 0; i < this._entities_line.length; i++) {
+            this.viewer.entities.remove(this._entities_line[i]);
+        }
+        this.floatingPoint = null;//标识点
+        this._curveline = null; //活动曲线
+        this._curvelineLast = null; //最后一条曲线
+        this._positions = [];  //活动点
+        this._entities_point = [];  //脏数据
+        this._entities_line = [];  //脏数据
+        this._curvelineData = null; //用于构造曲线数据
+    }
+
+    getCatesian3FromPX(px) {
+        var cartesian;
+        var ray = this.viewer.camera.getPickRay(px);
+        if (!ray) return null;
+        cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+        return cartesian;
+    }
+
+    cartesianToLatlng(cartesian) {
+        var latlng = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+        var lat = this.Cesium.Math.toDegrees(latlng.latitude);
+        var lng = this.Cesium.Math.toDegrees(latlng.longitude);
+        return [lng, lat];
+    }
+
+    LatlngTocartesian(latlng) {
+        let cartesian3 = this.Cesium.Cartesian3.fromDegrees(latlng[0], latlng[1]);
+        return cartesian3
+    }
+
+    /**
+     * 经纬度坐标转墨卡托坐标
+     */
+    // 墨卡托坐标系:展开地球,赤道作为x轴,向东为x轴正方,本初子午线作为y轴,向北为y轴正方向。
+    // 数字20037508.34是地球赤道周长的一半:地球半径6378137米,赤道周长2*PI*r = 2 * 20037508.3427892,墨卡托坐标x轴区间[-20037508.3427892,20037508.3427892]
+    lonLatToMercator(Latlng) {
+        var E = Latlng[0];
+        var N = Latlng[1];
+        var x = E * 20037508.34 / 180;
+        var y = Math.log(Math.tan((90 + N) * Math.PI / 360)) / (Math.PI / 180);
+        y = y * 20037508.34 / 180;
+        return [x, y]
+    }
+    /**
+     * 墨卡托坐标转经纬度坐标转
+     */
+    WebMercator2lonLat(mercator) {
+        let x = mercator[0] / 20037508.34 * 180;
+        let ly = mercator[1] / 20037508.34 * 180;
+        let y = 180 / Math.PI * (2 * Math.atan(Math.exp(ly * Math.PI / 180)) - Math.PI / 2)
+        return [x, y];
+    }
+
+
+
+    /**
+     * 插值曲线点
+     * @param t
+     * @param controlPoints
+     * @returns {null}
+     */
+    getCurvePoints( controlPoints) {
+        let leftControl = this.getLeftMostControlPoint(controlPoints, this.t)
+        let [pnt1, pnt2, pnt3, normals, points] = [null, null, null, [leftControl], []]
+        for (let i = 0; i < controlPoints.length - 2; i++) {
+            [pnt1, pnt2, pnt3] = [controlPoints[i], controlPoints[i + 1], controlPoints[i + 2]]
+            let normalPoints = this.getBisectorNormals(this.t, pnt1, pnt2, pnt3)
+            normals = normals.concat(normalPoints)
+        }
+        let rightControl = this.getRightMostControlPoint(controlPoints, this.t)
+        if (rightControl) {
+            normals.push(rightControl)
+        }
+        for (let i = 0; i < controlPoints.length - 1; i++) {
+            pnt1 = controlPoints[i]
+            pnt2 = controlPoints[i + 1]
+            points.push(pnt1)
+            for (let t = 0; t < this.FITTING_COUNT; t++) {
+                let pnt = this.getCubicValue(t / this.FITTING_COUNT, pnt1, normals[i * 2], normals[i * 2 + 1], pnt2)
+                points.push(pnt)
+            }
+            points.push(pnt2)
+        }
+        return points
+    }
+
+
+
+
+    /**
+     * 获取左边控制点
+     * @param controlPoints
+     * @returns {[*,*]}
+     */
+    getLeftMostControlPoint(controlPoints, t) {
+        let [pnt1, pnt2, pnt3, controlX, controlY] = [controlPoints[0], controlPoints[1], controlPoints[2], null, null]
+        let pnts = this.getBisectorNormals(0, pnt1, pnt2, pnt3)
+        let normalRight = pnts[0]
+        let normal = this.getNormal(pnt1, pnt2, pnt3)
+        let dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1])
+        if (dist > this.ZERO_TOLERANCE) {
+            let mid = this.Mid(pnt1, pnt2)
+            let pX = pnt1[0] - mid[0]
+            let pY = pnt1[1] - mid[1]
+            let d1 = this.MathDistance(pnt1, pnt2)
+            let n = 2.0 / d1
+            let nX = -n * pY
+            let nY = n * pX
+            let a11 = nX * nX - nY * nY
+            let a12 = 2 * nX * nY
+            let a22 = nY * nY - nX * nX
+            let dX = normalRight[0] - mid[0]
+            let dY = normalRight[1] - mid[1]
+            controlX = mid[0] + a11 * dX + a12 * dY
+            controlY = mid[1] + a12 * dX + a22 * dY
+        } else {
+            controlX = pnt1[0] + t * (pnt2[0] - pnt1[0])
+            controlY = pnt1[1] + t * (pnt2[1] - pnt1[1])
+        }
+        return [controlX, controlY]
+    }
+
+
+    /**
+     * getBisectorNormals
+     * @param t
+     * @param pnt1
+     * @param pnt2
+     * @param pnt3
+     * @returns {[*,*]}
+     */
+    getBisectorNormals(t, pnt1, pnt2, pnt3) {
+        let normal = this.getNormal(pnt1, pnt2, pnt3)
+        let [bisectorNormalRight, bisectorNormalLeft, dt, x, y] = [null, null, null, null, null]
+        let dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1])
+        let uX = normal[0] / dist
+        let uY = normal[1] / dist
+        let d1 = this.MathDistance(pnt1, pnt2)
+        let d2 = this.MathDistance(pnt2, pnt3)
+        if (dist > this.ZERO_TOLERANCE) {
+            if (this.isClockWise(pnt1, pnt2, pnt3)) {
+                dt = t * d1
+                x = pnt2[0] - dt * uY
+                y = pnt2[1] + dt * uX
+                bisectorNormalRight = [x, y]
+                dt = t * d2
+                x = pnt2[0] + dt * uY
+                y = pnt2[1] - dt * uX
+                bisectorNormalLeft = [x, y]
+            } else {
+                dt = t * d1
+                x = pnt2[0] + dt * uY
+                y = pnt2[1] - dt * uX
+                bisectorNormalRight = [x, y]
+                dt = t * d2
+                x = pnt2[0] - dt * uY
+                y = pnt2[1] + dt * uX
+                bisectorNormalLeft = [x, y]
+            }
+        } else {
+            x = pnt2[0] + t * (pnt1[0] - pnt2[0])
+            y = pnt2[1] + t * (pnt1[1] - pnt2[1])
+            bisectorNormalRight = [x, y]
+            x = pnt2[0] + t * (pnt3[0] - pnt2[0])
+            y = pnt2[1] + t * (pnt3[1] - pnt2[1])
+            bisectorNormalLeft = [x, y]
+        }
+        return [bisectorNormalRight, bisectorNormalLeft]
+    }
+
+
+
+    /**
+     * 获取默认三点的内切圆
+     * @param pnt1
+     * @param pnt2
+     * @param pnt3
+     * @returns {[*,*]}
+     */
+    getNormal(pnt1, pnt2, pnt3) {
+        let dX1 = pnt1[0] - pnt2[0]
+        let dY1 = pnt1[1] - pnt2[1]
+        let d1 = Math.sqrt(dX1 * dX1 + dY1 * dY1)
+        dX1 /= d1
+        dY1 /= d1
+        let dX2 = pnt3[0] - pnt2[0]
+        let dY2 = pnt3[1] - pnt2[1]
+        let d2 = Math.sqrt(dX2 * dX2 + dY2 * dY2)
+        dX2 /= d2
+        dY2 /= d2
+        let uX = dX1 + dX2
+        let uY = dY1 + dY2
+        return [uX, uY]
+    }
+
+
+
+    /**
+     * 判断是否是顺时针
+     * @param pnt1
+     * @param pnt2
+     * @param pnt3
+     * @returns {boolean}
+     */
+    isClockWise(pnt1, pnt2, pnt3) {
+        return ((pnt3[1] - pnt1[1]) * (pnt2[0] - pnt1[0]) > (pnt2[1] - pnt1[1]) * (pnt3[0] - pnt1[0]))
+    }
+
+
+    /**
+     * 求取两个坐标的中间值
+     * @param point1
+     * @param point2
+     * @returns {[*,*]}
+     * @constructor
+     */
+    Mid(point1, point2) {
+        return [(point1[0] + point2[0]) / 2, (point1[1] + point2[1]) / 2]
+    }
+
+
+    /**
+     * 计算两个坐标之间的距离
+	 * @ignore
+     * @param pnt1
+     * @param pnt2
+     * @returns {number}
+     * @constructor
+     */
+    MathDistance(pnt1, pnt2) {
+        return (Math.sqrt(Math.pow((pnt1[0] - pnt2[0]), 2) + Math.pow((pnt1[1] - pnt2[1]), 2)))
+    }
+
+
+    /**
+     * 获取右边控制点
+     * @param controlPoints
+     * @param t
+     * @returns {[*,*]}
+     */
+    getRightMostControlPoint(controlPoints, t) {
+        let count = controlPoints.length
+        let pnt1 = controlPoints[count - 3]
+        let pnt2 = controlPoints[count - 2]
+        let pnt3 = controlPoints[count - 1]
+        let pnts = this.getBisectorNormals(0, pnt1, pnt2, pnt3)
+        let normalLeft = pnts[1]
+        let normal = this.getNormal(pnt1, pnt2, pnt3)
+        let dist = Math.sqrt(normal[0] * normal[0] + normal[1] * normal[1])
+        let [controlX, controlY] = [null, null]
+        if (dist > this.ZERO_TOLERANCE) {
+            let mid = this.Mid(pnt2, pnt3)
+            let pX = pnt3[0] - mid[0]
+            let pY = pnt3[1] - mid[1]
+            let d1 = this.MathDistance(pnt2, pnt3)
+            let n = 2.0 / d1
+            let nX = -n * pY
+            let nY = n * pX
+            let a11 = nX * nX - nY * nY
+            let a12 = 2 * nX * nY
+            let a22 = nY * nY - nX * nX
+            let dX = normalLeft[0] - mid[0]
+            let dY = normalLeft[1] - mid[1]
+            controlX = mid[0] + a11 * dX + a12 * dY
+            controlY = mid[1] + a12 * dX + a22 * dY
+        } else {
+            controlX = pnt3[0] + t * (pnt2[0] - pnt3[0])
+            controlY = pnt3[1] + t * (pnt2[1] - pnt3[1])
+        }
+        return [controlX, controlY]
+    }
+
+
+    /**
+     * 获取立方值
+     * @param t
+     * @param startPnt
+     * @param cPnt1
+     * @param cPnt2
+     * @param endPnt
+     * @returns {[*,*]}
+     */
+    getCubicValue(t, startPnt, cPnt1, cPnt2, endPnt) {
+        t = Math.max(Math.min(t, 1), 0)
+        let [tp, t2] = [(1 - t), (t * t)]
+        let t3 = t2 * t
+        let tp2 = tp * tp
+        let tp3 = tp2 * tp
+        let x = (tp3 * startPnt[0]) + (3 * tp2 * t * cPnt1[0]) + (3 * tp * t2 * cPnt2[0]) + (t3 * endPnt[0])
+        let y = (tp3 * startPnt[1]) + (3 * tp2 * t * cPnt1[1]) + (3 * tp * t2 * cPnt2[1]) + (t3 * endPnt[1])
+        return [x, y]
+    }
+
+
+
+}
+
+export default DrawCurve

+ 463 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawCurveFlag.js

@@ -0,0 +1,463 @@
+
+// DrawCurveFlag
+/*
+绘制曲线旗标
+ */
+class DrawCurveFlag {
+    constructor(arg) {
+        this.viewer = arg.viewer;
+        this.Cesium = arg.Cesium;
+        this.identificationPoint = null; //标识点位
+        this.CurveFlag = null; 
+        this.CurveFlagLast = null; // 曲线旗标数据
+        this.positions = [];  // 经纬度
+        this.entitiesPoint = [];   // 实体点位
+        this.entitiesCurveFlag = [];  
+        this.CurveFlagData = null; 
+        this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+        this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+		
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+		
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+    }
+ 
+    //返回曲线旗标数据
+    getData() {
+        return this.CurveFlagData;
+    }
+
+    // 修改编辑调用计算
+    computePosition(data){
+        //计算面
+        let $this = this
+        var lnglatArr = [];
+        for (var i = 0; i < data.length; i++) {
+            var lnglat = $this.cartesianToLatlng(data[i]);
+            lnglatArr.push(lnglat)
+        }
+        // 取第一个
+        let startPoint = lnglatArr[0]
+        // 取最后一个
+        let endPoint =lnglatArr[lnglatArr.length - 1]
+        // 上曲线起始点
+        let point1 = startPoint
+        // 上曲线第一控制点
+        let point2 = [(endPoint[0] - startPoint[0]) / 4 + startPoint[0], (endPoint[1] - startPoint[1]) / 8 + startPoint[1]]
+        // 上曲线第二个点
+        let point3 = [(startPoint[0] + endPoint[0]) / 2, startPoint[1]]
+        // 上曲线第二控制点
+        let point4 = [(endPoint[0] - startPoint[0]) * 3 / 4 + startPoint[0], -(endPoint[1] - startPoint[1]) / 8 + startPoint[1]]
+        // 上曲线结束点
+        let point5 = [endPoint[0], startPoint[1]]
+        // 下曲线结束点
+        let point6 = [endPoint[0], (startPoint[1] + endPoint[1]) / 2]
+        // 下曲线第二控制点
+        let point7 = [(endPoint[0] - startPoint[0]) * 3 / 4 + startPoint[0], (endPoint[1] - startPoint[1]) * 3 / 8 + startPoint[1]]
+        // 下曲线第二个点
+        let point8 = [(startPoint[0] + endPoint[0]) / 2, (startPoint[1] + endPoint[1]) / 2]
+        // 下曲线第一控制点
+        let point9 = [(endPoint[0] - startPoint[0]) / 4 + startPoint[0], (endPoint[1] - startPoint[1]) * 5 / 8 + startPoint[1]]
+        // 下曲线起始点
+        let point10 = [startPoint[0], (startPoint[1] + endPoint[1]) / 2]
+        // 旗杆底部点
+        let point11 = [startPoint[0], endPoint[1]]
+        // 计算上曲线
+        let curve1 = $this.getBezierPoints([point1, point2, point3, point4, point5])
+        // 计算下曲线
+        let curve2 = $this.getBezierPoints([point6, point7, point8, point9, point10])
+        // 面合并
+        let componentspolygon = [];
+        componentspolygon = curve1.concat(curve2)
+        let PolygonHierarchy = new $this.Cesium.PolygonHierarchy(componentspolygon)
+        // 线边合并
+        let componentspolyline = [];
+        componentspolyline = curve1.concat(curve2)
+        componentspolyline.push($this.LatlngTocartesian(point1))
+        componentspolyline.push($this.LatlngTocartesian(point11))
+        
+        $this.CurveFlagData = lnglatArr;
+        return [PolygonHierarchy,componentspolyline];
+    }
+ 
+    //加载
+    addload(data) {
+        var $this = this;
+        if (data.length < 2) return;
+        // 取第一个
+        let startPoint = data[0]
+        // 取最后一个
+        let endPoint =data[data.length - 1]
+        // 上曲线起始点
+        let point1 = startPoint
+        // 上曲线第一控制点
+        let point2 = [(endPoint[0] - startPoint[0]) / 4 + startPoint[0], (endPoint[1] - startPoint[1]) / 8 + startPoint[1]]
+        // 上曲线第二个点
+        let point3 = [(startPoint[0] + endPoint[0]) / 2, startPoint[1]]
+        // 上曲线第二控制点
+        let point4 = [(endPoint[0] - startPoint[0]) * 3 / 4 + startPoint[0], -(endPoint[1] - startPoint[1]) / 8 + startPoint[1]]
+        // 上曲线结束点
+        let point5 = [endPoint[0], startPoint[1]]
+        // 下曲线结束点
+        let point6 = [endPoint[0], (startPoint[1] + endPoint[1]) / 2]
+        // 下曲线第二控制点
+        let point7 = [(endPoint[0] - startPoint[0]) * 3 / 4 + startPoint[0], (endPoint[1] - startPoint[1]) * 3 / 8 + startPoint[1]]
+        // 下曲线第二个点
+        let point8 = [(startPoint[0] + endPoint[0]) / 2, (startPoint[1] + endPoint[1]) / 2]
+        // 下曲线第一控制点
+        let point9 = [(endPoint[0] - startPoint[0]) / 4 + startPoint[0], (endPoint[1] - startPoint[1]) * 5 / 8 + startPoint[1]]
+        // 下曲线起始点
+        let point10 = [startPoint[0], (startPoint[1] + endPoint[1]) / 2]
+        // 旗杆底部点
+        let point11 = [startPoint[0], endPoint[1]]
+        // 计算上曲线
+        let curve1 = $this.getBezierPoints([point1, point2, point3, point4, point5])
+        // 计算下曲线
+        let curve2 = $this.getBezierPoints([point6, point7, point8, point9, point10])
+        // 合并
+        let componentspolygon = [];
+        componentspolygon = curve1.concat(curve2)
+        let componentspolyline = [];
+        componentspolyline = curve1.concat(curve2)
+        componentspolyline.push($this.LatlngTocartesian(point1))
+        componentspolyline.push($this.LatlngTocartesian(point11))
+        
+        var shape = this.viewer.entities.add({
+            Type:'DrawCurveFlag',
+            Position:data,
+            id:data.id || $this.objId,
+            polygon: {
+                hierarchy: new $this.Cesium.PolygonHierarchy(componentspolygon),
+                extrudedHeight: 1,
+                material: $this.Cesium.Color.RED,
+            },
+            polyline: {
+                //使用cesium的peoperty
+                positions: componentspolyline,
+                show: true,
+                material: $this.Cesium.Color.YELLOW,
+                width: 5,
+                clampToGround: true
+            }
+        });
+        $this.entitiesCurveFlag.push(shape);
+        return shape;
+    }
+ 
+    //开始创建
+    startCreate(drawType) {
+        this.drawType = drawType;
+        var $this = this;
+        this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
+        this.handler.setInputAction(function (evt) { //单机开始绘制
+            //屏幕坐标转地形上坐标
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            if ($this.positions.length == 0) {
+                $this.positions.push(cartesian.clone());
+                $this.identificationPoint = $this.createPoint(cartesian);
+                $this.createPoint(cartesian);// 绘制点
+                $this.positions.push(cartesian);
+            }
+            // if ($this.positions.length == 2) {
+            //     $this.positions.push(cartesian);
+            // }
+            
+        }, $this.Cesium.ScreenSpaceEventType.LEFT_CLICK);
+        this.handler.setInputAction(function (evt) { //移动时绘制线
+            if ($this.positions.length < 2) return;
+            var cartesian = $this.getCatesian3FromPX(evt.endPosition);
+            if (!$this.Cesium.defined($this.CurveFlag)) {
+                $this.CurveFlag = $this.createCurveFlag();
+            }
+            $this.identificationPoint.position.setValue(cartesian);
+            if ($this.CurveFlag) {
+                $this.positions.pop();
+                $this.positions.push(cartesian);
+            }
+        }, $this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+        this.handler.setInputAction(function (evt) {
+            if (!$this.CurveFlag) return;
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            $this.positions.pop();
+            $this.positions.push(cartesian);
+            $this.createPoint(cartesian);// 绘制点
+            $this.CurveFlagData = $this.positions.concat();
+            $this.viewer.entities.remove($this.CurveFlag); //移除
+            $this.CurveFlag = null;
+            $this.positions = [];
+            $this.identificationPoint.position.setValue(cartesian);
+            var lnglatArr = [];
+            for (var i = 0; i < $this.CurveFlagData.length; i++) {
+                var lnglat = $this.cartesianToLatlng($this.CurveFlagData[i]);
+                lnglatArr.push(lnglat)
+            }
+            $this.CurveFlagData = lnglatArr;
+            var CurveFlag = $this.addload([$this.CurveFlagData[0],$this.CurveFlagData[$this.CurveFlagData.length -1 ]]); //加载
+            $this.entitiesCurveFlag.push(CurveFlag);
+            $this.CurveFlagLast = CurveFlag;
+            $this.clearPoint();
+            $this.destroy()
+        }, $this.Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+    }
+ 
+    //创建点
+    createPoint(cartesian) {
+        var $this = this;
+        var point = this.viewer.entities.add({
+            position: cartesian,
+            point: {
+                pixelSize: 10,
+                color: $this.Cesium.Color.RED,
+                heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+            }
+        });
+        $this.entitiesPoint.push(point);
+        return point;
+    }
+ 
+    //创建曲线旗标
+    createCurveFlag() {
+        var $this = this;
+        var polygon = this.viewer.entities.add({
+            polygon: {
+                hierarchy: new $this.Cesium.CallbackProperty(function () {
+                    if($this.positions.length < 2) return 
+                    let lonlat = [];
+                    let components = [];
+                    let length = $this.positions.length
+                    for (let i=0; i<length; i++){
+                        lonlat.push($this.cartesianToLatlng($this.positions[i]))
+                    }
+                    // 取第一个
+                    let startPoint = lonlat[0]
+                    // 取最后一个
+                    let endPoint =lonlat[lonlat.length - 1]
+                    // 上曲线起始点
+                    let point1 = startPoint
+                    // 上曲线第一控制点
+                    let point2 = [(endPoint[0] - startPoint[0]) / 4 + startPoint[0], (endPoint[1] - startPoint[1]) / 8 + startPoint[1]]
+                    // 上曲线第二个点
+                    let point3 = [(startPoint[0] + endPoint[0]) / 2, startPoint[1]]
+                    // 上曲线第二控制点
+                    let point4 = [(endPoint[0] - startPoint[0]) * 3 / 4 + startPoint[0], -(endPoint[1] - startPoint[1]) / 8 + startPoint[1]]
+                    // 上曲线结束点
+                    let point5 = [endPoint[0], startPoint[1]]
+                    // 下曲线结束点
+                    let point6 = [endPoint[0], (startPoint[1] + endPoint[1]) / 2]
+                    // 下曲线第二控制点
+                    let point7 = [(endPoint[0] - startPoint[0]) * 3 / 4 + startPoint[0], (endPoint[1] - startPoint[1]) * 3 / 8 + startPoint[1]]
+                    // 下曲线第二个点
+                    let point8 = [(startPoint[0] + endPoint[0]) / 2, (startPoint[1] + endPoint[1]) / 2]
+                    // 下曲线第一控制点
+                    let point9 = [(endPoint[0] - startPoint[0]) / 4 + startPoint[0], (endPoint[1] - startPoint[1]) * 5 / 8 + startPoint[1]]
+                    // 下曲线起始点
+                    let point10 = [startPoint[0], (startPoint[1] + endPoint[1]) / 2]
+                    // 旗杆底部点
+                    let point11 = [startPoint[0], endPoint[1]]
+                    // 计算上曲线
+                    let curve1 = $this.getBezierPoints([point1, point2, point3, point4, point5])
+                    // 计算下曲线
+                    let curve2 = $this.getBezierPoints([point6, point7, point8, point9, point10])
+                    // 合并
+                    components = curve1.concat(curve2)
+                    // components.push(point11)
+                    // let components = $this.Cesium.Cartesian3.fromDegreesArray([...point0, ...point1, ...point2, ...point0])
+                    
+                    return new $this.Cesium.PolygonHierarchy(components);
+                }, false),
+                extrudedHeight: 1,
+                material: $this.Cesium.Color.RED,
+            },
+            polyline: {
+                //使用cesium的peoperty
+                positions: new $this.Cesium.CallbackProperty(function () {
+                    if($this.positions.length < 2) return 
+                    let lonlat = [];
+                    let components = [];
+                    let length = $this.positions.length
+                    for (let i=0; i<length; i++){
+                        lonlat.push($this.cartesianToLatlng($this.positions[i]))
+                    }
+                    // 取第一个
+                    let startPoint = lonlat[0]
+                    // 取最后一个
+                    let endPoint =lonlat[lonlat.length - 1]
+                    // 上曲线起始点
+                    let point1 = startPoint
+                    // 上曲线第一控制点
+                    let point2 = [(endPoint[0] - startPoint[0]) / 4 + startPoint[0], (endPoint[1] - startPoint[1]) / 8 + startPoint[1]]
+                    // 上曲线第二个点
+                    let point3 = [(startPoint[0] + endPoint[0]) / 2, startPoint[1]]
+                    // 上曲线第二控制点
+                    let point4 = [(endPoint[0] - startPoint[0]) * 3 / 4 + startPoint[0], -(endPoint[1] - startPoint[1]) / 8 + startPoint[1]]
+                    // 上曲线结束点
+                    let point5 = [endPoint[0], startPoint[1]]
+                    // 下曲线结束点
+                    let point6 = [endPoint[0], (startPoint[1] + endPoint[1]) / 2]
+                    // 下曲线第二控制点
+                    let point7 = [(endPoint[0] - startPoint[0]) * 3 / 4 + startPoint[0], (endPoint[1] - startPoint[1]) * 3 / 8 + startPoint[1]]
+                    // 下曲线第二个点
+                    let point8 = [(startPoint[0] + endPoint[0]) / 2, (startPoint[1] + endPoint[1]) / 2]
+                    // 下曲线第一控制点
+                    let point9 = [(endPoint[0] - startPoint[0]) / 4 + startPoint[0], (endPoint[1] - startPoint[1]) * 5 / 8 + startPoint[1]]
+                    // 下曲线起始点
+                    let point10 = [startPoint[0], (startPoint[1] + endPoint[1]) / 2]
+                    // 旗杆底部点
+                    let point11 = [startPoint[0], endPoint[1]]
+                    // 计算上曲线
+                    let curve1 = $this.getBezierPoints([point1, point2, point3, point4, point5])
+                    // 计算下曲线
+                    let curve2 = $this.getBezierPoints([point6, point7, point8, point9, point10])
+                    // 合并
+                    components = curve1.concat(curve2)
+                    components.push($this.LatlngTocartesian(point1))
+                    components.push($this.LatlngTocartesian(point11))
+                    
+                    return components
+                }, false),
+                show: true,
+                material: $this.Cesium.Color.YELLOW,
+                width: 5,
+                clampToGround: true
+            }
+        });
+        $this.entitiesCurveFlag.push(polygon);
+        return polygon;
+    }
+
+    cartesianToLatlng(cartesian) {
+        var latlng = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+        var lat = this.Cesium.Math.toDegrees(latlng.latitude);
+        var lng = this.Cesium.Math.toDegrees(latlng.longitude);
+        return [lng, lat];
+    }
+
+    LatlngTocartesian(latlng) {
+        let cartesian3 = this.Cesium.Cartesian3.fromDegrees(latlng[0], latlng[1]);
+        return cartesian3
+    }
+
+    clearPoint() {
+        this.DrawEndEvent.raiseEvent(this.CurveFlagLast, [this.CurveFlagData[0],this.CurveFlagData[this.CurveFlagData.length -1 ]], this.drawType);
+        for (var i = 0; i < this.entitiesPoint.length; i++) {
+            this.viewer.entities.remove(this.entitiesPoint[i]);
+        }
+        this.entitiesPoint = [];  //脏数据
+    }
+ 
+    //销毁
+    destroy() {
+        if (this.handler) {
+            this.handler.destroy();
+            this.handler = null;
+        }
+    }
+ 
+    //清空实体对象
+    clear() {
+        for (var i = 0; i < this.entitiesPoint.length; i++) {
+            this.viewer.entities.remove(this.entitiesPoint[i]);
+        }
+        for (var i = 0; i < this.entitiesCurveFlag.length; i++) {
+            this.viewer.entities.remove(this.entitiesCurveFlag[i]);
+        }
+        this.identificationPoint = null; //标识点位
+        this.CurveFlag = null; 
+        this.CurveFlagLast = null; // 曲线旗标数据
+        this.positions = [];  // 经纬度
+        this.entitiesPoint = [];   // 实体点位
+        this.entitiesCurveFlag = [];  
+        this.CurveFlagData = null; 
+    }
+ 
+    getCatesian3FromPX(px) {
+        var cartesian;
+        var ray = this.viewer.camera.getPickRay(px);
+        if (!ray) return null;
+        cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+        return cartesian;
+    }
+
+    // 贝塞尔曲线
+    getBezierPoints (points) {
+        let $this = this
+        if (points.length <= 2) {
+          return points
+        } else {
+          let bezierPoints = []
+          let n = points.length - 1
+          for (let t = 0; t <= 1; t += 0.01) {
+            let [x, y] = [0, 0]
+            for (let index = 0; index <= n; index++) {
+              let factor = $this.getBinomialFactor(n, index)
+              let a = Math.pow(t, index)
+              let b = Math.pow((1 - t), (n - index))
+              x += factor * a * b * points[index][0]
+              y += factor * a * b * points[index][1]
+            }
+            bezierPoints.push($this.LatlngTocartesian([x, y]))
+          }
+          bezierPoints.push($this.LatlngTocartesian(points[n]))
+          return bezierPoints
+        }
+    }
+
+
+        /**
+     * 获取二项分布
+     * @param n
+     * @param index
+     * @returns {number}
+     */
+    getBinomialFactor(n, index) {
+        return (this.getFactorial(n) / (this.getFactorial(index) * this.getFactorial(n - index)))
+    }
+
+    /**
+    * 获取阶乘数据
+    * @param n
+    * @returns {number}
+    */
+    getFactorial (n) {
+        let result = 1
+        switch (n) {
+        case (n <= 1):
+            result = 1
+            break
+        case (n === 2):
+            result = 2
+            break
+        case (n === 3):
+            result = 6
+            break
+        case (n === 24):
+            result = 24
+            break
+        case (n === 5):
+            result = 120
+            break
+        default:
+            for (let i = 1; i <= n; i++) {
+            result *= i
+            }
+            break
+        }
+        return result
+    }
+}
+ 
+export default DrawCurveFlag
+

+ 609 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawGatheringPlace.js

@@ -0,0 +1,609 @@
+import {
+	createTooltip
+} from "../../../common/common.js";
+
+import {
+	isRuntimeApp,
+	isRuntimeWeb,
+	createOperationMainDom,
+	showTooltipMessage
+} from "../../../common/RuntimeEnvironment.js";
+
+/*
+九、绘制集结地
+ */
+class DrawGatheringPlace {
+	constructor(arg) {
+		this.viewer = arg.viewer;
+		this.Cesium = arg.Cesium;
+		this.tt = 0.4;
+		this.floatingPoint = null; //标识点
+		this.drawHandler = null; //画事件
+		this.gatheringPlace = null; //集结地
+		this._gatheringPlaceLast = null; //最后一个箭头
+		this._positions = []; //活动点
+		this._entities_point = []; //脏数据
+		this._entities_PincerArrow = []; //脏数据
+		this._gatheringPlaceData = null; //用于构造集结地
+		this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+		this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+
+		this._tooltip = createTooltip(this.viewer.container);
+
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+	}
+
+	//返回箭头
+	get PincerArrow() {
+		return this._gatheringPlaceLast;
+	}
+
+	//返回箭头数据用于加载箭头
+	getData() {
+		return this._gatheringPlaceData;
+	}
+
+	// 修改编辑调用计算
+	computePosition(data) {
+		var $this = this;
+		if (data.length < 3) {
+			return;
+		}
+		var gatheringPlace = [];
+		var lonLats = [];
+		var res = $this.fineGatheringPlace(data);
+		for (var i = 0; i < res.length; i++) {
+			var cart3 = new $this.Cesium.Cartesian3(res[i].x, res[i].y, res[i].z);
+			gatheringPlace.push(cart3);
+		}
+		for (let q = 0; q < data.length; q++) {
+			lonLats.push($this.cartesianToLatlng(data[q]));
+		}
+		this._gatheringPlaceData = lonLats;
+		return new $this.Cesium.PolygonHierarchy(gatheringPlace);
+	}
+
+	//加载箭头
+	addload(data) {
+		var $this = this;
+		if (data.length < 3) {
+			return;
+		}
+		var gatheringPlace = [];
+		var lnglatArr = [];
+		for (var i = 0; i < data.length; i++) {
+			var lnglat = $this.LatlngTocartesian(data[i]);
+			lnglatArr.push(lnglat)
+		}
+		var res = $this.fineGatheringPlace(lnglatArr);
+		for (var i = 0; i < res.length; i++) {
+			var cart3 = new $this.Cesium.Cartesian3(res[i].x, res[i].y, res[i].z);
+			gatheringPlace.push(cart3);
+		}
+		var pHierarchy = new $this.Cesium.PolygonHierarchy(gatheringPlace);
+		var arrowEntity = $this.viewer.entities.add({
+			Type: 'DrawGatheringPlace',
+			Position: data,
+			id: data.id || $this.objId,
+			polygon: {
+				hierarchy: pHierarchy,
+				show: true,
+				fill: true,
+				clampToGround: true,
+				material: $this.polygonMaterial
+			}
+		})
+		return arrowEntity
+	}
+
+
+	// 开始创建
+	startCreate(drawType) {
+		if (isRuntimeApp()) {
+			showTooltipMessage("点击开始绘制");
+		}
+
+		var $this = this;
+
+		this.drawType = drawType
+		this.handler = new $this.Cesium.ScreenSpaceEventHandler($this.viewer.scene.canvas);
+		//单击开始绘制
+		this.handler.setInputAction(function(event) {
+			if (isRuntimeApp()) {
+				//屏幕坐标转地形上坐标
+				var cartesian = $this.getCatesian3FromPX(event.position);
+				if (!cartesian) {
+					return;
+				}
+
+				$this.createPoint(cartesian); // 绘制点
+				$this._positions.push(cartesian);
+
+				if ($this._positions.length < 3) {
+					showTooltipMessage("点击添加点");
+				}
+
+				if ($this._positions.length === 3) {
+					showTooltipMessage("点击完成按钮,结束绘制");
+					$this.destroy();
+					if (!$this.Cesium.defined($this.gatheringPlace)) {
+						$this.gatheringPlace = $this.createGatheringPlace();
+
+						//创建按钮
+						createOperationMainDom();
+						//完成绘制
+						document.getElementById("btnDrawComplete").onclick = () => {
+
+							$this._gatheringPlaceData = $this._positions.concat();
+							$this.viewer.entities.remove($this.gatheringPlace); //移除
+							$this.gatheringPlace = null;
+							var lnglatArr = [];
+							for (var i = 0; i < $this._gatheringPlaceData.length; i++) {
+								var lnglat = $this.cartesianToLatlng($this._gatheringPlaceData[i]);
+								lnglatArr.push(lnglat)
+							}
+							$this._gatheringPlaceData = lnglatArr;
+							var pincerArrow = $this.addload(lnglatArr); //加载
+							$this._entities_PincerArrow.push(pincerArrow);
+							$this._gatheringPlaceLast = pincerArrow;
+							$this.viewer.entities.remove($this.floatingPoint);
+							$this.floatingPoint = null;
+
+							//删除关键点
+							$this.clearPoint();
+							$this.destroy();
+
+							let buttonDiv = document.getElementById("drawButtonDiv");
+							if (buttonDiv) {
+								//从页面移除
+								document.body.removeChild(buttonDiv);
+							}
+						}
+					}
+				}
+			} else {
+
+				console.log('监听鼠标事件', '单击')
+
+				/* 锁定点击事件 以免和双击事件冲突 */
+				clearTimeout($this._timer);
+				$this._timer = setTimeout(function() {
+					//屏幕坐标转世界坐标
+					var position = event.position;
+					if (!$this.Cesium.defined(position)) {
+						return;
+					}
+					var ray = $this.viewer.camera.getPickRay(position);
+					if (!$this.Cesium.defined(ray)) {
+						return;
+					}
+					var cartesian = $this.viewer.scene.globe.pick(ray, $this.viewer.scene);
+					if (!$this.Cesium.defined(cartesian)) {
+						return;
+					}
+
+					if ($this._positions.length == 0) {
+						$this._positions.push(cartesian.clone());
+						$this.floatingPoint = $this.createPoint(cartesian);
+					}
+
+					if ($this._positions.length <= 2) {
+						$this.createPoint(cartesian); // 绘制点
+						$this._positions.push(cartesian);
+					}
+
+				}, 200);
+			}
+		}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+		//移动时绘制面
+		this.handler.setInputAction(function(event) {
+			//console.log("_positions",_positions);
+
+			/* 如果运行环境是App 则禁止使用鼠标移动事件 */
+			if (isRuntimeApp()) return;
+
+			if ($this._positions.length == 0) {
+				$this._tooltip.showAt(event.endPosition, "点击开始绘制");
+			} else {
+				$this._tooltip.showAt(event.endPosition, "点击添加点");
+			}
+
+			if ($this._positions.length < 2) {
+				return;
+			}
+
+			if ($this._positions.length == 3) {
+				$this._tooltip.showAt(event.endPosition, "双击结束绘制");
+			}
+
+
+			//屏幕坐标转世界坐标
+			var position = event.endPosition;
+			if (!$this.Cesium.defined(position)) {
+				return;
+			}
+			var ray = $this.viewer.camera.getPickRay(position);
+			if (!$this.Cesium.defined(ray)) {
+				return;
+			}
+			var cartesian = $this.viewer.scene.globe.pick(ray, $this.viewer.scene);
+			if (!$this.Cesium.defined(cartesian)) {
+				return;
+			}
+			//console.log("点击地图移动采集的点:",cartesian);
+			if (!$this.Cesium.defined($this.gatheringPlace)) {
+				$this.gatheringPlace = $this.createGatheringPlace();
+			}
+			$this.floatingPoint.position.setValue(cartesian);
+			if ($this.gatheringPlace) {
+				//替换最后一个点
+				// _positions.pop();
+				// _positions.push(cartesian);
+				//替换中间点
+				if ($this._positions.length == 3) {
+					$this._positions[1] = cartesian;
+				} else {
+					$this._positions.pop();
+					$this._positions.push(cartesian);
+				}
+
+			}
+		}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+		//右击停止采集改为双击结束
+		this.handler.setInputAction(function(movement) {
+			// if ($this._positions.length >= 3) {
+			// 	$this._gatheringPlaceData = $this._positions.concat();
+			// 	$this.viewer.entities.remove($this.gatheringPlace); //移除
+			// 	$this.gatheringPlace = null;
+			// 	var lnglatArr = [];
+			// 	for (var i = 0; i < $this._gatheringPlaceData.length; i++) {
+			// 		var lnglat = $this.cartesianToLatlng($this._gatheringPlaceData[i]);
+			// 		lnglatArr.push(lnglat)
+			// 	}
+			// 	$this._gatheringPlaceData = lnglatArr;
+			// 	var pincerArrow = $this.addload(lnglatArr); //加载
+			// 	$this._entities_PincerArrow.push(pincerArrow);
+			// 	$this._gatheringPlaceLast = pincerArrow;
+			// 	$this.viewer.entities.remove($this.floatingPoint);
+			// 	$this.floatingPoint = null;
+
+			// 	//删除关键点
+			// 	$this.clearPoint();
+			// 	$this.destroy()
+			// }
+		}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+		//双击结束
+		this.handler.setInputAction(function(movement) {
+
+			/* 如果运行环境是App 则禁止使用鼠标双击事件 */
+			if (isRuntimeApp()) return;
+
+			console.log('监听鼠标事件', '双击')
+
+			/* 解除锁定 */
+			clearTimeout($this._timer);
+
+			if ($this._positions.length >= 3) {
+				$this._gatheringPlaceData = $this._positions.concat();
+				$this.viewer.entities.remove($this.gatheringPlace); //移除
+				$this.gatheringPlace = null;
+				var lnglatArr = [];
+				for (var i = 0; i < $this._gatheringPlaceData.length; i++) {
+					var lnglat = $this.cartesianToLatlng($this._gatheringPlaceData[i]);
+					lnglatArr.push(lnglat)
+				}
+				$this._gatheringPlaceData = lnglatArr;
+				var pincerArrow = $this.addload(lnglatArr); //加载
+				$this._entities_PincerArrow.push(pincerArrow);
+				$this._gatheringPlaceLast = pincerArrow;
+				$this.viewer.entities.remove($this.floatingPoint);
+				$this.floatingPoint = null;
+
+				//删除关键点
+				$this.clearPoint();
+				$this.destroy();
+
+				$this._tooltip.setVisible(false);
+			}
+		}, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
+	}
+
+	//创建集结地
+	createGatheringPlace() {
+		let $this = this
+		var gatheringPlaceEntity = $this.viewer.entities.add({
+			polygon: {
+				hierarchy: new $this.Cesium.CallbackProperty(function() {
+					if ($this._positions.length < 3) {
+						return;
+					}
+					var gatheringPlace = [];
+					var res = $this.fineGatheringPlace($this._positions);
+					for (var i = 0; i < res.length; i++) {
+						var cart3 = new $this.Cesium.Cartesian3(res[i].x, res[i].y, res[i].z);
+						gatheringPlace.push(cart3);
+					}
+					var pHierarchy = new $this.Cesium.PolygonHierarchy(gatheringPlace);
+					var lonLats = $this.cartesianToLatlng($this._positions);
+					pHierarchy.keyPoints = lonLats;
+					return pHierarchy
+				}, false),
+				show: true,
+				fill: true,
+				clampToGround: true,
+				material: $this.polygonMaterial
+			}
+		})
+		//$this._entities_gatheringPlace.push(gatheringPlaceEntity);
+		// gatheringPlaceEntity.valueFlag = "value";
+		$this._entities_PincerArrow.push(gatheringPlaceEntity);
+		return gatheringPlaceEntity
+	}
+
+	//创建点
+	createPoint(cartesian) {
+		var $this = this;
+		var point = this.viewer.entities.add({
+			position: cartesian,
+			point: {
+				pixelSize: 10,
+				color: $this.Cesium.Color.RED,
+				heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+			}
+		});
+		$this._entities_point.push(point);
+		return point;
+	}
+
+	cartesianToLatlng(cartesian) {
+		let cartographic = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+		let lat = this.Cesium.Math.toDegrees(cartographic.latitude);
+		let lng = this.Cesium.Math.toDegrees(cartographic.longitude);
+		let alt = cartographic.height;
+		return [lng, lat, alt];
+	}
+
+	//销毁
+	destroy() {
+		if (this.handler) {
+			this.handler.destroy();
+			this.handler = null;
+		}
+	}
+
+	clearPoint() {
+		this.DrawEndEvent.raiseEvent(this._gatheringPlaceLast, this._gatheringPlaceData, this.drawType);
+		for (var i = 0; i < this._entities_point.length; i++) {
+			this.viewer.entities.remove(this._entities_point[i]);
+		}
+		this._entities_point = []; //脏数据
+	}
+
+	//清空实体对象
+	clear() {
+		for (var i = 0; i < this._entities_point.length; i++) {
+			this.viewer.entities.remove(this._entities_point[i]);
+		}
+		for (var i = 0; i < this._entities_PincerArrow.length; i++) {
+			this.viewer.entities.remove(this._entities_PincerArrow[i]);
+		}
+
+		this.floatingPoint = null; //标识点
+		this._PincerArrow = null; //活动箭头
+		this._PincerArrowLast = null; //最后一个箭头
+		this._positions = []; //活动点
+		this._entities_point = []; //脏数据
+		this._entities_PincerArrow = []; //脏数据
+		this._PincerArrowData = null; //用于构造箭头数据
+	}
+
+	getCatesian3FromPX(px) {
+		var cartesian;
+		var ray = this.viewer.camera.getPickRay(px);
+		if (!ray) return null;
+		cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+		return cartesian;
+	}
+
+	_computeTempPositions() {
+		var _this = this;
+
+		var pnts = [].concat(_this._positions);
+		var num = pnts.length;
+		var first = pnts[0];
+		var last = pnts[num - 1];
+		if (_this._isSimpleXYZ(first, last) == false) {
+			pnts.push(first);
+			num += 1;
+		}
+		_this.tempPositions = [];
+		for (var i = 1; i < num; i++) {
+			var p1 = pnts[i - 1];
+			var p2 = pnts[i];
+			var cp = _this._computeCenterPotition(p1, p2);
+			_this.tempPositions.push(p1);
+			_this.tempPositions.push(cp);
+		}
+	}
+
+	_isSimpleXYZ(p1, p2) {
+		if (p1.x == p2.x && p1.y == p2.y && p1.z == p2.z) {
+			return true;
+		}
+		return false;
+	}
+
+	_computeCenterPotition(p1, p2) {
+		var _this = this;
+		var c1 = _this.viewer.scene.globe.ellipsoid.cartesianToCartographic(p1);
+		var c2 = _this.viewer.scene.globe.ellipsoid.cartesianToCartographic(p2);
+		var cm = new _this.Cesium.EllipsoidGeodesic(c1, c2).interpolateUsingFraction(0.5);
+		var cp = _this.viewer.scene.globe.ellipsoid.cartographicToCartesian(cm);
+		return cp;
+	}
+	/**
+	 * 笛卡尔坐标转经纬度坐标
+	 */
+	getLonLat(cartesian) {
+		var cartographic = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+		cartographic.height = this.viewer.scene.globe.getHeight(cartographic);
+		var pos = {
+			lon: cartographic.longitude,
+			lat: cartographic.latitude,
+			alt: cartographic.height
+		};
+		pos.lon = this.Cesium.Math.toDegrees(pos.lon);
+		pos.lat = this.Cesium.Math.toDegrees(pos.lat);
+		return pos;
+	}
+
+	LatlngTocartesian(latlng) {
+		let cartesian3 = this.Cesium.Cartesian3.fromDegrees(latlng[0], latlng[1]);
+		return cartesian3
+	}
+
+	////////////////////////////////////////集结地/////////////////////////////////////////////////////
+	fineGatheringPlace(gatherPosition) {
+		let $this = this
+		let points = gatherPosition.length;
+		if (points < 2) {
+			return false
+		} else {
+			let pnts = new Array();
+			gatherPosition.forEach(function(item) {
+				var posLonLat = $this.getLonLat(item);
+				pnts.push([posLonLat.lon, posLonLat.lat]);
+			});
+			//console.log("pnts6666",pnts);
+			// pnts.push(tailPoint);
+			// pnts.push(headerPoint);
+
+			if (pnts.length === 2) {
+				let mid = $this.mid(pnts[0], pnts[1])
+				//let d = utils.MathDistance(pnts[0], mid) / 0.9
+				let d = $this.distance(pnts[0], mid) / 0.9
+				//console.log("d",d);
+				let pnt = $this.getThirdPoint(pnts[0], mid, Math.PI / 2, d, true)
+				pnts = [pnts[0], pnt, pnts[1]];
+				//console.log("pnt",pnt);
+				//createPoint(Cesium.Cartesian3.fromDegrees(pnt[0], pnt[1]));
+			}
+			let mid = $this.mid(pnts[0], pnts[2])
+			pnts.push(mid, pnts[0], pnts[1])
+			//console.log("3333");
+
+			let [normals, pnt1, pnt2, pnt3, pList] = [
+				[], undefined, undefined, undefined, []
+			]
+			for (let i = 0; i < pnts.length - 2; i++) {
+				pnt1 = pnts[i]
+				pnt2 = pnts[i + 1]
+				pnt3 = pnts[i + 2]
+				let normalPoints = $this.getBisectorNormals($this.tt, pnt1, pnt2, pnt3)
+				normals = normals.concat(normalPoints)
+			}
+			let count = normals.length
+			normals = [normals[count - 1]].concat(normals.slice(0, count - 1))
+			for (let i = 0; i < pnts.length - 2; i++) {
+				pnt1 = pnts[i]
+				pnt2 = pnts[i + 1]
+				pList = pList.concat(pnt1)
+				for (let t = 0; t <= 100; t++) {
+					let pnt = $this.getCubicValue(t / 100, pnt1, normals[i * 2], normals[i * 2 + 1], pnt2)
+					pList = pList.concat(pnt)
+				}
+				pList = pList.concat(pnt2)
+			}
+			return Cesium.Cartesian3.fromDegreesArray(pList);
+		}
+	}
+
+	mid(t, o) {
+		return [(t[0] + o[0]) / 2, (t[1] + o[1]) / 2]
+	}
+
+	distance(t, o) {
+		return Math.sqrt(Math.pow(t[0] - o[0], 2) + Math.pow(t[1] - o[1], 2))
+	}
+
+	getThirdPoint(t, o, e, r, n) {
+		var g = this.getAzimuth(t, o),
+			i = n ? g + e : g - e,
+			s = r * Math.cos(i),
+			a = r * Math.sin(i);
+		return [o[0] + s, o[1] + a]
+	}
+
+	getAzimuth(t, o) {
+		var e, r = Math.asin(Math.abs(o[1] - t[1]) / this.distance(t, o));
+		return o[1] >= t[1] && o[0] >= t[0] ? e = r + Math.PI : o[1] >= t[1] && o[0] < t[0] ? e = 2 * Math.PI - r : o[1] < t[1] && o[0] < t[0] ? e = r : o[1] < t[1] && o[0] >= t[0] && (e = Math.PI - r), e
+	}
+
+	getBisectorNormals(t, o, e, r) {
+		var n = this.getNormal(o, e, r),
+			g = Math.sqrt(n[0] * n[0] + n[1] * n[1]),
+			i = n[0] / g,
+			s = n[1] / g,
+			a = this.distance(o, e),
+			l = this.distance(e, r);
+		if (g > 1e-4)
+			if (this.isClockWise(o, e, r)) {
+				var u = t * a,
+					c = e[0] - u * s,
+					p = e[1] + u * i,
+					h = [c, p];
+				u = t * l, c = e[0] + u * s, p = e[1] - u * i;
+				var d = [c, p]
+			} else u = t * a, c = e[0] + u * s, p = e[1] - u * i, h = [c, p], u = t * l, c = e[0] - u * s, p = e[1] + u * i, d = [c, p];
+		else c = e[0] + t * (o[0] - e[0]), p = e[1] + t * (o[1] - e[1]), h = [c, p], c = e[0] + t * (r[0] - e[0]), p = e[1] + t * (r[1] - e[1]), d = [c, p];
+		return [h, d]
+	}
+
+	getNormal(t, o, e) {
+		var r = t[0] - o[0],
+			n = t[1] - o[1],
+			g = Math.sqrt(r * r + n * n);
+		r /= g, n /= g;
+		var i = e[0] - o[0],
+			s = e[1] - o[1],
+			a = Math.sqrt(i * i + s * s);
+		i /= a, s /= a;
+		var l = r + i,
+			u = n + s;
+		return [l, u]
+	}
+
+	isClockWise(t, o, e) {
+		return (e[1] - t[1]) * (o[0] - t[0]) > (o[1] - t[1]) * (e[0] - t[0])
+	}
+
+	getCubicValue(t, o, e, r, n) {
+		t = Math.max(Math.min(t, 1), 0);
+		var g = 1 - t,
+			i = t * t,
+			s = i * t,
+			a = g * g,
+			l = a * g,
+			u = l * o[0] + 3 * a * t * e[0] + 3 * g * i * r[0] + s * n[0],
+			c = l * o[1] + 3 * a * t * e[1] + 3 * g * i * r[1] + s * n[1];
+		return [u, c]
+	}
+
+}
+
+export default DrawGatheringPlace

+ 536 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawLune.js

@@ -0,0 +1,536 @@
+// DrawLune
+/*
+九、绘制弓形
+ */
+class DrawLune {
+    constructor(arg) {
+        this.viewer = arg.viewer;
+        this.Cesium = arg.Cesium;
+        this.tt = 0.4;
+        this.floatingPoint = null;//标识点
+        this.drawHandler = null;//画事件
+        this.DrawLune = null;//弓形
+        this._DrawLuneLast = null; //最后一个弓形
+        this._positions = [];//活动点
+        this._entities_point = [];//脏数据
+        this._entities_PincerArrow = [];//脏数据
+        this._DrawLuneData = null; //用于构造弓形
+        this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+        this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+		
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+		
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+    }
+
+    //返回弓形
+    get PincerArrow() {
+        return this._DrawLuneLast;
+    }
+
+    //返回弓形数据用于加载弓形
+    getData() {
+        return this._DrawLuneData;
+    }
+
+    // 修改编辑调用计算
+    computePosition(data) {
+        var $this = this;
+        if (data.length < 3) {
+            return;
+        }
+        var DrawLune = [];
+        let positions = [];
+        for (var i = 0; i < data.length; i++) {
+            positions.push($this.cartesianToLatlng(data[i]));
+            var cart3 =$this.lonLatToMercator($this.cartesianToLatlng(data[i]));
+            DrawLune.push(cart3);
+        }
+        let [pnt1, pnt2, pnt3, startAngle, endAngle] = [DrawLune[0], DrawLune[2], DrawLune[1], null, null];
+        let center = $this.getCircleCenterOfThreePoints(pnt1, pnt2, pnt3)
+        let radius = $this.MathDistance(pnt1, center)
+        let angle1 = $this.getAzimuth(pnt1, center)
+        let angle2 = $this.getAzimuth(pnt2, center)
+        if ($this.isClockWise(pnt1, pnt2, pnt3)) {
+            startAngle = angle2
+            endAngle = angle1
+            } else {
+            startAngle = angle1
+            endAngle = angle2
+        }
+        let getArcPoint = $this.getArcPoints(center, radius, startAngle, endAngle);
+        let pHierarchy = [];
+        for (var l = 0; l < getArcPoint.length; l++) {
+            var cart3 =$this.LatlngTocartesian($this.WebMercator2lonLat(getArcPoint[l]));
+            pHierarchy.push(cart3);
+        }
+        pHierarchy.push(pHierarchy[0])
+        $this._DrawLuneData = positions
+        return new $this.Cesium.PolygonHierarchy(pHierarchy)
+    }
+
+    //加载
+    addload(data) {
+        var $this = this;
+        if (data.length < 3) {
+            return;
+        }
+        var DrawLune = [];
+        for (var i = 0; i < data.length; i++) {
+            var cart3 =$this.lonLatToMercator(data[i]);
+            DrawLune.push(cart3);
+        }
+        let [pnt1, pnt2, pnt3, startAngle, endAngle] = [DrawLune[0], DrawLune[2], DrawLune[1], null, null];
+        let center = $this.getCircleCenterOfThreePoints(pnt1, pnt2, pnt3)
+        let radius = $this.MathDistance(pnt1, center)
+        let angle1 = $this.getAzimuth(pnt1, center)
+        let angle2 = $this.getAzimuth(pnt2, center)
+        if ($this.isClockWise(pnt1, pnt2, pnt3)) {
+            startAngle = angle2
+            endAngle = angle1
+          } else {
+            startAngle = angle1
+            endAngle = angle2
+        }
+        let getArcPoint = $this.getArcPoints(center, radius, startAngle, endAngle);
+        let pHierarchy = [];
+        for (var l = 0; l < getArcPoint.length; l++) {
+            var cart3 =$this.LatlngTocartesian($this.WebMercator2lonLat(getArcPoint[l]));
+            pHierarchy.push(cart3);
+        }
+        pHierarchy.push(pHierarchy[0])
+        var arrowEntity = $this.viewer.entities.add({
+            Type: 'DrawLune',
+            Position: data,
+            id: data.id || $this.objId,
+            polygon: {
+                hierarchy: new $this.Cesium.PolygonHierarchy(pHierarchy),
+                show: true,
+                material: $this.Cesium.Color.YELLOW,
+                width: 3,
+                clampToGround: true,
+                outlineWidth:3,
+                outline: true,
+                outlineColor: Cesium.Color.MAGENTA,
+            }
+        }
+        )
+        return arrowEntity
+    }
+
+
+    // 开始创建
+    startCreate(drawType) {
+        this.drawType = drawType
+        var $this = this;
+        this.handler = new $this.Cesium.ScreenSpaceEventHandler($this.viewer.scene.canvas);
+        this.handler.setInputAction(function (event) {
+            //屏幕坐标转世界坐标
+            var position = event.position;
+            if (!$this.Cesium.defined(position)) {
+                return;
+            }
+            var ray = $this.viewer.camera.getPickRay(position);
+            if (!$this.Cesium.defined(ray)) {
+                return;
+            }
+            var cartesian = $this.viewer.scene.globe.pick(ray, $this.viewer.scene);
+            if (!$this.Cesium.defined(cartesian)) {
+                return;
+            }
+
+            if ($this._positions.length == 0) {
+                $this._positions.push(cartesian.clone());
+                $this.floatingPoint = $this.createPoint(cartesian);
+            }
+
+            if ($this._positions.length <= 2) {
+                $this.createPoint(cartesian); // 绘制点
+                $this._positions.push(cartesian);
+            }
+        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+
+
+        this.handler.setInputAction(function (event) { //移动时绘制面
+            //console.log("_positions",_positions);
+            if ($this._positions.length < 2) {
+                return;
+            }
+
+            //屏幕坐标转世界坐标
+            var position = event.endPosition;
+            if (!$this.Cesium.defined(position)) {
+                return;
+            }
+            var ray = $this.viewer.camera.getPickRay(position);
+            if (!$this.Cesium.defined(ray)) {
+                return;
+            }
+            var cartesian = $this.viewer.scene.globe.pick(ray, $this.viewer.scene);
+            if (!$this.Cesium.defined(cartesian)) {
+                return;
+            }
+            //console.log("点击地图移动采集的点:",cartesian);
+            if (!$this.Cesium.defined($this.DrawLune)) {
+                $this.DrawLune = $this.createDrawLune();
+            }
+            $this.floatingPoint.position.setValue(cartesian);
+            if ($this.DrawLune) {
+                //替换最后一个点
+                // _positions.pop();
+                // _positions.push(cartesian);
+                //替换中间点
+                if ($this._positions.length == 3) {
+                    $this._positions[1] = cartesian;
+                } else {
+                    $this._positions.pop();
+                    $this._positions.push(cartesian);
+                }
+
+            }
+        }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+
+
+        //右击停止采集
+        this.handler.setInputAction(function (movement) {
+
+            if ($this._positions.length >= 3) {
+                $this._DrawLuneData = $this._positions.concat();
+                $this.viewer.entities.remove($this.DrawLune); //移除
+                $this.DrawLune = null;
+                var lnglatArr = [];
+                for (var i = 0; i < $this._DrawLuneData.length; i++) {
+                    var lnglat = $this.cartesianToLatlng($this._DrawLuneData[i]);
+                    lnglatArr.push(lnglat)
+                }
+                $this._DrawLuneData = lnglatArr;
+                var pincerArrow = $this.addload(lnglatArr); //加载
+                $this._entities_PincerArrow.push(pincerArrow);
+                $this._DrawLuneLast = pincerArrow;
+                $this.viewer.entities.remove($this.floatingPoint);
+                $this.floatingPoint = null;
+
+                //删除关键点
+                $this.clearPoint();
+                $this.destroy()
+            }
+        }, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+
+    }
+
+    //创建弓形
+    createDrawLune() {
+        let $this = this
+        var DrawLuneEntity = $this.viewer.entities.add({
+            polygon: {
+                hierarchy: new $this.Cesium.CallbackProperty(function () {
+                    if ($this._positions.length < 3) {
+                        return;
+                    }
+                    var DrawLune = [];
+                    for (var i = 0; i < $this._positions.length; i++) {
+                        var cart3 =$this.lonLatToMercator($this.cartesianToLatlng($this._positions[i]));
+                        DrawLune.push(cart3);
+                    }
+                    let [pnt1, pnt2, pnt3, startAngle, endAngle] = [DrawLune[0], DrawLune[2], DrawLune[1], null, null];
+                    let center = $this.getCircleCenterOfThreePoints(pnt1, pnt2, pnt3)
+                    let radius = $this.MathDistance(pnt1, center)
+                    let angle1 = $this.getAzimuth(pnt1, center)
+                    let angle2 = $this.getAzimuth(pnt2, center)
+                    if ($this.isClockWise(pnt1, pnt2, pnt3)) {
+                        startAngle = angle2
+                        endAngle = angle1
+                      } else {
+                        startAngle = angle1
+                        endAngle = angle2
+                    }
+                    let getArcPoint = $this.getArcPoints(center, radius, startAngle, endAngle);
+                    let pHierarchy = [];
+                    for (var l = 0; l < getArcPoint.length; l++) {
+                        var cart3 =$this.LatlngTocartesian($this.WebMercator2lonLat(getArcPoint[l]));
+                        pHierarchy.push(cart3);
+                    }
+                    pHierarchy.push(pHierarchy[0])
+                    return new $this.Cesium.PolygonHierarchy(pHierarchy)
+                }, false),
+                show: true,
+                material: $this.Cesium.Color.YELLOW,
+                clampToGround: true
+            }
+        }
+        )
+        $this._entities_PincerArrow.push(DrawLuneEntity);
+        return DrawLuneEntity
+    }
+
+    //创建点
+    createPoint(cartesian) {
+        var $this = this;
+        var point = this.viewer.entities.add({
+            position: cartesian,
+            point: {
+                pixelSize: 10,
+                color: $this.Cesium.Color.RED,
+                heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+            }
+        });
+        $this._entities_point.push(point);
+        return point;
+    }
+
+    cartesianToLatlng(cartesian) {
+        let cartographic = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+        let lat = this.Cesium.Math.toDegrees(cartographic.latitude);
+        let lng = this.Cesium.Math.toDegrees(cartographic.longitude);
+        let alt = cartographic.height;
+        return [lng, lat];
+    }
+
+    //销毁
+    destroy() {
+        if (this.handler) {
+            this.handler.destroy();
+            this.handler = null;
+        }
+    }
+
+    clearPoint() {
+        this.DrawEndEvent.raiseEvent(this._DrawLuneLast, this._DrawLuneData, this.drawType);
+        for (var i = 0; i < this._entities_point.length; i++) {
+            this.viewer.entities.remove(this._entities_point[i]);
+        }
+        this._entities_point = [];  //脏数据
+    }
+
+    //清空实体对象
+    clear() {
+        for (var i = 0; i < this._entities_point.length; i++) {
+            this.viewer.entities.remove(this._entities_point[i]);
+        }
+        for (var i = 0; i < this._entities_PincerArrow.length; i++) {
+            this.viewer.entities.remove(this._entities_PincerArrow[i]);
+        }
+
+        this.floatingPoint = null;//标识点
+        this._PincerArrow = null; //活动弓形
+        this._PincerArrowLast = null; //最后一个弓形
+        this._positions = [];  //活动点
+        this._entities_point = [];  //脏数据
+        this._entities_PincerArrow = [];  //脏数据
+        this._PincerArrowData = null; //用于构造弓形数据
+    }
+
+    getCatesian3FromPX(px) {
+        var cartesian;
+        var ray = this.viewer.camera.getPickRay(px);
+        if (!ray) return null;
+        cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+        return cartesian;
+    }
+
+    _computeTempPositions() {
+        var _this = this;
+
+        var pnts = [].concat(_this._positions);
+        var num = pnts.length;
+        var first = pnts[0];
+        var last = pnts[num - 1];
+        if (_this._isSimpleXYZ(first, last) == false) {
+            pnts.push(first);
+            num += 1;
+        }
+        _this.tempPositions = [];
+        for (var i = 1; i < num; i++) {
+            var p1 = pnts[i - 1];
+            var p2 = pnts[i];
+            var cp = _this._computeCenterPotition(p1, p2);
+            _this.tempPositions.push(p1);
+            _this.tempPositions.push(cp);
+        }
+    }
+
+    _isSimpleXYZ(p1, p2) {
+        if (p1.x == p2.x && p1.y == p2.y && p1.z == p2.z) {
+            return true;
+        }
+        return false;
+    }
+
+    _computeCenterPotition(p1, p2) {
+        var _this = this;
+        var c1 = _this.viewer.scene.globe.ellipsoid.cartesianToCartographic(p1);
+        var c2 = _this.viewer.scene.globe.ellipsoid.cartesianToCartographic(p2);
+        var cm = new _this.Cesium.EllipsoidGeodesic(c1, c2).interpolateUsingFraction(0.5);
+        var cp = _this.viewer.scene.globe.ellipsoid.cartographicToCartesian(cm);
+        return cp;
+    }
+    /**
+     * 笛卡尔坐标转经纬度坐标
+     */
+    getLonLat(cartesian) {
+        var cartographic = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+        cartographic.height = this.viewer.scene.globe.getHeight(cartographic);
+        var pos = {
+            lon: cartographic.longitude,
+            lat: cartographic.latitude,
+            alt: cartographic.height
+        };
+        pos.lon = this.Cesium.Math.toDegrees(pos.lon);
+        pos.lat = this.Cesium.Math.toDegrees(pos.lat);
+        return pos;
+    }
+
+    LatlngTocartesian(latlng) {
+        let cartesian3 = this.Cesium.Cartesian3.fromDegrees(latlng[0], latlng[1]);
+        return cartesian3
+    }
+
+     /**
+     * 经纬度坐标转墨卡托坐标
+     */
+    // 墨卡托坐标系:展开地球,赤道作为x轴,向东为x轴正方,本初子午线作为y轴,向北为y轴正方向。
+    // 数字20037508.34是地球赤道周长的一半:地球半径6378137米,赤道周长2*PI*r = 2 * 20037508.3427892,墨卡托坐标x轴区间[-20037508.3427892,20037508.3427892]
+    lonLatToMercator(Latlng) {
+        var E = Latlng[0];
+        var N = Latlng[1];
+        var x = E * 20037508.34 / 180;
+        var y = Math.log(Math.tan((90 + N) * Math.PI / 360)) / (Math.PI / 180);
+        y = y * 20037508.34 / 180;
+        return [x, y]
+    }
+    /**
+     * 墨卡托坐标转经纬度坐标转
+     */
+    WebMercator2lonLat(mercator) {
+        let x = mercator[0] / 20037508.34 * 180;
+        let ly = mercator[1] / 20037508.34 * 180;
+        let y = 180 / Math.PI * (2 * Math.atan(Math.exp(ly * Math.PI / 180)) - Math.PI / 2)
+        return [x, y];
+    }
+
+    ////////////////////////////////////////弓形/////////////////////////////////////////////////////
+    /**
+ * 通过三个点确定一个圆的中心点
+ * @param point1
+ * @param point2
+ * @param point3
+ */
+    getCircleCenterOfThreePoints(point1, point2, point3) {
+        let pntA = [(point1[0] + point2[0]) / 2, (point1[1] + point2[1]) / 2]
+        let pntB = [pntA[0] - point1[1] + point2[1], pntA[1] + point1[0] - point2[0]]
+        let pntC = [(point1[0] + point3[0]) / 2, (point1[1] + point3[1]) / 2]
+        let pntD = [pntC[0] - point1[1] + point3[1], pntC[1] + point1[0] - point3[0]]
+        return this.getIntersectPoint(pntA, pntB, pntC, pntD)
+    }
+
+    /**
+   * 获取交集的点
+   * @param pntA
+   * @param pntB
+   * @param pntC
+   * @param pntD
+   * @returns {[*,*]}
+   */
+    getIntersectPoint(pntA, pntB, pntC, pntD) {
+        if (pntA[1] === pntB[1]) {
+            let f = (pntD[0] - pntC[0]) / (pntD[1] - pntC[1])
+            let x = f * (pntA[1] - pntC[1]) + pntC[0]
+            let y = pntA[1]
+            return [x, y]
+        }
+        if (pntC[1] === pntD[1]) {
+            let e = (pntB[0] - pntA[0]) / (pntB[1] - pntA[1])
+            let x = e * (pntC[1] - pntA[1]) + pntA[0]
+            let y = pntC[1]
+            return [x, y]
+        }
+        let e = (pntB[0] - pntA[0]) / (pntB[1] - pntA[1])
+        let f = (pntD[0] - pntC[0]) / (pntD[1] - pntC[1])
+        let y = (e * pntA[1] - pntA[0] - f * pntC[1] + pntC[0]) / (e - f)
+        let x = e * y - e * pntA[1] + pntA[0]
+        return [x, y]
+    }
+
+
+    /**
+   * 计算两个坐标之间的距离
+   * @ignore
+   * @param pnt1
+   * @param pnt2
+   * @returns {number}
+   * @constructor
+   */
+    MathDistance(pnt1, pnt2) {
+        return (Math.sqrt(Math.pow((pnt1[0] - pnt2[0]), 2) + Math.pow((pnt1[1] - pnt2[1]), 2)))
+    }
+
+
+    /**
+   * 获取方位角(地平经度)
+   * @param startPoint
+   * @param endPoint
+   * @returns {*}
+   */
+    getAzimuth(startPoint, endPoint) {
+        let azimuth
+        let angle = Math.asin(Math.abs(endPoint[1] - startPoint[1]) / (this.MathDistance(startPoint, endPoint)))
+        if (endPoint[1] >= startPoint[1] && endPoint[0] >= startPoint[0]) {
+            azimuth = angle + Math.PI
+        } else if (endPoint[1] >= startPoint[1] && endPoint[0] < startPoint[0]) {
+            azimuth = Math.PI * 2 - angle
+        } else if (endPoint[1] < startPoint[1] && endPoint[0] < startPoint[0]) {
+            azimuth = angle
+        } else if (endPoint[1] < startPoint[1] && endPoint[0] >= startPoint[0]) {
+            azimuth = Math.PI - angle
+        }
+        return azimuth
+    }
+
+    /**
+     * 判断是否是顺时针
+     * @param pnt1
+     * @param pnt2
+     * @param pnt3
+     * @returns {boolean}
+     */
+    isClockWise (pnt1, pnt2, pnt3) {
+        return ((pnt3[1] - pnt1[1]) * (pnt2[0] - pnt1[0]) > (pnt2[1] - pnt1[1]) * (pnt3[0] - pnt1[0]))
+    }
+
+
+    /**
+   * 插值弓形线段点
+   * @param center
+   * @param radius
+   * @param startAngle
+   * @param endAngle
+   * @returns {null}
+   */
+    getArcPoints(center, radius, startAngle, endAngle) {
+        let [x, y, pnts, angleDiff] = [null, null, [], (endAngle - startAngle)]
+        angleDiff = ((angleDiff < 0) ? (angleDiff + (Math.PI * 2)) : angleDiff)
+        for (let i = 0; i <= 100; i++) {
+            let angle = startAngle + angleDiff * i / 100
+            x = center[0] + radius * Math.cos(angle)
+            y = center[1] + radius * Math.sin(angle)
+            pnts.push([x, y])
+        }
+        return pnts
+    }
+
+}
+
+export default DrawLune

+ 656 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawPincerArrow.js

@@ -0,0 +1,656 @@
+import {
+	createTooltip
+} from "../../../common/common.js";
+
+import {
+	isRuntimeApp,
+	isRuntimeWeb,
+	createOperationMainDom,
+	showTooltipMessage
+} from "../../../common/RuntimeEnvironment.js";
+
+/*
+九、绘制钳击箭头
+ */
+class DrawPincerArrow {
+	constructor(arg) {
+		this.viewer = arg.viewer;
+		this.Cesium = arg.Cesium;
+		// this.callback=arg.callback;
+		this.floatingPoint = null; //标识点
+		this._PincerArrow = null; //活动箭头
+		this._PincerArrowLast = null; //最后一个箭头
+		this._positions = []; //活动点
+		this._entities_point = []; //脏数据
+		this._entities_PincerArrow = []; //脏数据
+		this._PincerArrowData = null; //用于构造箭头数据
+		this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+		this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+
+		this._tooltip = createTooltip(this.viewer.container);
+
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+	}
+
+	//返回箭头
+	get PincerArrow() {
+		return this._PincerArrowLast;
+	}
+
+	//返回箭头数据用于加载箭头
+	getData() {
+		return this._PincerArrowData;
+	}
+
+	//加载箭头
+	addload(data) {
+		var $this = this;
+		if (data.length < 3) {
+			return;
+		}
+		//计算面
+		var res = $this.doubleArrow(data);
+		var returnData = res.polygonalPoint;
+		var arrowEntity = $this.viewer.entities.add({
+			Type: 'DrawPincerArrow',
+			Position: data,
+			id: data.id || $this.objId,
+			polygon: {
+				hierarchy: new $this.Cesium.PolygonHierarchy(returnData),
+				show: true,
+				fill: true,
+				clampToGround: true,
+				material: $this.polygonMaterial
+			}
+		})
+		return arrowEntity
+	}
+
+	// 修改编辑调用计算
+	computePosition(data) {
+		let $this = this
+		var lnglatArr = [];
+		for (var i = 0; i < data.length; i++) {
+			var lnglat = $this.cartesianToLatlng(data[i]);
+			lnglatArr.push(lnglat)
+		}
+		$this._PincerArrowData = lnglatArr;
+		var res = $this.doubleArrow(lnglatArr);
+		var returnData = res.polygonalPoint;
+		return new $this.Cesium.PolygonHierarchy(returnData)
+	}
+
+	//开始创建
+	startCreate(drawType) {
+		if (isRuntimeApp()) {
+			showTooltipMessage("点击开始绘制");
+		}
+
+		var $this = this;
+
+		this.drawType = drawType;
+		this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
+
+		//单击开始绘制
+		this.handler.setInputAction(function(evt) {
+
+			if (isRuntimeApp()) {
+				//屏幕坐标转地形上坐标
+				var cartesian = $this.getCatesian3FromPX(evt.position);
+				if (!cartesian) {
+					return;
+				}
+
+				$this.createPoint(cartesian); // 绘制点
+				$this._positions.push(cartesian);
+
+				if ($this._positions.length < 3 || $this._positions.length === 4) {
+					showTooltipMessage("点击添加点");
+				}
+
+				if ($this._positions.length === 2) {
+					if (!$this.Cesium.defined($this._PincerArrow)) {
+						$this._PincerArrow = $this.createPincerArrow();
+					}
+				}
+				if ($this._positions.length === 3) {
+					$this._positions.pop();
+					$this._positions.push(cartesian);
+
+					//创建按钮
+					createOperationMainDom();
+					showTooltipMessage("点击添加点,点击完成按钮,结束绘制");
+					//完成绘制
+					document.getElementById("btnDrawComplete").onclick = () => {
+
+
+						$this._PincerArrowData = $this._positions.concat();
+						$this.viewer.entities.remove($this._PincerArrow); //移除
+						$this._PincerArrow = null;
+						$this._positions = [];
+						var lnglatArr = [];
+						for (var i = 0; i < $this._PincerArrowData.length; i++) {
+							var lnglat = $this.cartesianToLatlng($this._PincerArrowData[i]);
+							lnglatArr.push(lnglat)
+						}
+						$this._PincerArrowData = lnglatArr;
+						var pincerArrow = $this.addload(lnglatArr); //加载
+						$this._entities_PincerArrow.push(pincerArrow);
+						$this._PincerArrowLast = pincerArrow;
+						$this.clearPoint();
+						$this.destroy();
+
+						let buttonDiv = document.getElementById("drawButtonDiv");
+						if (buttonDiv) {
+							//从页面移除
+							document.body.removeChild(buttonDiv);
+						}
+					}
+				}
+
+				if ($this._positions.length === 5) {
+					showTooltipMessage("点击完成按钮,结束绘制");
+					$this.destroy();
+				}
+
+			} else {
+				console.log('监听鼠标事件', '单击')
+
+				/* 锁定点击事件 以免和双击事件冲突 */
+				clearTimeout($this._timer);
+				$this._timer = setTimeout(function() {
+					var cartesian = $this.getCatesian3FromPX(evt.position);
+					if (!cartesian) {
+						return;
+					}
+					if ($this._positions.length == 0) {
+						$this.floatingPoint = $this.createPoint(cartesian);
+					}
+					if ($this._positions.length < 5) {
+						$this._positions.push(cartesian);
+						$this.createPoint(cartesian); // 绘制点
+					}
+					if ($this._positions.length == 5) {
+						$this._positions[4] = cartesian;
+						$this.floatingPoint.position.setValue(cartesian);
+					}
+				}, 200);
+			}
+		}, $this.Cesium.ScreenSpaceEventType.LEFT_CLICK);
+		//移动时绘制面
+		this.handler.setInputAction(function(evt) {
+
+			/* 如果运行环境是App 则禁止使用鼠标移动事件 */
+			if (isRuntimeApp()) return;
+
+			if ($this._positions.length == 0) {
+				$this._tooltip.showAt(evt.endPosition, "点击开始绘制");
+			} else {
+				$this._tooltip.showAt(evt.endPosition, "点击添加点");
+			}
+
+			var cartesian = $this.getCatesian3FromPX(evt.endPosition);
+			if (!cartesian) return;
+			if ($this._positions.length < 2) return;
+
+			if (!$this.Cesium.defined($this._PincerArrow)) {
+				if ($this._positions.length == 2) {
+					$this._positions.push(cartesian);
+				}
+				$this._PincerArrow = $this.createPincerArrow();
+			}
+			$this.floatingPoint.position.setValue(cartesian);
+			if ($this._positions.length == 3) {
+				$this._positions[2] = cartesian;
+
+				// $this._tooltip.showAt(evt.endPosition, "点击添加点,右键删除点,双击结束绘制");
+				$this._tooltip.showAt(evt.endPosition, "点击添加点,双击结束绘制");
+			}
+
+			if ($this._positions.length > 3) {
+				$this._positions.pop();
+				$this._positions.push(cartesian);
+
+				if ($this._positions === 4) {
+					$this._tooltip.showAt(evt.endPosition, "点击添加点");
+				}
+
+				if ($this._positions.length == 5) {
+					$this._tooltip.showAt(evt.endPosition, "双击结束绘制");
+				}
+			}
+
+			console.log($this._positions.length);
+		}, $this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+		//右键结束改为双击结束
+		this.handler.setInputAction(function(evt) {
+			// if (!$this._PincerArrow) {
+			// 	return
+			// } else {
+			// 	// if(typeof $this.callback=="function"){
+			// 	//     $this.callback();
+			// 	// }
+			// };
+			// var cartesian = $this.getCatesian3FromPX(evt.position);
+			// if (!cartesian) return;
+			// $this._positions.pop();
+			// $this._positions.push(cartesian);
+			// $this._PincerArrowData = $this._positions.concat();
+			// $this.viewer.entities.remove($this._PincerArrow); //移除
+			// $this._PincerArrow = null;
+			// $this._positions = [];
+			// $this.floatingPoint.position.setValue(cartesian);
+			// var lnglatArr = [];
+			// for (var i = 0; i < $this._PincerArrowData.length; i++) {
+			// 	var lnglat = $this.cartesianToLatlng($this._PincerArrowData[i]);
+			// 	lnglatArr.push(lnglat)
+			// }
+			// $this._PincerArrowData = lnglatArr;
+			// var pincerArrow = $this.addload(lnglatArr); //加载
+			// $this._entities_PincerArrow.push(pincerArrow);
+			// $this._PincerArrowLast = pincerArrow;
+			// $this.clearPoint();
+			// $this.destroy();
+		}, $this.Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+		//双击结束
+		this.handler.setInputAction(function(evt) {
+
+			/* 如果运行环境是App 则禁止使用鼠标双击事件 */
+			if (isRuntimeApp()) return;
+
+			console.log('监听鼠标事件', '双击')
+
+			/* 解除锁定 */
+			clearTimeout($this._timer);
+
+			if (!$this._PincerArrow) {
+				return
+			} else {
+				// if(typeof $this.callback=="function"){
+				//     $this.callback();
+				// }
+			};
+			var cartesian = $this.getCatesian3FromPX(evt.position);
+			if (!cartesian) return;
+
+			$this._positions.pop();
+			// $this._positions.push(cartesian);
+			$this._PincerArrowData = $this._positions.concat();
+			$this.viewer.entities.remove($this._PincerArrow); //移除
+			$this._PincerArrow = null;
+			$this._positions = [];
+			$this.floatingPoint.position.setValue(cartesian);
+			var lnglatArr = [];
+			for (var i = 0; i < $this._PincerArrowData.length; i++) {
+				var lnglat = $this.cartesianToLatlng($this._PincerArrowData[i]);
+				lnglatArr.push(lnglat)
+			}
+			$this._PincerArrowData = lnglatArr;
+			var pincerArrow = $this.addload(lnglatArr); //加载
+			$this._entities_PincerArrow.push(pincerArrow);
+			$this._PincerArrowLast = pincerArrow;
+			$this.clearPoint();
+			$this.destroy();
+
+			$this._tooltip.setVisible(false);
+
+		}, $this.Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
+	}
+
+	//创建钳击箭头
+	createPincerArrow() {
+		var $this = this;
+		$this._computeTempPositions();
+		var arrowEntity = $this.viewer.entities.add({
+			polygon: {
+				hierarchy: new $this.Cesium.CallbackProperty(
+					function() {
+						//计算面
+						var lnglatArr = [];
+						for (var i = 0; i < $this._positions.length; i++) {
+							var lnglat = $this.cartesianToLatlng($this._positions[i]);
+							lnglatArr.push(lnglat)
+						}
+						var res = $this.doubleArrow(lnglatArr);
+						var returnData = res.polygonalPoint;
+						return new $this.Cesium.PolygonHierarchy(returnData);
+					}, false),
+				show: true,
+				fill: true,
+				clampToGround: true,
+				material: $this.polygonMaterial
+			}
+		})
+		$this._entities_PincerArrow.push(arrowEntity);
+		return arrowEntity
+	}
+
+	//创建点
+	createPoint(cartesian) {
+		var $this = this;
+		var point = this.viewer.entities.add({
+			position: cartesian,
+			point: {
+				pixelSize: 10,
+				color: $this.Cesium.Color.RED,
+				heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+			}
+		});
+		$this._entities_point.push(point);
+		return point;
+	}
+
+	cartesianToLatlng(cartesian) {
+		let cartographic = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+		let lat = this.Cesium.Math.toDegrees(cartographic.latitude);
+		let lng = this.Cesium.Math.toDegrees(cartographic.longitude);
+		let alt = cartographic.height;
+		return [lng, lat, alt];
+	}
+
+	//销毁
+	destroy() {
+		if (this.handler) {
+			this.handler.destroy();
+			this.handler = null;
+		}
+	}
+
+	clearPoint() {
+		this.DrawEndEvent.raiseEvent(this._PincerArrowLast, this._PincerArrowData, this.drawType);
+		for (var i = 0; i < this._entities_point.length; i++) {
+			this.viewer.entities.remove(this._entities_point[i]);
+		}
+		this._entities_point = []; //脏数据
+	}
+
+	//清空实体对象
+	clear() {
+		for (var i = 0; i < this._entities_point.length; i++) {
+			this.viewer.entities.remove(this._entities_point[i]);
+		}
+		for (var i = 0; i < this._entities_PincerArrow.length; i++) {
+			this.viewer.entities.remove(this._entities_PincerArrow[i]);
+		}
+
+		this.floatingPoint = null; //标识点
+		this._PincerArrow = null; //活动箭头
+		this._PincerArrowLast = null; //最后一个箭头
+		this._positions = []; //活动点
+		this._entities_point = []; //脏数据
+		this._entities_PincerArrow = []; //脏数据
+		this._PincerArrowData = null; //用于构造箭头数据
+	}
+
+	getCatesian3FromPX(px) {
+		var cartesian;
+		var ray = this.viewer.camera.getPickRay(px);
+		if (!ray) return null;
+		cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+		return cartesian;
+	}
+
+	_computeTempPositions() {
+		var _this = this;
+
+		var pnts = [].concat(_this._positions);
+		var num = pnts.length;
+		var first = pnts[0];
+		var last = pnts[num - 1];
+		if (_this._isSimpleXYZ(first, last) == false) {
+			pnts.push(first);
+			num += 1;
+		}
+		_this.tempPositions = [];
+		for (var i = 1; i < num; i++) {
+			var p1 = pnts[i - 1];
+			var p2 = pnts[i];
+			var cp = _this._computeCenterPotition(p1, p2);
+			_this.tempPositions.push(p1);
+			_this.tempPositions.push(cp);
+		}
+	}
+
+	_isSimpleXYZ(p1, p2) {
+		if (p1.x == p2.x && p1.y == p2.y && p1.z == p2.z) {
+			return true;
+		}
+		return false;
+	}
+
+	_computeCenterPotition(p1, p2) {
+		var _this = this;
+		var c1 = _this.viewer.scene.globe.ellipsoid.cartesianToCartographic(p1);
+		var c2 = _this.viewer.scene.globe.ellipsoid.cartesianToCartographic(p2);
+		var cm = new _this.Cesium.EllipsoidGeodesic(c1, c2).interpolateUsingFraction(0.5);
+		var cp = _this.viewer.scene.globe.ellipsoid.cartographicToCartesian(cm);
+		return cp;
+	}
+
+	////////////////////////////////////////求取箭头坐标函数/////////////////////////////////////////////////////
+	//箭头配置函数
+	doubleArrow(inputPoint) {
+		var $this = this;
+		this.connPoint = null;
+		this.tempPoint4 = null;
+		this.points = inputPoint;
+		var result = {
+			controlPoint: null,
+			polygonalPoint: null
+		};
+		//获取已经点击的坐标数
+		var t = inputPoint.length;
+		if (!(2 > t)) {
+			if (2 == t) return inputPoint;
+			var o = this.points[0], //第一个点
+				e = this.points[1], //第二个点
+				r = this.points[2], //第三个点
+				t = inputPoint.length; //获取已经点击的坐标数
+			//下面的是移动点位后的坐标
+			3 == t ? this.tempPoint4 = $this.getTempPoint4(o, e, r) : this.tempPoint4 = this.points[3],
+				3 == t || 4 == t ? this.connPoint = $this.mid(o, e) : this.connPoint = this.points[4];
+			var n, g;
+			$this.isClockWise(o, e, r) ? (n = $this.getArrowPoints(o, this.connPoint, this.tempPoint4, !1), g = $this.getArrowPoints(this.connPoint, e, r, !0)) : (n = $this.getArrowPoints(e, this.connPoint, r, !1), g = $this.getArrowPoints(this.connPoint, o, this.tempPoint4, !0));
+			var i = n.length,
+				s = (i - 5) / 2,
+				a = n.slice(0, s),
+				l = n.slice(s, s + 5),
+				u = n.slice(s + 5, i),
+				c = g.slice(0, s),
+				p = g.slice(s, s + 5),
+				h = g.slice(s + 5, i);
+			c = $this.getBezierPoints(c);
+			var d = $this.getBezierPoints(h.concat(a.slice(1)));
+			u = $this.getBezierPoints(u);
+			var f = c.concat(p, d, l, u);
+			var newArray = $this.array2Dto1D(f);
+			result.controlPoint = [o, e, r, this.tempPoint4, this.connPoint];
+			result.polygonalPoint = $this.Cesium.Cartesian3.fromDegreesArray(newArray);
+		}
+		return result;
+	}
+	getTempPoint4(t, o, e) {
+		var $this = this;
+		var r, n, g, i, s = $this.mid(t, o),
+			a = $this.distance(s, e),
+			l = $this.getAngleOfThreePoints(t, s, e);
+		return l < Math.PI / 2 ? (n = a * Math.sin(l), g = a * Math.cos(l), i = $this.getThirdPoint(t, s, Math.PI / 2, n, !1), r = $this.getThirdPoint(s, i, Math.PI / 2, g, !0)) : l >= Math.PI / 2 && l < Math.PI ? (n = a * Math.sin(Math.PI - l), g = a * Math.cos(Math.PI - l), i = $this.getThirdPoint(t, s, Math.PI / 2, n, !1), r = $this.getThirdPoint(s, i, Math.PI / 2, g, !1)) : l >= Math.PI && l < 1.5 * Math.PI ? (n = a * Math.sin(l - Math.PI), g = a * Math.cos(l - Math.PI), i = $this.getThirdPoint(t, s, Math.PI / 2, n, !0), r = $this.getThirdPoint(s, i, Math.PI / 2, g, !0)) : (n = a * Math.sin(2 * Math.PI - l), g = a * Math.cos(2 * Math.PI - l), i = $this.getThirdPoint(t, s, Math.PI / 2, n, !0), r = $this.getThirdPoint(s, i, Math.PI / 2, g, !1)),
+			r
+	}
+
+	mid(t, o) {
+		return [(t[0] + o[0]) / 2, (t[1] + o[1]) / 2]
+	}
+
+	isClockWise(t, o, e) {
+		return (e[1] - t[1]) * (o[0] - t[0]) > (o[1] - t[1]) * (e[0] - t[0])
+	}
+
+	getArrowPoints(t, o, e, r) {
+		var $this = this;
+		var doubleArrowDefualParam = {
+			type: "doublearrow",
+			headHeightFactor: .25,
+			headWidthFactor: .3,
+			neckHeightFactor: .85,
+			fixPointCount: 4,
+			neckWidthFactor: .15
+		}
+		this.type = doubleArrowDefualParam.type,
+			this.headHeightFactor = doubleArrowDefualParam.headHeightFactor,
+			this.headWidthFactor = doubleArrowDefualParam.headWidthFactor,
+			this.neckHeightFactor = doubleArrowDefualParam.neckHeightFactor,
+			this.neckWidthFactor = doubleArrowDefualParam.neckWidthFactor;
+		var n = $this.mid(t, o),
+			g = $this.distance(n, e),
+			i = $this.getThirdPoint(e, n, 0, .3 * g, !0),
+			s = $this.getThirdPoint(e, n, 0, .5 * g, !0);
+		i = $this.getThirdPoint(n, i, Math.PI / 2, g / 5, r),
+			s = $this.getThirdPoint(n, s, Math.PI / 2, g / 4, r);
+		var a = [n, i, s, e],
+			l = $this.getArrowHeadPoints(a, this.headHeightFactor, this.headWidthFactor, this.neckHeightFactor, this.neckWidthFactor),
+			u = l[0],
+			c = l[4],
+			p = $this.distance(t, o) / $this.getBaseLength(a) / 2,
+			h = $this.getArrowBodyPoints(a, u, c, p),
+			d = h.length,
+			f = h.slice(0, d / 2),
+			E = h.slice(d / 2, d);
+		return f.push(u),
+			E.push(c),
+			f = f.reverse(),
+			f.push(o),
+			E = E.reverse(),
+			E.push(t),
+			f.reverse().concat(l, E)
+	}
+
+	getArrowHeadPoints(t, o, e) {
+		var $this = this;
+		var doubleArrowDefualParam = {
+			type: "doublearrow",
+			headHeightFactor: .25,
+			headWidthFactor: .3,
+			neckHeightFactor: .85,
+			fixPointCount: 4,
+			neckWidthFactor: .15
+		}
+		this.type = doubleArrowDefualParam.type,
+			this.headHeightFactor = doubleArrowDefualParam.headHeightFactor,
+			this.headWidthFactor = doubleArrowDefualParam.headWidthFactor,
+			this.neckHeightFactor = doubleArrowDefualParam.neckHeightFactor,
+			this.neckWidthFactor = doubleArrowDefualParam.neckWidthFactor;
+		var r = $this.getBaseLength(t),
+			n = r * this.headHeightFactor,
+			g = t[t.length - 1],
+			i = ($this.distance(o, e), n * this.headWidthFactor),
+			s = n * this.neckWidthFactor,
+			a = n * this.neckHeightFactor,
+			l = $this.getThirdPoint(t[t.length - 2], g, 0, n, !0),
+			u = $this.getThirdPoint(t[t.length - 2], g, 0, a, !0),
+			c = $this.getThirdPoint(g, l, Math.PI / 2, i, !1),
+			p = $this.getThirdPoint(g, l, Math.PI / 2, i, !0),
+			h = $this.getThirdPoint(g, u, Math.PI / 2, s, !1),
+			d = $this.getThirdPoint(g, u, Math.PI / 2, s, !0);
+		return [h, c, g, p, d];
+	}
+
+	getArrowBodyPoints(t, o, e, r) {
+		var $this = this;
+		for (var n = $this.wholeDistance(t), g = $this.getBaseLength(t), i = g * r, s = $this.distance(o, e), a = (i - s) / 2, l = 0, u = [], c = [], p = 1; p < t.length - 1; p++) {
+			var h = $this.getAngleOfThreePoints(t[p - 1], t[p], t[p + 1]) / 2;
+			l += $this.distance(t[p - 1], t[p]);
+			var d = (i / 2 - l / n * a) / Math.sin(h),
+				f = $this.getThirdPoint(t[p - 1], t[p], Math.PI - h, d, !0),
+				E = $this.getThirdPoint(t[p - 1], t[p], h, d, !1);
+			u.push(f), c.push(E)
+		}
+		return u.concat(c)
+	}
+
+	getBezierPoints(t) {
+		if (t.length <= 2) return t;
+		for (var o = [], e = t.length - 1, r = 0; 1 >= r; r += .01) {
+			for (var n = 0, y = 0, g = 0; e >= g; g++) {
+				var i = this.getBinomialFactor(e, g),
+					s = Math.pow(r, g),
+					a = Math.pow(1 - r, e - g);
+				n += i * s * a * t[g][0], y += i * s * a * t[g][1]
+			}
+			o.push([n, y])
+		}
+		return o.push(t[e]), o
+	}
+
+	getBaseLength(t) {
+		return Math.pow(this.wholeDistance(t), .99)
+	}
+
+	wholeDistance(t) {
+		for (var o = 0, e = 0; e < t.length - 1; e++) o += this.distance(t[e], t[e + 1]);
+		return o
+	}
+
+	getBinomialFactor(t, o) {
+		return this.getFactorial(t) / (this.getFactorial(o) * this.getFactorial(t - o))
+	}
+
+	getFactorial(t) {
+		if (1 >= t) return 1;
+		if (2 == t) return 2;
+		if (3 == t) return 6;
+		if (4 == t) return 24;
+		if (5 == t) return 120;
+		for (var o = 1, e = 1; t >= e; e++) o *= e;
+		return o
+	}
+
+	array2Dto1D(array) {
+		var newArray = [];
+		array.forEach(function(elt) {
+			newArray.push(elt[0]);
+			newArray.push(elt[1]);
+		});
+		return newArray;
+	}
+
+	distance(t, o) {
+		return Math.sqrt(Math.pow(t[0] - o[0], 2) + Math.pow(t[1] - o[1], 2))
+	}
+
+	getAngleOfThreePoints(t, o, e) {
+		var r = this.getAzimuth(o, t) - this.getAzimuth(o, e);
+		return 0 > r ? r + 2 * Math.PI : r
+	}
+
+	getAzimuth(t, o) {
+		var e, r = Math.asin(Math.abs(o[1] - t[1]) / this.distance(t, o));
+		return o[1] >= t[1] && o[0] >= t[0] ? e = r + Math.PI : o[1] >= t[1] && o[0] < t[0] ? e = 2 * Math.PI - r : o[1] < t[1] && o[0] < t[0] ? e = r : o[1] < t[1] && o[0] >= t[0] && (e = Math.PI - r), e
+	}
+
+	getThirdPoint(t, o, e, r, n) {
+		var g = this.getAzimuth(t, o),
+			i = n ? g + e : g - e,
+			s = r * Math.cos(i),
+			a = r * Math.sin(i);
+		return [o[0] + s, o[1] + a]
+	}
+
+}
+
+export default DrawPincerArrow

+ 138 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawPoint.js

@@ -0,0 +1,138 @@
+//一、点
+// DrawPoint
+/*
+绘制点
+ */
+class DrawPoint {
+    constructor(arg) {
+        this.viewer = arg.viewer;
+        this.Cesium = arg.Cesium;
+        // this.callback=arg.callback;
+        this._point = null;  //最后一个点
+        this._pointData = null;//点数据用于构造点
+        this._entities = []; //脏数据
+        this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+        this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+		
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+		
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+    }
+ 
+    //返回最后活动点
+    get point() {
+        return this._point;
+    }
+ 
+    //加载点
+    addload(data) {
+        return this.createPoint(data);
+    }
+ 
+    //返回点数据用于加载点
+    getData() {
+        return this._pointData;
+    }
+
+    // 修改编辑调用计算
+    computePosition(data) {
+        let $this = this
+        var lnglatArr = [];
+        for (var i = 0; i < data.length; i++) {
+            var lnglat = $this.cartesianToLatlng(data[i]);
+            lnglatArr.push(lnglat)
+        }
+        $this._pointData = lnglatArr;
+        let point = lnglatArr[0]
+        return $this.Cesium.Cartesian3.fromDegrees(point[0],point[1])
+    }
+ 
+    //开始绘制
+    startCreate(drawType) {
+        this.drawType = drawType;
+        var $this = this;
+        this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
+        this.handler.setInputAction(function (evt) { //单机开始绘制
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            if (!cartesian) return;
+            let latlon = $this.cartesianToLatlng(cartesian)
+            var point = $this.createPoint(latlon);
+            $this._pointData = cartesian;
+            $this._point = point;
+            // if(typeof $this.callback=="function"){
+            //     $this.callback(point);
+            // }
+            
+            $this.DrawEndEvent.raiseEvent($this._point, latlon, $this.drawType);
+            $this.destroy()
+        }, $this.Cesium.ScreenSpaceEventType.LEFT_CLICK);
+    }
+ 
+    //创建点
+    createPoint(cartesian) {
+        var $this = this;
+        var point = this.viewer.entities.add({
+            Type:'DrawPoint',
+            Position:[cartesian],
+            position: $this.Cesium.Cartesian3.fromDegrees(cartesian[0],cartesian[1]),
+            id:cartesian.id || $this.objId,
+            billboard: {
+                image: "./static/poi2.png",
+                // scaleByDistance: new Cesium.NearFarScalar(300, 1, 1200, 0.4), //设置随图缩放距离和比例
+                // distanceDisplayCondition: new Cesium.DistanceDisplayCondition(0, 10000), //设置可见距离 10000米可见
+                verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+                // clampToGround: true
+            },
+        });
+        $this._entities.push(point); //加载脏数据
+        return point;
+    }
+
+    cartesianToLatlng(cartesian) {
+        let ellipsoid = this.viewer.scene.globe.ellipsoid
+        let cartographic = ellipsoid.cartesianToCartographic(cartesian);
+        let lat = Cesium.Math.toDegrees(cartographic.latitude);
+        let lng = Cesium.Math.toDegrees(cartographic.longitude);
+        return [lng, lat];
+    }
+ 
+    //销毁鼠标事件
+    destroy() {
+        if (this.handler) {
+            this.handler.destroy();
+            this.handler = null;
+        }
+    }
+ 
+    //清空实体对象
+    clear() {
+        for (var i = 0; i < this._entities.length; i++) {
+            this.viewer.entities.remove(this._entities[i]);
+        }
+        this._entities = [];
+        this._point = null;
+    }
+ 
+    getCatesian3FromPX(px) {
+        var cartesian;
+        var ray = this.viewer.camera.getPickRay(px);
+        if (!ray) return null;
+        cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+        return cartesian;
+    }
+}
+ 
+export default DrawPoint;

+ 229 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawPolygon.js

@@ -0,0 +1,229 @@
+//   六、多边形
+// DrawPolygon
+/*
+绘制面
+ */
+class DrawPolygon {
+    constructor(arg) {
+        this.viewer = arg.viewer;
+        this.Cesium = arg.Cesium;
+        // this.callback=arg.callback;
+        this._polygon = null;  //活动面
+        this._polygonLast = null;  //最后一个面
+        this._positions = []; //活动点
+        this._entities_point = [];  //脏数据
+        this._entities_polygon = [];  //脏数据
+        this._polygonData = null; //用户构造面
+        this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+        this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+		
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+		
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+    }
+
+    //返回最后活动面
+    get polygon() {
+        return this._polygonLast;
+    }
+
+    //返回面数据用于加载面
+    getData() {
+        return this._polygonData;
+    }
+
+    // 修改编辑调用计算
+    computePosition(data){
+        //计算面
+        let $this = this
+        var lnglatArr = [];
+        for (var i = 0; i < data.length; i++) {
+            var lnglat = $this.cartesianToLatlng(data[i]);
+            lnglatArr.push(lnglat)
+        }
+        $this._polygonData = lnglatArr;
+        return new $this.Cesium.PolygonHierarchy(data);
+    }
+
+    //加载面
+    addload(data) {
+        var $this = this;
+        var lnglatArr = [];
+        for (var i = 0; i < data.length; i++) {
+            var lnglat = $this.LatlngTocartesian(data[i]);
+            lnglatArr.push(lnglat)
+        }
+        return this.viewer.entities.add({
+            Type: 'DrawPolygon',
+            Position: data,
+            id:data.id || $this.objId,
+            polygon: {
+                hierarchy: new $this.Cesium.PolygonHierarchy(lnglatArr),
+                clampToGround: true,
+                show: true,
+                fill: true,
+                material: $this.Cesium.Color.RED.withAlpha(0.9),
+                width: 3,
+                outlineColor: $this.Cesium.Color.BLACK,
+                outlineWidth: 1,
+                outline: false
+            }
+        });
+    }
+
+    //开始绘制
+    startCreate(drawType) {
+        this.drawType = drawType;
+        var $this = this;
+        this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
+        this.handler.setInputAction(function (evt) { //单机开始绘制
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            if ($this._positions.length == 0) {
+                $this._positions.push(cartesian.clone());
+            }
+            $this.createPoint(cartesian);
+            $this._positions.push(cartesian);
+        }, $this.Cesium.ScreenSpaceEventType.LEFT_CLICK);
+        this.handler.setInputAction(function (evt) { //移动时绘制面
+            if ($this._positions.length < 1) return;
+            var cartesian = $this.getCatesian3FromPX(evt.endPosition);
+            if ($this._positions.length == 3) {
+                if (!$this.Cesium.defined($this._polygon)) {
+                    $this._polygon = $this.createPolygon();
+                }
+            }
+            $this._positions.pop();
+            $this._positions.push(cartesian);
+        }, $this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+        this.handler.setInputAction(function (evt) {
+            if (!$this._polygon) return;
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            $this._positions.pop();
+            // $this._positions.push(cartesian);
+            $this.createPoint(cartesian);
+            $this._polygonData = $this._positions.concat();
+            $this.viewer.entities.remove($this._positions); //移除
+            $this._positions = null;
+            $this._positions = [];
+            var lnglatArr = [];
+            for (var i = 0; i < $this._polygonData.length; i++) {
+                var lnglat = $this.cartesianToLatlng($this._polygonData[i]);
+                lnglatArr.push(lnglat)
+            }
+            $this._polygonData = lnglatArr;
+            var Polygon = $this.addload($this._polygonData);
+            $this._entities_polygon.push(Polygon);
+            $this._polygonLast = Polygon;
+            // if(typeof $this.callback=="function"){
+            //     $this.callback(Polygon);
+            // }
+            $this.clearPoint();
+            $this.destroy()
+        }, $this.Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+    }
+
+    //创建面
+    createPolygon() {
+        var $this = this;
+        var polygon = this.viewer.entities.add({
+            polygon: {
+                hierarchy: new $this.Cesium.CallbackProperty(function () {
+                    return new $this.Cesium.PolygonHierarchy($this._positions);
+                }, false),
+                clampToGround: true,
+                show: true,
+                fill: true,
+                material: $this.Cesium.Color.RED.withAlpha(0.5),
+                width: 3,
+                outlineColor: $this.Cesium.Color.BLACK,
+                outlineWidth: 1,
+                outline: false
+            }
+        });
+        $this._entities_polygon.push(polygon);
+        return polygon;
+    }
+
+    cartesianToLatlng(cartesian) {
+        var latlng = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+        var lat = this.Cesium.Math.toDegrees(latlng.latitude);
+        var lng = this.Cesium.Math.toDegrees(latlng.longitude);
+        return [lng, lat];
+    }
+
+    LatlngTocartesian(latlng) {
+        let cartesian3 = this.Cesium.Cartesian3.fromDegrees(latlng[0], latlng[1]);
+        return cartesian3
+    }
+
+    clearPoint() {
+        this.DrawEndEvent.raiseEvent(this._polygonLast, this._polygonData, this.drawType);
+        for (var i = 0; i < this._entities_point.length; i++) {
+            this.viewer.entities.remove(this._entities_point[i]);
+        }
+        this._entities_point = [];  //脏数据
+    }
+
+    //创建点
+    createPoint(cartesian) {
+        var $this = this;
+        var point = this.viewer.entities.add({
+            position: cartesian,
+            point: {
+                pixelSize: 10,
+                color: $this.Cesium.Color.RED,
+                heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+            }
+        });
+        $this._entities_point.push(point);
+        return point;
+    }
+
+
+    //销毁事件
+    destroy() {
+        if (this.handler) {
+            this.handler.destroy();
+            this.handler = null;
+        }
+    }
+
+    //清空实体对象
+    clear() {
+        for (var i = 0; i < this._entities_point.length; i++) {
+            this.viewer.entities.remove(this._entities_point[i]);
+        }
+        for (var i = 0; i < this._entities_polygon.length; i++) {
+            this.viewer.entities.remove(this._entities_polygon[i]);
+        }
+        this._polygon = null;  //活动面
+        this._polygonLast = null;  //最后一个面
+        this._positions = []; //活动点
+        this._entities_point = [];  //脏数据
+        this._entities_polygon = [];  //脏数据
+        this._polygonData = null; //用户构造面
+    }
+
+    getCatesian3FromPX(px) {
+        var cartesian;
+        var ray = this.viewer.camera.getPickRay(px);
+        if (!ray) return null;
+        cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+        return cartesian;
+    }
+}
+
+export default DrawPolygon

+ 223 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawPolyline.js

@@ -0,0 +1,223 @@
+//二、折线
+// DrawPolyline
+/*
+绘制线
+ */
+class DrawPolyline {
+    constructor(arg) {
+        this.viewer = arg.viewer;
+        this.Cesium = arg.Cesium;
+        // this.callback=arg.callback;
+        this._polyline = null; //活动线
+        this._polylineLast = null; //最后一条线
+        this._positions = [];  //活动点
+        this._entities_point = [];  //脏数据
+        this._entities_line = [];  //脏数据
+        this._polylineData = null; //用于构造线数据
+        this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+        this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+		
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+		
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+    }
+ 
+    //返回最后活动线
+    get line() {
+        return this._polylineLast;
+    }
+ 
+    //返回线数据用于加载线
+    getData() {
+        return this._polylineData;
+    }
+
+    // 修改编辑调用计算
+    computePosition(data){
+        //计算面
+        let $this = this
+        var lnglatArr = [];
+        for (var i = 0; i < data.length; i++) {
+            var lnglat = $this.cartesianToLatlng(data[i]);
+            lnglatArr.push(lnglat)
+        }
+        $this._polylineData = lnglatArr;
+        return data;
+    }
+ 
+    //加载线
+    addload(data) {
+        var $this = this;
+        var lnglatArr = [];
+        for (var i = 0; i < data.length; i++) {
+            var lnglat = $this.LatlngTocartesian(data[i]);
+            lnglatArr.push(lnglat)
+        }
+        var polyline = this.viewer.entities.add({
+            Type:'DrawPolyline',
+            Position:data,
+            id:data.id || $this.objId,
+            polyline: {
+                positions: lnglatArr,
+                show: true,
+                material: $this.Cesium.Color.RED,
+                width: 3,
+                clampToGround: true
+            }
+        });
+        return polyline;
+    }
+ 
+    //开始创建
+    startCreate(drawType) {
+        this.drawType = drawType;
+        var $this = this;
+        this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
+        this.handler.setInputAction(function (evt) { //单机开始绘制
+            //屏幕坐标转地形上坐标
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            if ($this._positions.length == 0) {
+                $this._positions.push(cartesian.clone());
+            }
+            $this._positions.push(cartesian);
+            $this.createPoint(cartesian);// 绘制点
+        }, $this.Cesium.ScreenSpaceEventType.LEFT_CLICK);
+        this.handler.setInputAction(function (evt) { //移动时绘制线
+            if ($this._positions.length < 1) return;
+            var cartesian = $this.getCatesian3FromPX(evt.endPosition);
+            if (!$this.Cesium.defined($this._polyline)) {
+                $this._polyline = $this.createPolyline();
+            }
+            if ($this._polyline) {
+                $this._positions.pop();
+                $this._positions.push(cartesian);
+            }
+        }, $this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+        this.handler.setInputAction(function (evt) {
+            if (!$this._polyline) return;
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            $this._positions.pop();
+            // $this._positions.push(cartesian);
+            $this.createPoint(cartesian);// 绘制点
+            $this._polylineData = $this._positions.concat();
+            $this.viewer.entities.remove($this._polyline); //移除
+            $this._polyline = null;
+            $this._positions = [];
+            var lnglatArr = [];
+            for (var i = 0; i < $this._polylineData.length; i++) {
+                var lnglat = $this.cartesianToLatlng($this._polylineData[i]);
+                lnglatArr.push(lnglat)
+            }
+            $this._polylineData = lnglatArr;
+            var line = $this.addload($this._polylineData); //加载线
+            $this._entities_line.push(line);
+            $this._polylineLast=line;
+            // if(typeof $this.callback=="function"){
+            //     $this.callback(line);
+            // }
+            $this.clearPoint();
+            $this.destroy()
+        }, $this.Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+    }
+ 
+    //创建点
+    createPoint(cartesian) {
+        var $this = this;
+        var point = this.viewer.entities.add({
+            position: cartesian,
+            point: {
+                pixelSize: 10,
+                color: $this.Cesium.Color.RED,
+                heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+            }
+        });
+        $this._entities_point.push(point);
+        return point;
+    }
+ 
+    //创建线
+    createPolyline() {
+        var $this = this;
+        var polyline = this.viewer.entities.add({
+            polyline: {
+                //使用cesium的peoperty
+                positions: new $this.Cesium.CallbackProperty(function () {
+                    return $this._positions
+                }, false),
+                show: true,
+                material: $this.Cesium.Color.RED,
+                width: 3,
+                clampToGround: true
+            }
+        });
+        $this._entities_line.push(polyline);
+        return polyline;
+    }
+
+    cartesianToLatlng(cartesian) {
+        var latlng = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+        var lat = this.Cesium.Math.toDegrees(latlng.latitude);
+        var lng = this.Cesium.Math.toDegrees(latlng.longitude);
+        return [lng, lat];
+    }
+
+    LatlngTocartesian(latlng) {
+        let cartesian3 = this.Cesium.Cartesian3.fromDegrees(latlng[0], latlng[1]);
+        return cartesian3
+    }
+
+    clearPoint() {
+        this.DrawEndEvent.raiseEvent(this._polylineLast , this._polylineData, this.drawType);
+        for (var i = 0; i < this._entities_point.length; i++) {
+            this.viewer.entities.remove(this._entities_point[i]);
+        }
+        this._entities_point = [];  //脏数据
+    }
+ 
+    //销毁
+    destroy() {
+        if (this.handler) {
+            this.handler.destroy();
+            this.handler = null;
+        }
+    }
+ 
+    //清空实体对象
+    clear() {
+        for (var i = 0; i < this._entities_point.length; i++) {
+            this.viewer.entities.remove(this._entities_point[i]);
+        }
+        for (var i = 0; i < this._entities_line.length; i++) {
+            this.viewer.entities.remove(this._entities_line[i]);
+        }
+        this._polyline = null;
+        this._positions = [];
+        this._entities_point = [];  //脏数据
+        this._entities_line = [];  //脏数据
+        this._polylineData = null; //用于构造线数据
+        this._polylineLast=null;
+    }
+ 
+    getCatesian3FromPX(px) {
+        var cartesian;
+        var ray = this.viewer.camera.getPickRay(px);
+        if (!ray) return null;
+        cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+        return cartesian;
+    }
+}
+ 
+export default DrawPolyline

+ 289 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawRectFlag.js

@@ -0,0 +1,289 @@
+
+// DrawRectFlag
+/*
+绘制矩形旗帜旗帜
+ */
+class DrawRectFlag {
+    constructor(arg) {
+        this.viewer = arg.viewer;
+        this.Cesium = arg.Cesium;
+        this.identificationPoint = null; //标识点位
+        this.RectFlag = null; 
+        this.RectFlagLast = null; // 矩形旗帜数据
+        this.positions = [];  // 经纬度
+        this.entitiesPoint = [];   // 实体点位
+        this.entitiesRectFlag = [];  
+        this.RectFlagData = null; 
+        this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+        this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+		
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+		
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+    }
+ 
+    //返回矩形旗帜数据
+    getData() {
+        return this.RectFlagData;
+    }
+
+    // 修改编辑调用计算
+    computePosition(data){
+        //计算面
+        let $this = this
+        var lnglatArr = [];
+        for (var i = 0; i < data.length; i++) {
+            var lnglat = $this.cartesianToLatlng(data[i]);
+            lnglatArr.push(lnglat)
+        }
+        let startPoint = lnglatArr[0];
+        // 取最后一个
+        let endPoint =lnglatArr[lnglatArr.length - 1]
+        let point0 = lnglatArr[0];
+        var point1 =[endPoint[0], startPoint[1]];
+        var point2 = [endPoint[0], (startPoint[1] + endPoint[1]) / 2]
+        var point3 = [startPoint[0], (startPoint[1] + endPoint[1]) / 2]
+        var point4 =[startPoint[0], endPoint[1]]
+        let componentspolygon = $this.Cesium.Cartesian3.fromDegreesArray([...point0, ...point1, ...point2, ...point3,...point0,])
+        let componentspolyline = $this.Cesium.Cartesian3.fromDegreesArray([...point0, ...point1, ...point2, ...point3,...point0,...point4])
+        let PolygonHierarchy = new $this.Cesium.PolygonHierarchy(componentspolygon)
+        $this.RectFlagData = lnglatArr;
+        console.log([PolygonHierarchy,componentspolyline])
+        return [PolygonHierarchy,componentspolyline];
+    }
+ 
+    //加载
+    addload(data) {
+        var $this = this;
+        if (data.length < 2) return;
+        let startPoint = data[0];
+        // 取最后一个
+        let endPoint =data[data.length - 1]
+        let point0 = data[0];
+        var point1 =[endPoint[0], startPoint[1]];
+        var point2 = [endPoint[0], (startPoint[1] + endPoint[1]) / 2]
+        var point3 = [startPoint[0], (startPoint[1] + endPoint[1]) / 2]
+        var point4 =[startPoint[0], endPoint[1]]
+        let componentspolygon = $this.Cesium.Cartesian3.fromDegreesArray([...point0, ...point1, ...point2, ...point3,...point0,])
+        let componentspolyline = $this.Cesium.Cartesian3.fromDegreesArray([...point0, ...point1, ...point2, ...point3,...point0,...point4])
+        var shape = this.viewer.entities.add({
+            Type:'DrawRectFlag',
+            Position:data,
+            id:data.id || $this.objId,
+            polygon: {
+                hierarchy: new $this.Cesium.PolygonHierarchy(componentspolygon),
+                extrudedHeight: 1,
+                material: $this.Cesium.Color.RED,
+            },
+            polyline: {
+                //使用cesium的peoperty
+                positions: componentspolyline,
+                show: true,
+                material: $this.Cesium.Color.YELLOW,
+                width: 5,
+                clampToGround: true
+            }
+        });
+        $this.entitiesRectFlag.push(shape);
+        return shape;
+    }
+ 
+    //开始创建
+    startCreate(drawType) {
+        this.drawType = drawType;
+        var $this = this;
+        this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
+        this.handler.setInputAction(function (evt) { //单机开始绘制
+            //屏幕坐标转地形上坐标
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            if ($this.positions.length == 0) {
+                $this.positions.push(cartesian.clone());
+                $this.identificationPoint = $this.createPoint(cartesian);
+                $this.createPoint(cartesian);// 绘制点
+                $this.positions.push(cartesian);
+            }
+            // if ($this.positions.length == 2) {
+            //     $this.positions.push(cartesian);
+            // }
+            
+        }, $this.Cesium.ScreenSpaceEventType.LEFT_CLICK);
+        this.handler.setInputAction(function (evt) { //移动时绘制线
+            if ($this.positions.length < 2) return;
+            var cartesian = $this.getCatesian3FromPX(evt.endPosition);
+            if (!$this.Cesium.defined($this.RectFlag)) {
+                $this.RectFlag = $this.createRectFlag();
+            }
+            $this.identificationPoint.position.setValue(cartesian);
+            if ($this.RectFlag) {
+                $this.positions.pop();
+                $this.positions.push(cartesian);
+            }
+        }, $this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+        this.handler.setInputAction(function (evt) {
+            if (!$this.RectFlag) return;
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            $this.positions.pop();
+            $this.positions.push(cartesian);
+            $this.createPoint(cartesian);// 绘制点
+            $this.RectFlagData = $this.positions.concat();
+            $this.viewer.entities.remove($this.RectFlag); //移除
+            $this.RectFlag = null;
+            $this.positions = [];
+            $this.identificationPoint.position.setValue(cartesian);
+            var lnglatArr = [];
+            for (var i = 0; i < $this.RectFlagData.length; i++) {
+                var lnglat = $this.cartesianToLatlng($this.RectFlagData[i]);
+                lnglatArr.push(lnglat)
+            }
+            $this.RectFlagData = lnglatArr;
+            var RectFlag = $this.addload([$this.RectFlagData[0],$this.RectFlagData[$this.RectFlagData.length -1 ]]); //加载
+            $this.entitiesRectFlag.push(RectFlag);
+            $this.RectFlagLast = RectFlag;
+            $this.clearPoint();
+            $this.destroy()
+        }, $this.Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+    }
+ 
+    //创建点
+    createPoint(cartesian) {
+        var $this = this;
+        var point = this.viewer.entities.add({
+            position: cartesian,
+            point: {
+                pixelSize: 10,
+                color: $this.Cesium.Color.RED,
+                heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+            }
+        });
+        $this.entitiesPoint.push(point);
+        return point;
+    }
+ 
+    //创建矩形旗帜
+    createRectFlag() {
+        console.log('232323')
+        var $this = this;
+        var polygon = this.viewer.entities.add({
+            polygon: {
+                hierarchy: new $this.Cesium.CallbackProperty(function () {
+                    if($this.positions.length < 2) return 
+                    let lonlat = [];
+                    let length = $this.positions.length
+                    for (let i=0; i<length; i++){
+                        lonlat.push($this.cartesianToLatlng($this.positions[i]))
+                    }
+                    let startPoint = lonlat[0]
+                    // 取最后一个
+                    let endPoint =lonlat[lonlat.length - 1]
+                    let point0 = lonlat[0];
+                    var point1 =[endPoint[0], startPoint[1]];
+                    var point2 = [endPoint[0], (startPoint[1] + endPoint[1]) / 2]
+                    var point3 = [startPoint[0], (startPoint[1] + endPoint[1]) / 2]
+                    var point4 =[startPoint[0], endPoint[1]]
+
+                    let components = $this.Cesium.Cartesian3.fromDegreesArray([...point0, ...point1, ...point2, ...point3,...point0,])
+                    
+                    return new $this.Cesium.PolygonHierarchy(components);
+                }, false),
+                extrudedHeight: 1,
+                material: $this.Cesium.Color.RED,
+            },
+            polyline: {
+                //使用cesium的peoperty
+                positions: new $this.Cesium.CallbackProperty(function () {
+                    if($this.positions.length < 2) return 
+                    let lonlat = [];
+                    let length = $this.positions.length
+                    for (let i=0; i<length; i++){
+                        lonlat.push($this.cartesianToLatlng($this.positions[i]))
+                    }
+                    let startPoint = lonlat[0]
+                    // 取最后一个
+                    let endPoint =lonlat[lonlat.length - 1]
+                    let point0 = lonlat[0];
+                    var point1 =[endPoint[0], startPoint[1]];
+                    var point2 = [endPoint[0], (startPoint[1] + endPoint[1]) / 2]
+                    var point3 = [startPoint[0], (startPoint[1] + endPoint[1]) / 2]
+                    var point4 =[startPoint[0], endPoint[1]]
+
+                    let components = $this.Cesium.Cartesian3.fromDegreesArray([...point0, ...point1, ...point2, ...point3,...point0,...point4])
+                    return components
+                }, false),
+                show: true,
+                material: $this.Cesium.Color.YELLOW,
+                width: 5,
+                clampToGround: true
+            }
+        });
+        $this.entitiesRectFlag.push(polygon);
+        return polygon;
+    }
+
+    cartesianToLatlng(cartesian) {
+        var latlng = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+        var lat = this.Cesium.Math.toDegrees(latlng.latitude);
+        var lng = this.Cesium.Math.toDegrees(latlng.longitude);
+        return [lng, lat];
+    }
+
+    LatlngTocartesian(latlng) {
+        let cartesian3 = this.Cesium.Cartesian3.fromDegrees(latlng[0], latlng[1]);
+        return cartesian3
+    }
+
+    clearPoint() {
+        this.DrawEndEvent.raiseEvent(this.RectFlagLast, [this.RectFlagData[0],this.RectFlagData[this.RectFlagData.length -1 ]], this.drawType);
+        for (var i = 0; i < this.entitiesPoint.length; i++) {
+            this.viewer.entities.remove(this.entitiesPoint[i]);
+        }
+        this.entitiesPoint = [];  //脏数据
+    }
+ 
+    //销毁
+    destroy() {
+        if (this.handler) {
+            this.handler.destroy();
+            this.handler = null;
+        }
+    }
+ 
+    //清空实体对象
+    clear() {
+        for (var i = 0; i < this.entitiesPoint.length; i++) {
+            this.viewer.entities.remove(this.entitiesPoint[i]);
+        }
+        for (var i = 0; i < this.entitiesRectFlag.length; i++) {
+            this.viewer.entities.remove(this.entitiesRectFlag[i]);
+        }
+        this.identificationPoint = null; //标识点位
+        this.RectFlag = null; 
+        this.RectFlagLast = null; // 矩形旗帜数据
+        this.positions = [];  // 经纬度
+        this.entitiesPoint = [];   // 实体点位
+        this.entitiesRectFlag = [];  
+        this.RectFlagData = null; 
+    }
+ 
+    getCatesian3FromPX(px) {
+        var cartesian;
+        var ray = this.viewer.camera.getPickRay(px);
+        if (!ray) return null;
+        cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+        return cartesian;
+    }
+}
+ 
+export default DrawRectFlag

+ 228 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawRectangle.js

@@ -0,0 +1,228 @@
+//  五、矩形
+// DrawRectangle
+/*
+绘制矩形
+ */
+class DrawRectangle {
+    constructor(arg) {
+        this.viewer = arg.viewer;
+        this.Cesium = arg.Cesium;
+        // this.callback=arg.callback;
+        this.floatingPoint = null;//标识点
+        this._rectangle = null; //活动矩形
+        this._rectangleLast = null; //最后一个矩形
+        this._positions = [];  //活动点
+        this._entities_point = [];  //脏数据
+        this._entities_rectangle = [];  //脏数据
+        this._rectangleData = null; //用于构造矩形数据
+        this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+        this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+		
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+		
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+    }
+ 
+    //返回最后图形
+    get line() {
+        return this._rectangleLast;
+    }
+ 
+    //返回矩形数据
+    getData() {
+        return this._rectangleData;
+    }
+
+    // 修改编辑调用计算
+    computePosition(data){
+        //计算面
+        let $this = this
+        var lnglatArr = [];
+        for (var i = 0; i < data.length; i++) {
+            var lnglat = $this.cartesianToLatlng(data[i]);
+            lnglatArr.push(lnglat)
+        }
+        $this._rectangleData = lnglatArr;
+        return new $this.Cesium.Rectangle.fromCartesianArray(data);
+    }
+ 
+    //加载
+    addload(data) {
+        var $this = this;
+        var lnglatArr = [];
+        for (var i = 0; i < data.length; i++) {
+            var lnglat = $this.LatlngTocartesian(data[i]);
+            lnglatArr.push(lnglat)
+        }
+        var shape = this.viewer.entities.add({
+            Type:'DrawRectangle',
+            Position:data,
+            id:data.id || $this.objId,
+            rectangle: {
+                coordinates: $this.Cesium.Rectangle.fromCartesianArray(lnglatArr),
+                material: $this.Cesium.Color.RED.withAlpha(0.9)
+            }
+        });
+        $this._entities_rectangle.push(shape);
+        return shape;
+    }
+ 
+    //开始创建
+    startCreate(drawType) {
+        this.drawType = drawType;
+        var $this = this;
+        this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
+        this.handler.setInputAction(function (evt) { //单机开始绘制
+            //屏幕坐标转地形上坐标
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            if ($this._positions.length == 0) {
+                $this._positions.push(cartesian.clone());
+                $this.floatingPoint = $this.createPoint(cartesian);
+                $this.createPoint(cartesian);// 绘制点
+                $this._positions.push(cartesian);
+            }
+            if ($this._positions.length == 2) {
+                $this._positions.push(cartesian);
+            }
+            
+        }, $this.Cesium.ScreenSpaceEventType.LEFT_CLICK);
+        this.handler.setInputAction(function (evt) { //移动时绘制线
+            if ($this._positions.length < 3) return;
+            var cartesian = $this.getCatesian3FromPX(evt.endPosition);
+            if (!$this.Cesium.defined($this._rectangle)) {
+                $this._rectangle = $this.createRectangle();
+            }
+            $this.floatingPoint.position.setValue(cartesian);
+            if ($this._rectangle) {
+                $this._positions.pop();
+                $this._positions.push(cartesian);
+            }
+        }, $this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+        this.handler.setInputAction(function (evt) {
+            if (!$this._rectangle) return;
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            $this._positions.pop();
+            $this._positions.push(cartesian);
+            $this.createPoint(cartesian);// 绘制点
+            $this._rectangleData = $this._positions.concat();
+            $this.viewer.entities.remove($this._rectangle); //移除
+            $this._rectangle = null;
+            $this._positions = [];
+            $this.floatingPoint.position.setValue(cartesian);
+            var lnglatArr = [];
+            for (var i = 0; i < $this._rectangleData.length; i++) {
+                var lnglat = $this.cartesianToLatlng($this._rectangleData[i]);
+                lnglatArr.push(lnglat)
+            }
+            $this._rectangleData = lnglatArr;
+            var rectangle = $this.addload([$this._rectangleData[0],$this._rectangleData[$this._rectangleData.length -1 ]]); //加载
+            $this._entities_rectangle.push(rectangle);
+            $this._rectangleLast = rectangle;
+            // if(typeof $this.callback=="function"){
+            //     $this.callback(rectangle);
+            // }
+            $this.clearPoint();
+            $this.destroy()
+        }, $this.Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+    }
+ 
+    //创建点
+    createPoint(cartesian) {
+        var $this = this;
+        var point = this.viewer.entities.add({
+            position: cartesian,
+            point: {
+                pixelSize: 10,
+                color: $this.Cesium.Color.RED,
+                heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+            }
+        });
+        $this._entities_point.push(point);
+        return point;
+    }
+ 
+    //创建矩形
+    createRectangle() {
+        var $this = this;
+        var shape = this.viewer.entities.add({
+            name: "rectangle",
+            rectangle: {
+                coordinates: new $this.Cesium.CallbackProperty(function() {
+                    var obj = $this.Cesium.Rectangle.fromCartesianArray($this._positions);
+                    return obj;
+                }, false),
+                material: $this.Cesium.Color.RED.withAlpha(0.5)
+            }
+        });
+        $this._entities_rectangle.push(shape);
+        return shape;
+    }
+
+    cartesianToLatlng(cartesian) {
+        var latlng = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+        var lat = this.Cesium.Math.toDegrees(latlng.latitude);
+        var lng = this.Cesium.Math.toDegrees(latlng.longitude);
+        return [lng, lat];
+    }
+
+    LatlngTocartesian(latlng) {
+        let cartesian3 = this.Cesium.Cartesian3.fromDegrees(latlng[0], latlng[1]);
+        return cartesian3
+    }
+
+    clearPoint() {
+        this.DrawEndEvent.raiseEvent(this._rectangleLast, [this._rectangleData[0],this._rectangleData[this._rectangleData.length -1 ]], this.drawType);
+        for (var i = 0; i < this._entities_point.length; i++) {
+            this.viewer.entities.remove(this._entities_point[i]);
+        }
+        this._entities_point = [];  //脏数据
+    }
+ 
+    //销毁
+    destroy() {
+        if (this.handler) {
+            this.handler.destroy();
+            this.handler = null;
+        }
+    }
+ 
+    //清空实体对象
+    clear() {
+        for (var i = 0; i < this._entities_point.length; i++) {
+            this.viewer.entities.remove(this._entities_point[i]);
+        }
+        for (var i = 0; i < this._entities_rectangle.length; i++) {
+            this.viewer.entities.remove(this._entities_rectangle[i]);
+        }
+        this.floatingPoint = null;//标识点
+        this._rectangle = null; //活动矩形
+        this._rectangleLast = null; //最后一个矩形
+        this._positions = [];  //活动点
+        this._entities_point = [];  //脏数据
+        this._entities_rectangle = [];  //脏数据
+        this._rectangleData = null; //用于构造矩形数据
+    }
+ 
+    getCatesian3FromPX(px) {
+        var cartesian;
+        var ray = this.viewer.camera.getPickRay(px);
+        if (!ray) return null;
+        cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+        return cartesian;
+    }
+}
+ 
+export default DrawRectangle

+ 327 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawSector.js

@@ -0,0 +1,327 @@
+// DrawSector
+/*
+九、绘制扇形
+ */
+class DrawSector {
+    constructor(arg) {
+        this.viewer = arg.viewer;
+        this.Cesium = arg.Cesium;
+        this.floatingPoint = null;//标识点
+        this._sector = null; //活动扇形
+        this._sectorLast = null; //最后一个扇形
+        this._positions = [];  //活动点
+        this._entities_point = [];  //脏数据
+        this._entities_sector = [];  //脏数据
+        this._sectorData = null; //用于构造扇形数据
+        this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+        this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+		
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+		
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+    }
+
+    //返回扇形
+    get sector() {
+        return this._sectorLast;
+    }
+
+    //返回扇形数据用于加载扇形
+    getData() {
+        return this._sectorData;
+    }
+
+    // 修改编辑调用计算
+    computePosition(data){
+        let $this = this;
+        let pnts = data;
+        let center = $this.lonLatToMercator($this.cartesianToLatlng(pnts[0]));
+        let pnt2 = $this.lonLatToMercator($this.cartesianToLatlng(pnts[1]));
+        let pnt3 = $this.lonLatToMercator($this.cartesianToLatlng(pnts[2]));
+        var radius = $this.MathDistance(pnt2, center);
+        var startAngle = $this.getAzimuth(pnt2, center);
+        var endAngle = $this.getAzimuth(pnt3, center);
+        var pList = $this.getArcPoints(center, radius, startAngle, endAngle);
+        pList.push(pnts[0], pList[0]);
+        let arrow = [];
+        for (var i = 0; i < pList.length; i++) {
+            var cart3 = new $this.Cesium.Cartesian3(pList[i].x, pList[i].y, pList[i].z);
+            arrow.push(cart3);
+        }
+        var lnglatArr = [];
+        for (var d = 0; d < data.length; d++){
+            lnglatArr.push($this.cartesianToLatlng(data[d]))
+        }
+        $this._sectorData = lnglatArr;
+        return new $this.Cesium.PolygonHierarchy(arrow)
+    }
+
+    //加载扇形
+    addload(data) {
+        var $this = this;
+        let pnts = data;
+        let center = $this.lonLatToMercator(pnts[0]);
+        let pnt2 = $this.lonLatToMercator(pnts[1]);
+        let pnt3 = $this.lonLatToMercator(pnts[2]);
+        var radius = $this.MathDistance(pnt2, center);
+        var startAngle = $this.getAzimuth(pnt2, center);
+        var endAngle = $this.getAzimuth(pnt3, center);
+        var pList = $this.getArcPoints(center, radius, startAngle, endAngle);
+        let pntsc = $this.Cesium.Cartesian3.fromDegrees(pnts[0][0], pnts[0][1])
+        pList.push(pntsc, pList[0]);
+        let arrow = [];
+        for (var i = 0; i < pList.length; i++) {
+            var cart3 = new $this.Cesium.Cartesian3(pList[i].x, pList[i].y, pList[i].z);
+            arrow.push(cart3);
+        }
+        var arrowEntity = $this.viewer.entities.add({
+            Type: 'DrawSector',
+            Position: data,
+            id: data.id || $this.objId,
+            polygon: {
+                hierarchy: new $this.Cesium.PolygonHierarchy(arrow),
+                show: true,
+                fill: true,
+                clampToGround: true,
+                material: $this.Cesium.Color.AQUA.withAlpha(0.9)
+            }
+        });
+        return arrowEntity;
+    }
+
+    //开始创建
+    startCreate() {
+        var $this = this;
+        this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
+        this.handler.setInputAction(function (evt) { //单机开始绘制
+            //屏幕坐标转地形上坐标
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            // if($this._positions.length == 3) return
+            if ($this._positions.length < 3) {
+                $this.floatingPoint = $this.createPoint(cartesian);
+                $this._positions.push(cartesian);
+            }
+            if (!$this._sector) {
+                // $this.createPoint(cartesian);// 绘制点
+            }
+
+
+        }, $this.Cesium.ScreenSpaceEventType.LEFT_CLICK);
+        this.handler.setInputAction(function (evt) { //移动时绘制面
+            if ($this._positions.length < 2) return;
+            var cartesian = $this.getCatesian3FromPX(evt.endPosition);
+            if ($this._positions.length == 2) {
+                $this._positions.push(cartesian);
+            }
+            if ($this._positions.length == 3) {
+                $this._positions.pop();
+                $this._positions.push(cartesian);
+                if (!$this.Cesium.defined($this._sector)) {
+                    $this._sector = $this.createsector();
+                }
+            }
+
+        }, $this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+
+        this.handler.setInputAction(function (evt) {
+            if (!$this._sector) return;
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            $this._positions.pop();
+            $this._positions.push(cartesian);
+            $this._sectorData = $this._positions.concat();
+            $this.viewer.entities.remove($this._sector); //移除
+            $this._sector = null;
+            $this._positions = [];
+            $this.floatingPoint.position.setValue(cartesian);
+            var lnglatArr = [];
+            for (var i = 0; i < $this._sectorData.length; i++) {
+                var lnglat = $this.cartesianToLatlng($this._sectorData[i]);
+                lnglatArr.push(lnglat)
+            }
+            $this._sectorData = lnglatArr;
+            var sector = $this.addload(lnglatArr); //加载
+            $this._entities_sector.push(sector);
+            $this._sectorLast = sector;
+            $this.clearPoint();
+            $this.destroy()
+        }, $this.Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+    }
+
+    //创建直线扇形
+    createsector() {
+        // console.log(this._positions)
+        var $this = this;
+        var arrowEntity = $this.viewer.entities.add({
+            polygon: {
+                hierarchy: new $this.Cesium.CallbackProperty(
+                    function () {
+                        // if(this._positions.length < 3) return
+                        let pnts = $this._positions;
+                        let center = $this.lonLatToMercator($this.cartesianToLatlng(pnts[0]));
+                        let pnt2 = $this.lonLatToMercator($this.cartesianToLatlng(pnts[1]));
+                        let pnt3 = $this.lonLatToMercator($this.cartesianToLatlng(pnts[2]));
+                        var radius = $this.MathDistance(pnt2, center);
+                        var startAngle = $this.getAzimuth(pnt2, center);
+                        var endAngle = $this.getAzimuth(pnt3, center);
+                        var pList = $this.getArcPoints(center, radius, startAngle, endAngle);
+                        pList.push(pnts[0], pList[0]);
+                        let arrow = [];
+                        for (var i = 0; i < pList.length; i++) {
+                            var cart3 = new $this.Cesium.Cartesian3(pList[i].x, pList[i].y, pList[i].z);
+                            arrow.push(cart3);
+                        }
+
+                        return new $this.Cesium.PolygonHierarchy(pList);
+
+                    }, false),
+                show: true,
+                fill: true,
+                clampToGround: true,
+                material: $this.Cesium.Color.AQUA.withAlpha(0.5)
+            }
+        }
+        )
+        $this._entities_sector.push(arrowEntity);
+        return arrowEntity
+    }
+
+    //创建点
+    createPoint(cartesian) {
+        var $this = this;
+        var point = this.viewer.entities.add({
+            position: cartesian,
+            point: {
+                pixelSize: 10,
+                color: $this.Cesium.Color.RED,
+                heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+            }
+        });
+        $this._entities_point.push(point);
+        return point;
+    }
+
+    cartesianToLatlng(cartesian) {
+        var latlng = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+        var lat = this.Cesium.Math.toDegrees(latlng.latitude);
+        var lng = this.Cesium.Math.toDegrees(latlng.longitude);
+        return [lng, lat];
+    }
+    /**
+     * 经纬度坐标转墨卡托坐标
+     */
+    // 墨卡托坐标系:展开地球,赤道作为x轴,向东为x轴正方,本初子午线作为y轴,向北为y轴正方向。
+    // 数字20037508.34是地球赤道周长的一半:地球半径6378137米,赤道周长2*PI*r = 2 * 20037508.3427892,墨卡托坐标x轴区间[-20037508.3427892,20037508.3427892]
+    lonLatToMercator(Latlng) {
+        var E = Latlng[0];
+        var N = Latlng[1];
+        var x = E * 20037508.34 / 180;
+        var y = Math.log(Math.tan((90 + N) * Math.PI / 360)) / (Math.PI / 180);
+        y = y * 20037508.34 / 180;
+        return [x, y]
+    }
+
+    WebMercator2lonLat(mercator) {
+        let x = mercator[0] / 20037508.34 * 180;
+        let ly = mercator[1] / 20037508.34 * 180;
+        let y = 180 / Math.PI * (2 * Math.atan(Math.exp(ly * Math.PI / 180)) - Math.PI / 2)
+        return [x, y];
+    }
+
+    //销毁
+    destroy() {
+        if (this.handler) {
+            this.handler.destroy();
+            this.handler = null;
+        }
+    }
+
+    clearPoint() {
+        this.DrawEndEvent.raiseEvent(this._sectorLast, this._sectorData);
+        for (var i = 0; i < this._entities_point.length; i++) {
+            this.viewer.entities.remove(this._entities_point[i]);
+        }
+        this._entities_point = [];  //脏数据
+    }
+
+    //清空实体对象
+    clear() {
+        for (var i = 0; i < this._entities_point.length; i++) {
+            this.viewer.entities.remove(this._entities_point[i]);
+        }
+        for (var i = 0; i < this._entities_sector.length; i++) {
+            this.viewer.entities.remove(this._entities_sector[i]);
+        }
+        this.floatingPoint = null;//标识点
+        this._sector = null; //活动扇形
+        this._sectorLast = null; //最后一个扇形
+        this._positions = [];  //活动点
+        this._entities_point = [];  //脏数据
+        this._entities_sector = [];  //脏数据
+        this._sectorData = null; //用于构造扇形数据
+    }
+
+    getCatesian3FromPX(px) {
+        var cartesian;
+        var ray = this.viewer.camera.getPickRay(px);
+        if (!ray) return null;
+        cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+        return cartesian;
+    }
+
+    // 求取扇形坐标函数/
+    //扇形配置函数
+    MathDistance(pnt1, pnt2) {
+        return Math.sqrt(Math.pow(pnt1[0] - pnt2[0], 2) + Math.pow(pnt1[1] - pnt2[1], 2));
+    }
+
+    getAzimuth(startPoint, endPoint) {
+        var azimuth;
+        var angle = Math.asin(Math.abs(endPoint[1] - startPoint[1]) / this.MathDistance(startPoint, endPoint));
+
+        if (endPoint[1] >= startPoint[1] && endPoint[0] >= startPoint[0]) {
+            azimuth = angle + Math.PI;
+        } else if (endPoint[1] >= startPoint[1] && endPoint[0] < startPoint[0]) {
+            azimuth = Math.PI * 2 - angle;
+        } else if (endPoint[1] < startPoint[1] && endPoint[0] < startPoint[0]) {
+            azimuth = angle;
+        } else if (endPoint[1] < startPoint[1] && endPoint[0] >= startPoint[0]) {
+            azimuth = Math.PI - angle;
+        }
+
+        return azimuth;
+    }
+
+
+    getArcPoints(center, radius, startAngle, endAngle) {
+        var x = null,
+            y = null,
+            z = null,
+            pnts = [],
+            angleDiff = endAngle - startAngle;
+        angleDiff = angleDiff < 0 ? angleDiff + Math.PI * 2 : angleDiff;
+
+        for (var i = 0; i <= 100; i++) {
+            var angle = startAngle + angleDiff * i / 100;
+            x = center[0] + radius * Math.cos(angle);
+            y = center[1] + radius * Math.sin(angle);
+            let latlon = this.WebMercator2lonLat([x, y])
+            pnts.push(this.Cesium.Cartesian3.fromDegrees(latlon[0], latlon[1]));
+        }
+        return pnts;
+    }
+}
+
+export default DrawSector

+ 348 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawStraightArrow.js

@@ -0,0 +1,348 @@
+import {
+	createTooltip
+} from "../../../common/common.js";
+
+//    七、直线箭头
+// DrawStraightArrow
+/*
+绘制直线箭头
+ */
+class DrawStraightArrow {
+	constructor(arg) {
+		this.viewer = arg.viewer;
+		this.Cesium = arg.Cesium;
+		this.floatingPoint = null; //标识点
+		this._straightArrow = null; //活动箭头
+		this._straightArrowLast = null; //最后一个箭头
+		this._positions = []; //活动点
+		this._entities_point = []; //脏数据
+		this._entities_straightArrow = []; //脏数据
+		this._straightArrowData = null; //用于构造箭头数据
+		this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+		this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+
+		this._tooltip = createTooltip(this.viewer.container);
+
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+	}
+
+	//返回箭头
+	get straightArrow() {
+		return this._straightArrowLast;
+	}
+
+	//返回箭头数据用于加载箭头
+	getData() {
+		return this._straightArrowData;
+	}
+
+	// 修改编辑调用计算
+	computePosition(data) {
+		var $this = this;
+		var length = data.length;
+		var p1 = data[0];
+		var p2 = data[length - 1];
+		var firstPoint = $this.cartesianToLatlng(p1);
+		var endPoints = $this.cartesianToLatlng(p2);
+		var arrow = [];
+		var res = $this.fineArrow([firstPoint[0], firstPoint[1]], [endPoints[0], endPoints[1]]);
+		for (var i = 0; i < res.length; i++) {
+			var cart3 = new $this.Cesium.Cartesian3(res[i].x, res[i].y, res[i].z);
+			arrow.push(cart3);
+		}
+		$this._straightArrowData = [firstPoint, endPoints];
+		return new $this.Cesium.PolygonHierarchy(arrow);
+	}
+
+	//加载箭头
+	addload(data) {
+		var $this = this;
+		if (data.length < 2) {
+			return null;
+		}
+		var length = data.length;
+		var p1 = data[0];
+		var p2 = data[length - 1];
+		var arrow = [];
+		var res = $this.fineArrow([p1[0], p1[1]], [p2[0], p2[1]]);
+		for (var i = 0; i < res.length; i++) {
+			var cart3 = new $this.Cesium.Cartesian3(res[i].x, res[i].y, res[i].z);
+			arrow.push(cart3);
+		}
+		var arrowEntity = $this.viewer.entities.add({
+			Type: 'DrawStraightArrow',
+			Position: data,
+			id: data.id || $this.objId,
+			polygon: {
+				hierarchy: new $this.Cesium.PolygonHierarchy(arrow),
+				show: true,
+				fill: true,
+				clampToGround: true,
+				material: $this.polygonMaterial
+			}
+		});
+		return arrowEntity;
+	}
+
+	//开始创建
+	startCreate(drawType) {
+		this.drawType = drawType;
+		var $this = this;
+		this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
+		this.handler.setInputAction(function(evt) { //单机开始绘制
+			//屏幕坐标转地形上坐标
+			var cartesian = $this.getCatesian3FromPX(evt.position);
+			if ($this._positions.length == 0) {
+				$this._positions.push(cartesian.clone());
+				$this.floatingPoint = $this.createPoint(cartesian);
+				$this._positions.push(cartesian);
+			}
+			if (!$this._straightArrow) {
+				$this.createPoint(cartesian); // 绘制点
+			} else {
+				$this._straightArrowData = $this._positions.concat();
+				$this.viewer.entities.remove($this._straightArrow); //移除
+				$this._straightArrow = null;
+				$this._positions = [];
+				$this.floatingPoint.position.setValue(cartesian);
+				var lnglatArr = [];
+				for (var i = 0; i < $this._straightArrowData.length; i++) {
+					var lnglat = $this.cartesianToLatlng($this._straightArrowData[i]);
+					lnglatArr.push(lnglat)
+				}
+				$this._straightArrowData = lnglatArr;
+				var straightArrow = $this.addload($this._straightArrowData); //加载
+				$this._entities_straightArrow.push(straightArrow);
+				$this._straightArrowLast = straightArrow;
+				$this.clearPoint();
+				$this.destroy();
+				
+				$this._tooltip.setVisible(false);
+			}
+
+		}, $this.Cesium.ScreenSpaceEventType.LEFT_CLICK);
+		this.handler.setInputAction(function(evt) { //移动时绘制面
+			$this._tooltip.showAt(evt.endPosition, "点击开始绘制");
+
+			if ($this._positions.length < 2) return;
+			
+			$this._tooltip.showAt(evt.endPosition, "点击结束绘制");
+			
+			var cartesian = $this.getCatesian3FromPX(evt.endPosition);
+			if (!$this.Cesium.defined($this._straightArrow)) {
+				$this._straightArrow = $this.createStraightArrow();
+			}
+			$this.floatingPoint.position.setValue(cartesian);
+			if ($this._straightArrow) {
+				$this._positions.pop();
+				$this._positions.push(cartesian);
+			}
+		}, $this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+
+		// this.handler.setInputAction(function(evt) {
+		// 	if (!$this._straightArrow) return;
+		// 	var cartesian = $this.getCatesian3FromPX(evt.position);
+		// 	$this._positions.pop();
+		// 	$this._positions.push(cartesian);
+		// 	$this._straightArrowData = $this._positions.concat();
+		// 	$this.viewer.entities.remove($this._straightArrow); //移除
+		// 	$this._straightArrow = null;
+		// 	$this._positions = [];
+		// 	$this.floatingPoint.position.setValue(cartesian);
+		// 	var lnglatArr = [];
+		// 	for (var i = 0; i < $this._straightArrowData.length; i++) {
+		// 		var lnglat = $this.cartesianToLatlng($this._straightArrowData[i]);
+		// 		lnglatArr.push(lnglat)
+		// 	}
+		// 	$this._straightArrowData = lnglatArr;
+		// 	var straightArrow = $this.addload($this._straightArrowData); //加载
+		// 	$this._entities_straightArrow.push(straightArrow);
+		// 	$this._straightArrowLast = straightArrow;
+		// 	$this.clearPoint();
+		// 	$this.destroy()
+		// }, $this.Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+	}
+
+	//创建直线箭头
+	createStraightArrow() {
+		var $this = this;
+		var arrowEntity = $this.viewer.entities.add({
+			polygon: {
+				hierarchy: new $this.Cesium.CallbackProperty(
+					function() {
+						// return new $this.Cesium.PolygonHierarchy($this._positions);
+						var length = $this._positions.length;
+						var p1 = $this._positions[0];
+						var p2 = $this._positions[length - 1];
+						var firstPoint = $this.cartesianToLatlng(p1);
+						var endPoints = $this.cartesianToLatlng(p2);
+						var arrow = [];
+						var res = $this.fineArrow([firstPoint[0], firstPoint[1]], [endPoints[0], endPoints[1]]);
+						for (var i = 0; i < res.length; i++) {
+							var cart3 = new $this.Cesium.Cartesian3(res[i].x, res[i].y, res[i].z);
+							arrow.push(cart3);
+						}
+						return new $this.Cesium.PolygonHierarchy(arrow);
+
+					}, false),
+				show: true,
+				fill: true,
+				clampToGround: true,
+				material: $this.polygonMaterial
+			}
+		})
+		$this._entities_straightArrow.push(arrowEntity);
+		return arrowEntity
+	}
+
+	//创建点
+	createPoint(cartesian) {
+		var $this = this;
+		var point = this.viewer.entities.add({
+			position: cartesian,
+			point: {
+				pixelSize: 10,
+				color: $this.Cesium.Color.RED,
+				heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+			}
+		});
+		$this._entities_point.push(point);
+		return point;
+	}
+
+	cartesianToLatlng(cartesian) {
+		var latlng = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+		var lat = this.Cesium.Math.toDegrees(latlng.latitude);
+		var lng = this.Cesium.Math.toDegrees(latlng.longitude);
+		return [lng, lat];
+	}
+
+	//销毁
+	destroy() {
+		if (this.handler) {
+			this.handler.destroy();
+			this.handler = null;
+		}
+	}
+
+	clearPoint() {
+		this.DrawEndEvent.raiseEvent(this._straightArrowLast, this._straightArrowData, this.drawType);
+		for (var i = 0; i < this._entities_point.length; i++) {
+			this.viewer.entities.remove(this._entities_point[i]);
+		}
+		this._entities_point = []; //脏数据
+	}
+
+	//清空实体对象
+	clear() {
+		for (var i = 0; i < this._entities_point.length; i++) {
+			this.viewer.entities.remove(this._entities_point[i]);
+		}
+		for (var i = 0; i < this._entities_straightArrow.length; i++) {
+			this.viewer.entities.remove(this._entities_straightArrow[i]);
+		}
+
+		this.floatingPoint = null; //标识点
+		this._straightArrow = null; //活动箭头
+		this._straightArrowLast = null; //最后一个箭头
+		this._positions = []; //活动点
+		this._entities_point = []; //脏数据
+		this._entities_straightArrow = []; //脏数据
+		this._straightArrowData = null; //用于构造箭头数据
+	}
+
+	getCatesian3FromPX(px) {
+		var cartesian;
+		var ray = this.viewer.camera.getPickRay(px);
+		if (!ray) return null;
+		cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+		return cartesian;
+	}
+
+	// 求取箭头坐标函数/
+	//箭头配置函数
+	fineArrowDefualParam() {
+		return {
+			tailWidthFactor: 0.15,
+			neckWidthFactor: 0.20,
+			headWidthFactor: 0.25,
+			headAngle: Math.PI / 8.5,
+			neckAngle: Math.PI / 13
+		}
+	}
+
+	fineArrow(tailPoint, headerPoint) {
+		var $this = this;
+		if ((tailPoint.length < 2) || (headerPoint.length < 2)) return;
+		//画箭头的函数
+		let tailWidthFactor = $this.fineArrowDefualParam().tailWidthFactor;
+		let neckWidthFactor = $this.fineArrowDefualParam().neckWidthFactor;
+		let headWidthFactor = $this.fineArrowDefualParam().headWidthFactor;
+		let headAngle = $this.fineArrowDefualParam().headAngle;
+		let neckAngle = $this.fineArrowDefualParam().neckAngle;
+		var o = [];
+		o[0] = tailPoint;
+		o[1] = headerPoint;
+		var e = o[0],
+			r = o[1],
+			n = $this.getBaseLength(o),
+			g = n * tailWidthFactor,
+			//尾部宽度因子
+			i = n * neckWidthFactor,
+			//脖子宽度银子
+			s = n * headWidthFactor,
+			//头部宽度因子
+			a = $this.getThirdPoint(r, e, Math.PI / 2, g, !0),
+			l = $this.getThirdPoint(r, e, Math.PI / 2, g, !1),
+			u = $this.getThirdPoint(e, r, headAngle, s, !1),
+			c = $this.getThirdPoint(e, r, headAngle, s, !0),
+			p = $this.getThirdPoint(e, r, neckAngle, i, !1),
+			h = $this.getThirdPoint(e, r, neckAngle, i, !0),
+			d = [];
+		d.push(a[0], a[1], p[0], p[1], u[0], u[1], r[0], r[1], c[0], c[1], h[0], h[1], l[0], l[1], e[0], e[1]);
+		return $this.Cesium.Cartesian3.fromDegreesArray(d);
+	}
+
+	getBaseLength(t) {
+		return Math.pow(this.wholeDistance(t), .99)
+	}
+
+	wholeDistance(t) {
+		for (var o = 0, e = 0; e < t.length - 1; e++) o += this.distance(t[e], t[e + 1]);
+		return o
+	}
+
+	distance(t, o) {
+		return Math.sqrt(Math.pow(t[0] - o[0], 2) + Math.pow(t[1] - o[1], 2))
+	}
+
+	getThirdPoint(t, o, e, r, n) {
+		var g = this.getAzimuth(t, o),
+			i = n ? g + e : g - e,
+			s = r * Math.cos(i),
+			a = r * Math.sin(i);
+		return [o[0] + s, o[1] + a]
+	}
+
+	getAzimuth(t, o) {
+		var e, r = Math.asin(Math.abs(o[1] - t[1]) / this.distance(t, o));
+		return o[1] >= t[1] && o[0] >= t[0] ? e = r + Math.PI : o[1] >= t[1] && o[0] < t[0] ? e = 2 * Math.PI - r : o[1] < t[1] && o[0] < t[0] ? e = r : o[1] < t[1] && o[0] >= t[0] && (e = Math.PI - r), e
+	}
+}
+
+export default DrawStraightArrow

+ 286 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/DrawTriangleFlag.js

@@ -0,0 +1,286 @@
+
+// DrawTriangleFlag
+/*
+绘制三角形旗帜
+ */
+class DrawTriangleFlag {
+    constructor(arg) {
+        this.viewer = arg.viewer;
+        this.Cesium = arg.Cesium;
+        this.identificationPoint = null; //标识点位
+        this.TriangleFlag = null; 
+        this.TriangleFlagLast = null; // 三角形旗帜数据
+        this.positions = [];  // 经纬度
+        this.entitiesPoint = [];   // 实体点位
+        this.entitiesTriangleFlag = [];  
+        this.TriangleFlagData = null; 
+        this.DrawStartEvent = new Cesium.Event(); //开始绘制事件
+        this.DrawEndEvent = new Cesium.Event(); //结束绘制事件 
+		
+		/* 通用参数集合 */
+		this._param = {
+			id: "DrawStraightArrow",
+			polygonColor: 'rgba(0,255,0,0.5)', //面填充颜色
+			outlineColor: 'rgba(255, 255, 255, 1)', //边框颜色
+			outlineWidth: 1, //边框宽度
+		}
+		
+		/* 创建面材质 */
+		this.polygonMaterial = Cesium.Color.fromCssColorString(this._param.polygonColor);
+		/* 创建线材质 */
+		// this.outlineMaterial = new Cesium.PolylineDashMaterialProperty({//曲线
+		// 	dashLength: 16,
+		// 	color: Cesium.Color.fromCssColorString(this._param.outlineColor)
+		// });
+		this.outlineMaterial = Cesium.Color.fromCssColorString(this._param.outlineColor);
+    }
+ 
+    //返回三角形旗帜数据
+    getData() {
+        return this.TriangleFlagData;
+    }
+
+    // 修改编辑调用计算
+    computePosition(data){
+        //计算面
+        let $this = this
+        var lnglatArr = [];
+        for (var i = 0; i < data.length; i++) {
+            var lnglat = $this.cartesianToLatlng(data[i]);
+            lnglatArr.push(lnglat)
+        }
+        let startPoint = lnglatArr[0];
+        // 取最后一个
+        let endPoint =lnglatArr[lnglatArr.length - 1]
+        let point0 = lnglatArr[0];
+        var point1 = [endPoint[0], (startPoint[1] + endPoint[1]) / 2]
+        var point2 = [startPoint[0], (startPoint[1] + endPoint[1]) / 2]
+        var point3 =[startPoint[0], endPoint[1]]
+        let componentspolygon = $this.Cesium.Cartesian3.fromDegreesArray([...point0, ...point1, ...point2, ...point0])
+        let componentspolyline = $this.Cesium.Cartesian3.fromDegreesArray([...point0, ...point1, ...point2, ...point0,...point3])
+        let PolygonHierarchy = new $this.Cesium.PolygonHierarchy(componentspolygon)
+        $this.TriangleFlagData = lnglatArr;
+        console.log([PolygonHierarchy,componentspolyline])
+        return [PolygonHierarchy,componentspolyline];
+    }
+ 
+    //加载
+    addload(data) {
+        var $this = this;
+        if (data.length < 2) return;
+        let startPoint = data[0];
+        // 取最后一个
+        let endPoint =data[data.length - 1]
+        let point0 = data[0];
+        var point1 = [endPoint[0], (startPoint[1] + endPoint[1]) / 2]
+        var point2 = [startPoint[0], (startPoint[1] + endPoint[1]) / 2]
+        var point3 =[startPoint[0], endPoint[1]]
+        let componentspolygon = $this.Cesium.Cartesian3.fromDegreesArray([...point0, ...point1, ...point2, ...point0])
+        let componentspolyline = $this.Cesium.Cartesian3.fromDegreesArray([...point0, ...point1, ...point2, ...point0,...point3])
+        var shape = this.viewer.entities.add({
+            Type:'DrawTriangleFlag',
+            Position:data,
+            id:data.id || $this.objId,
+            polygon: {
+                hierarchy: new $this.Cesium.PolygonHierarchy(componentspolygon),
+                extrudedHeight: 1,
+                material: $this.Cesium.Color.RED,
+            },
+            polyline: {
+                //使用cesium的peoperty
+                positions: componentspolyline,
+                show: true,
+                material: $this.Cesium.Color.YELLOW,
+                width: 5,
+                clampToGround: true
+            }
+        });
+        $this.entitiesTriangleFlag.push(shape);
+        return shape;
+    }
+ 
+    //开始创建
+    startCreate(drawType) {
+        this.drawType = drawType;
+        var $this = this;
+        this.handler = new this.Cesium.ScreenSpaceEventHandler(this.viewer.scene.canvas);
+        this.handler.setInputAction(function (evt) { //单机开始绘制
+            //屏幕坐标转地形上坐标
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            if ($this.positions.length == 0) {
+                $this.positions.push(cartesian.clone());
+                $this.identificationPoint = $this.createPoint(cartesian);
+                $this.createPoint(cartesian);// 绘制点
+                $this.positions.push(cartesian);
+            }
+            // if ($this.positions.length == 2) {
+            //     $this.positions.push(cartesian);
+            // }
+            
+        }, $this.Cesium.ScreenSpaceEventType.LEFT_CLICK);
+        this.handler.setInputAction(function (evt) { //移动时绘制线
+            if ($this.positions.length < 2) return;
+            var cartesian = $this.getCatesian3FromPX(evt.endPosition);
+            if (!$this.Cesium.defined($this.TriangleFlag)) {
+                $this.TriangleFlag = $this.createTriangleFlag();
+            }
+            $this.identificationPoint.position.setValue(cartesian);
+            if ($this.TriangleFlag) {
+                $this.positions.pop();
+                $this.positions.push(cartesian);
+            }
+        }, $this.Cesium.ScreenSpaceEventType.MOUSE_MOVE);
+        this.handler.setInputAction(function (evt) {
+            if (!$this.TriangleFlag) return;
+            var cartesian = $this.getCatesian3FromPX(evt.position);
+            $this.positions.pop();
+            $this.positions.push(cartesian);
+            $this.createPoint(cartesian);// 绘制点
+            $this.TriangleFlagData = $this.positions.concat();
+            $this.viewer.entities.remove($this.TriangleFlag); //移除
+            $this.TriangleFlag = null;
+            $this.positions = [];
+            $this.identificationPoint.position.setValue(cartesian);
+            var lnglatArr = [];
+            for (var i = 0; i < $this.TriangleFlagData.length; i++) {
+                var lnglat = $this.cartesianToLatlng($this.TriangleFlagData[i]);
+                lnglatArr.push(lnglat)
+            }
+            $this.TriangleFlagData = lnglatArr;
+            var TriangleFlag = $this.addload([$this.TriangleFlagData[0],$this.TriangleFlagData[$this.TriangleFlagData.length -1 ]]); //加载
+            $this.entitiesTriangleFlag.push(TriangleFlag);
+            $this.TriangleFlagLast = TriangleFlag;
+            $this.clearPoint();
+            $this.destroy()
+        }, $this.Cesium.ScreenSpaceEventType.RIGHT_CLICK);
+    }
+ 
+    //创建点
+    createPoint(cartesian) {
+        var $this = this;
+        var point = this.viewer.entities.add({
+            position: cartesian,
+            point: {
+                pixelSize: 10,
+                color: $this.Cesium.Color.RED,
+                heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,
+            }
+        });
+        $this.entitiesPoint.push(point);
+        return point;
+    }
+ 
+    //创建三角形旗帜
+    createTriangleFlag() {
+        console.log('232323')
+        var $this = this;
+        var polygon = this.viewer.entities.add({
+            polygon: {
+                hierarchy: new $this.Cesium.CallbackProperty(function () {
+                    if($this.positions.length < 2) return 
+                    let lonlat = [];
+                    let length = $this.positions.length
+                    for (let i=0; i<length; i++){
+                        lonlat.push($this.cartesianToLatlng($this.positions[i]))
+                    }
+                    let startPoint = lonlat[0]
+                    // 取最后一个
+                    let endPoint =lonlat[lonlat.length - 1]
+                    let point0 = lonlat[0];
+                    var point1 = [endPoint[0], (startPoint[1] + endPoint[1]) / 2]
+                    var point2 = [startPoint[0], (startPoint[1] + endPoint[1]) / 2]
+                    var point3 =[startPoint[0], endPoint[1]]
+
+                    let components = $this.Cesium.Cartesian3.fromDegreesArray([...point0, ...point1, ...point2, ...point0])
+                    
+                    return new $this.Cesium.PolygonHierarchy(components);
+                }, false),
+                extrudedHeight: 1,
+                material: $this.Cesium.Color.RED,
+            },
+            polyline: {
+                //使用cesium的peoperty
+                positions: new $this.Cesium.CallbackProperty(function () {
+                    if($this.positions.length < 2) return 
+                    let lonlat = [];
+                    let length = $this.positions.length
+                    for (let i=0; i<length; i++){
+                        lonlat.push($this.cartesianToLatlng($this.positions[i]))
+                    }
+                    let startPoint = lonlat[0]
+                    // 取最后一个
+                    let endPoint =lonlat[lonlat.length - 1]
+                    let point0 = lonlat[0];
+                    var point1 = [endPoint[0], (startPoint[1] + endPoint[1]) / 2]
+                    var point2 = [startPoint[0], (startPoint[1] + endPoint[1]) / 2]
+                    var point3 =[startPoint[0], endPoint[1]]
+
+                    let components = $this.Cesium.Cartesian3.fromDegreesArray([...point0, ...point1, ...point2, ...point0,...point3])
+                    return components
+                }, false),
+                show: true,
+                material: $this.Cesium.Color.YELLOW,
+                width: 5,
+                clampToGround: true
+            }
+        });
+        $this.entitiesTriangleFlag.push(polygon);
+        return polygon;
+    }
+
+    cartesianToLatlng(cartesian) {
+        var latlng = this.viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
+        var lat = this.Cesium.Math.toDegrees(latlng.latitude);
+        var lng = this.Cesium.Math.toDegrees(latlng.longitude);
+        return [lng, lat];
+    }
+
+    LatlngTocartesian(latlng) {
+        let cartesian3 = this.Cesium.Cartesian3.fromDegrees(latlng[0], latlng[1]);
+        return cartesian3
+    }
+
+    clearPoint() {
+        this.DrawEndEvent.raiseEvent(this.TriangleFlagLast, [this.TriangleFlagData[0],this.TriangleFlagData[this.TriangleFlagData.length -1 ]], this.drawType);
+        for (var i = 0; i < this.entitiesPoint.length; i++) {
+            this.viewer.entities.remove(this.entitiesPoint[i]);
+        }
+        this.entitiesPoint = [];  //脏数据
+    }
+ 
+    //销毁
+    destroy() {
+        if (this.handler) {
+            this.handler.destroy();
+            this.handler = null;
+        }
+    }
+ 
+    //清空实体对象
+    clear() {
+        for (var i = 0; i < this.entitiesPoint.length; i++) {
+            this.viewer.entities.remove(this.entitiesPoint[i]);
+        }
+        for (var i = 0; i < this.entitiesTriangleFlag.length; i++) {
+            this.viewer.entities.remove(this.entitiesTriangleFlag[i]);
+        }
+        this.identificationPoint = null; //标识点位
+        this.TriangleFlag = null; 
+        this.TriangleFlagLast = null; // 三角形旗帜数据
+        this.positions = [];  // 经纬度
+        this.entitiesPoint = [];   // 实体点位
+        this.entitiesTriangleFlag = [];  
+        this.TriangleFlagData = null; 
+    }
+ 
+    getCatesian3FromPX(px) {
+        var cartesian;
+        var ray = this.viewer.camera.getPickRay(px);
+        if (!ray) return null;
+        cartesian = this.viewer.scene.globe.pick(ray, this.viewer.scene);
+        return cartesian;
+    }
+}
+ 
+export default DrawTriangleFlag
+

+ 47 - 0
src/jtMap3d/Widgets/DrawTools/MilitaryPlot/drawingMethod/index.js

@@ -0,0 +1,47 @@
+import DrawStraightArrow from './DrawStraightArrow';
+import DrawAttackArrow from './DrawAttackArrow';
+import DrawPincerArrow from './DrawPincerArrow';
+import DrawGatheringPlace from './DrawGatheringPlace';
+import DrawClosedCurve from './DrawClosedCurve';
+import DrawSector from './DrawSector';
+
+import DrawArc from './DrawArc';
+import DrawLune from './DrawLune';
+
+import DrawCurve from './DrawCurve';
+import DrawCurveFlag from './DrawCurveFlag';
+import DrawRectFlag from './DrawRectFlag';
+import DrawTriangleFlag from './DrawTriangleFlag';
+
+import DrawPoint from './DrawPoint';
+import DrawPolyline from './DrawPolyline';
+import DrawPolygon from './DrawPolygon';
+import DrawRectangle from './DrawRectangle';
+import DrawCircle from './DrawCircle';
+
+
+let MilitaryPlot = {
+	DrawStraightArrow, // 绘制直线箭头
+	DrawAttackArrow, //绘制攻击箭头
+	DrawPincerArrow, //绘制钳击箭头
+	DrawGatheringPlace, // 绘制集结地
+	DrawClosedCurve, //绘制闭合曲面
+
+	DrawSector, //绘制扇形
+
+	DrawArc, // 绘制弓形
+	DrawLune, // 绘制弓形面
+
+	DrawCurve, //绘制曲线
+	DrawCurveFlag, //绘制曲线旗帜
+	DrawRectFlag, //绘制矩形直角旗帜
+	DrawTriangleFlag, //绘制三角旗帜
+
+	DrawPoint, //绘制点
+	DrawPolyline, // 绘制线
+	DrawPolygon, // 多边形
+	DrawRectangle, // 绘制矩形
+	DrawCircle, //绘制圆
+}
+
+export default MilitaryPlot

+ 6 - 6
src/jtMap3d/Widgets/SpatialAnalysis/Cutting.js

@@ -204,7 +204,7 @@ Object.assign(Cutting.prototype, /** @lends Cutting.prototype */ {
 
 		//转换矩阵
 		let inverseTransform = _self._getInverseTransform(tileset)
-		debugger
+		
 		// clippingPlane集合
 		// _self.polygon = _self._isDirRes(_self.polygon, false)
 		const clippingPlanes1 = []
@@ -283,7 +283,7 @@ Object.assign(Cutting.prototype, /** @lends Cutting.prototype */ {
 					clippingPlanes.modelMatrix = Cesium.Matrix4.fromTranslation(new Cesium.Cartesian3(0.0, 0.0, height));
 				}
 
-				debugger
+				
 				for (let i = 0; i < clippingPlanes.length; ++i) {
 					const plane = clippingPlanes.get(i);
 					// let plane = _self._createPlane([121.55814450142213, 37.39658788787028], [121.65814450142213, 37.49658788787028], inverseTransform)
@@ -353,7 +353,7 @@ Object.assign(Cutting.prototype, /** @lends Cutting.prototype */ {
 		return tileset.readyPromise.then(function() {
 			//转换矩阵
 			let inverseTransform = _self._getInverseTransform(tileset)
-			debugger
+			
 			// clippingPlane集合
 			_self.polygon = _self._isDirRes(_self.polygon, false)
 			const clippingPlanes1 = []
@@ -383,7 +383,7 @@ Object.assign(Cutting.prototype, /** @lends Cutting.prototype */ {
 
 			let boundingSphere = tileset.boundingSphere; //外包球
 			let radius = boundingSphere.radius; //外包球半径
-			debugger
+			
 
 			// 遍历添加裁切面模型
 			for (let i = 0; i < clippingPlanes.length; ++i) {
@@ -475,7 +475,7 @@ Object.assign(Cutting.prototype, /** @lends Cutting.prototype */ {
 
 			let boundingSphere = tileset.boundingSphere; //外包球
 			let radius = boundingSphere.radius; //外包球半径
-			debugger
+			
 
 			// // 遍历添加裁切面模型
 			// for (let i = 0; i < clippingPlanes.length; ++i) {
@@ -512,7 +512,7 @@ Object.assign(Cutting.prototype, /** @lends Cutting.prototype */ {
 	 * 移除裁切面
 	 */
 	toggleClipping() {
-		// debugger
+	
 		let _self = this;
 		// 	if (_self.isShowTileSet) {
 		// _self.tileset.clippingPlanes = null;

+ 3 - 5
src/jtMap3d/Widgets/SpatialAnalysis/GeologyClipPlan.js

@@ -141,7 +141,7 @@ Object.assign(GeologyClipPlan.prototype, /** @lends GeologyClipPlan.prototype */
 
 				let boundingSphere = tileset.boundingSphere; //外包球
 				let radius = boundingSphere.radius; //外包球半径
-				debugger
+				
 
 				if (
 					!Cesium.Matrix4.equals( // Cesium.Matrix4.equals(a,b)判断两个四维矩阵是否相等
@@ -173,8 +173,6 @@ Object.assign(GeologyClipPlan.prototype, /** @lends GeologyClipPlan.prototype */
 					clippingPlanes.modelMatrix = Cesium.Matrix4.fromTranslation(new Cesium.Cartesian3(0.0, 0.0, height));
 				}
 
-				// debugger
-
 				//中心点
 				// let entity = viewer.entities.add({
 				// 	position: Cartesian33,
@@ -228,7 +226,7 @@ Object.assign(GeologyClipPlan.prototype, /** @lends GeologyClipPlan.prototype */
 				let lat = Cesium.Math.toDegrees(cartographic.latitude);
 				let alt = cartographic.height; //模型高度
 				var Cartesian33 = Cesium.Cartesian3.fromDegrees(lng, lat, 105)
-				debugger
+				
 
 				// 遍历添加裁切面模型
 				for (let i = 0; i < clippingPlanes.length; ++i) {
@@ -279,7 +277,7 @@ Object.assign(GeologyClipPlan.prototype, /** @lends GeologyClipPlan.prototype */
 		// // 	_self.tileset._clippingPlanes = _self.clippingPlanes;
 		// // 	_self.isShowTileSet = true;
 		// // }
-		debugger
+		
 		for (let i = 0; i < _self.planeEntities.length; i++) {
 			_self._viewer.entities.remove(_self.planeEntities[i]);
 		}

+ 136 - 133
src/jtMap3d/Widgets/SpatialAnalysis/SightLine.js

@@ -100,7 +100,7 @@ class SightLine {
 		buttonDiv.style.position = 'absolute';
 		buttonDiv.style.bottom = '150px';
 		buttonDiv.style.right = '10px';
-		
+
 		// let btnUndo = document.createElement('button');
 		// btnUndo.id = "btnDrawBackout";
 		// btnUndo.style.height = '30px';
@@ -113,7 +113,7 @@ class SightLine {
 		// btnUndo.style.fontSize = '13px';
 		// btnUndo.style.cursor = 'pointer';
 		// buttonDiv.appendChild(btnUndo);
-		
+
 		let btnCompletion = document.createElement('button');
 		btnCompletion.id = "btnDrawComplete";
 		btnCompletion.style.height = '30px';
@@ -125,7 +125,7 @@ class SightLine {
 		btnCompletion.style.fontSize = '13px';
 		btnCompletion.style.cursor = 'pointer';
 		buttonDiv.appendChild(btnCompletion);
-		
+
 		/* 加入到页面 */
 		document.body.appendChild(buttonDiv);
 	}
@@ -208,151 +208,154 @@ Object.assign(SightLine.prototype, /** @lends SightLine.prototype */ {
 
 		_self.handler = new Cesium.ScreenSpaceEventHandler(_self._viewer.canvas);
 		_self.handler.setInputAction((event) => {
-			let cartesian = CoordTransform.getCatesian3FromPX(_self._viewer, event.position);
+			let loc = CoordTransform._transfromFromScreenPoint(_self._viewer, event.position);
 			toolTip = "左键创建视角终点,右键结束通视分析";
 			if (this._isRuntimeApp()) {
 				toolTip = "再次单击创建视角终点";
 				_self._showTooltipMessage(toolTip);
 			}
 
-			if (cartesian) {
-				if (!_self._resultObject.viewPoint) {
-					_self._resultObject.viewPoint = cartesian;
-					let pointEntity = _self._viewer.entities.add({
-						position: cartesian,
-						point: {
-							color: Cesium.Color.YELLOW,
-							pixelSize: 5,
-						},
-						//文字标签
-						label: {
-							text: "观察位置",
-							font: '12px sans-serif',
-							fillColor: new Cesium.Color(255/255, 255/255, 255/255, 1.0),
-							outlineColor: new Cesium.Color(0, 154/255, 94/255, 1.0),
-							style: Cesium.LabelStyle.FILL_AND_OUTLINE,
-							outlineWidth: 1.0,
-							verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
-							pixelOffset: new Cesium.Cartesian2(0, -28),
-							showBackground: true,
-							backgroundColor: new Cesium.Color(0, 0, 0, 0.6),
-							disableDepthTestDistance: Number.POSITIVE_INFINITY,
-						},
-					});
-					_self._resultObject.objectExclude.push(pointEntity);
-					_self._resultObject.entities.push(pointEntity);
-				} else {
-					_self._resultObject.targetPoint = cartesian;
-					let pointEntity = _self._viewer.entities.add({
-						position: cartesian,
-						point: {
-							color: Cesium.Color.YELLOW,
-							pixelSize: 5,
-						},
-						//文字标签
-						label: {
-							text: "目标位置",
-							font: '12px sans-serif',
-							fillColor: new Cesium.Color(255/255, 255/255, 255/255, 1.0),
-							outlineColor: new Cesium.Color(0, 154/255, 94/255, 1.0),
-							style: Cesium.LabelStyle.FILL_AND_OUTLINE,
-							outlineWidth: 1.0,
-							verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
-							pixelOffset: new Cesium.Cartesian2(0, -28),
-							showBackground: true,
-							backgroundColor: new Cesium.Color(0, 0, 0, 0.6),
-							disableDepthTestDistance: Number.POSITIVE_INFINITY,
-						},
-					});
-					_self._resultObject.objectExclude.push(pointEntity);
-					_self._resultObject.entities.push(pointEntity);
-					let direction = Cesium.Cartesian3.normalize(
-						Cesium.Cartesian3.subtract(
-							_self._resultObject.targetPoint,
-							_self._resultObject.viewPoint,
-							new Cesium.Cartesian3()
-						),
+			if (!Cesium.defined(loc.sLocation)) return;
+
+			let cartesian = loc.sLocation;
+
+			if (!_self._resultObject.viewPoint) {
+				_self._resultObject.viewPoint = cartesian;
+				let pointEntity = _self._viewer.entities.add({
+					position: cartesian,
+					point: {
+						color: Cesium.Color.YELLOW,
+						pixelSize: 5,
+					},
+					//文字标签
+					label: {
+						text: "观察位置",
+						font: '12px sans-serif',
+						fillColor: new Cesium.Color(255 / 255, 255 / 255, 255 / 255, 1.0),
+						outlineColor: new Cesium.Color(0, 154 / 255, 94 / 255, 1.0),
+						style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+						outlineWidth: 1.0,
+						verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+						pixelOffset: new Cesium.Cartesian2(0, -28),
+						showBackground: true,
+						backgroundColor: new Cesium.Color(0, 0, 0, 0.6),
+						disableDepthTestDistance: Number.POSITIVE_INFINITY,
+					},
+				});
+				_self._resultObject.objectExclude.push(pointEntity);
+				_self._resultObject.entities.push(pointEntity);
+			} else {
+				_self._resultObject.targetPoint = cartesian;
+				let pointEntity = _self._viewer.entities.add({
+					position: cartesian,
+					point: {
+						color: Cesium.Color.YELLOW,
+						pixelSize: 5,
+					},
+					//文字标签
+					label: {
+						text: "目标位置",
+						font: '12px sans-serif',
+						fillColor: new Cesium.Color(255 / 255, 255 / 255, 255 / 255, 1.0),
+						outlineColor: new Cesium.Color(0, 154 / 255, 94 / 255, 1.0),
+						style: Cesium.LabelStyle.FILL_AND_OUTLINE,
+						outlineWidth: 1.0,
+						verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+						pixelOffset: new Cesium.Cartesian2(0, -28),
+						showBackground: true,
+						backgroundColor: new Cesium.Color(0, 0, 0, 0.6),
+						disableDepthTestDistance: Number.POSITIVE_INFINITY,
+					},
+				});
+				_self._resultObject.objectExclude.push(pointEntity);
+				_self._resultObject.entities.push(pointEntity);
+				let direction = Cesium.Cartesian3.normalize(
+					Cesium.Cartesian3.subtract(
+						_self._resultObject.targetPoint,
+						_self._resultObject.viewPoint,
 						new Cesium.Cartesian3()
-					);
+					),
+					new Cesium.Cartesian3()
+				);
 
-					let ray = new Cesium.Ray(_self._resultObject.viewPoint, direction);
-					let result = _self._viewer.scene.pickFromRay(ray, _self._resultObject.objectExclude); // 计算交互点,返回第一个
-					if (result) {
-						let dis0 = _self._distance(
-							_self._resultObject.viewPoint,
-							_self._resultObject.targetPoint
-						);
-						let dis1 = _self._distance(
-							_self._resultObject.viewPoint,
-							result.position
-						);
-						let dis2 = _self._distance(
-							result.position,
-							_self._resultObject.targetPoint
-						);
-						console.log(dis0, dis1, dis2);
-						if (dis0 > dis1) {
-							let _poly0 = _self._viewer.entities.add({
-								polyline: {
-									positions: [_self._resultObject.viewPoint, result.position],
-									material: Cesium.Color.GREEN,
-									width: 3,
-								},
-							});
-							_self._resultObject.entities.push(_poly0);
-							let _poly1 = _self._viewer.entities.add({
-								polyline: {
-									positions: [result.position, _self._resultObject.targetPoint],
-									material: Cesium.Color.RED,
-									width: 3,
-								},
-							});
-							_self._resultObject.entities.push(_poly1);
-							_self._resultObject.targetPoints.push({
-								targetPoint: cartesian,
-								visual: false, //如果dis2足够小,其实他是可视的
-								distance: [dis0, dis1, dis2], //[初始点和终点,初始点和交点,交点和终点]
-							});
-						} else {
-							let _poly2 = _self._viewer.entities.add({
-								polyline: {
-									positions: [
-										_self._resultObject.viewPoint,
-										_self._resultObject.targetPoint,
-									],
-									material: Cesium.Color.GREEN,
-									width: 3,
-								},
-							});
-							_self._resultObject.entities.push(_poly2);
-							_self._resultObject.targetPoints.push({
-								targetPoint: cartesian,
-								visual: true, //如果dis2足够小,其实他是可视的
-								distance: [dis0, dis1, dis2], //[初始点和终点,初始点和交点,交点和终点]
-							});
-						}
+				let ray = new Cesium.Ray(_self._resultObject.viewPoint, direction);
+				let result = _self._viewer.scene.pickFromRay(ray, _self._resultObject.objectExclude); // 计算交互点,返回第一个
+				if (result) {
+					let dis0 = _self._distance(
+						_self._resultObject.viewPoint,
+						_self._resultObject.targetPoint
+					);
+					let dis1 = _self._distance(
+						_self._resultObject.viewPoint,
+						result.position
+					);
+					let dis2 = _self._distance(
+						result.position,
+						_self._resultObject.targetPoint
+					);
+					console.log(dis0, dis1, dis2);
+					if (dis0 > dis1) {
+						let _poly0 = _self._viewer.entities.add({
+							polyline: {
+								positions: [_self._resultObject.viewPoint, result.position],
+								material: Cesium.Color.GREEN,
+								width: 3,
+							},
+						});
+						_self._resultObject.entities.push(_poly0);
+						let _poly1 = _self._viewer.entities.add({
+							polyline: {
+								positions: [result.position, _self._resultObject.targetPoint],
+								material: Cesium.Color.RED,
+								width: 3,
+							},
+						});
+						_self._resultObject.entities.push(_poly1);
+						_self._resultObject.targetPoints.push({
+							targetPoint: cartesian,
+							visual: false, //如果dis2足够小,其实他是可视的
+							distance: [dis0, dis1, dis2], //[初始点和终点,初始点和交点,交点和终点]
+						});
+					} else {
+						let _poly2 = _self._viewer.entities.add({
+							polyline: {
+								positions: [
+									_self._resultObject.viewPoint,
+									_self._resultObject.targetPoint,
+								],
+								material: Cesium.Color.GREEN,
+								width: 3,
+							},
+						});
+						_self._resultObject.entities.push(_poly2);
+						_self._resultObject.targetPoints.push({
+							targetPoint: cartesian,
+							visual: true, //如果dis2足够小,其实他是可视的
+							distance: [dis0, dis1, dis2], //[初始点和终点,初始点和交点,交点和终点]
+						});
 					}
 				}
+			}
 
-				if (_self._resultObject.objectExclude.length === 2) {
-					if (this._isRuntimeApp()) {
-						//创建按钮
-						_self._createOperationMainDom();
-
-						//完成绘制
-						document.getElementById("btnDrawComplete").onclick = () => {
-							CreateRemindertip(toolTip, event.endPosition, false);
-							_self.handler.destroy();
-
-							let buttonDiv = document.getElementById("drawButtonDiv");
-							if (buttonDiv) {
-								//从页面移除
-								document.body.removeChild(buttonDiv);
-							}
+			if (_self._resultObject.objectExclude.length === 2) {
+				if (this._isRuntimeApp()) {
+					//创建按钮
+					_self._createOperationMainDom();
+
+					//完成绘制
+					document.getElementById("btnDrawComplete").onclick = () => {
+						CreateRemindertip(toolTip, event.endPosition, false);
+						_self.handler.destroy();
+
+						let buttonDiv = document.getElementById("drawButtonDiv");
+						if (buttonDiv) {
+							//从页面移除
+							document.body.removeChild(buttonDiv);
 						}
 					}
 				}
 			}
+
 		}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
 
 		_self.handler.setInputAction(function(move) {

+ 5 - 1
src/jtMap3d/Widgets/StatusBar.js

@@ -131,10 +131,14 @@ class StatusBar {
 		const $this = this
 		this._handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas)
 		const mouseOverHandler = function(movement) {
-			
+
 			/* 识别屏幕位置 */
 			let loc = $this._getScreenClickPositionAndHeight(movement.endPosition);
 
+			if (!Cesium.defined(loc)) return;
+
+			if (!loc.lng) return;
+
 			$this._posX = loc.lng.toFixed(8);
 			$this._posY = loc.lat.toFixed(8);
 			$this._posZ = loc.height.toFixed(2);

+ 138 - 0
src/jtMap3d/Widgets/WallObject.js

@@ -0,0 +1,138 @@
+/* 引入Cesium */
+// import * as Cesium from 'Cesium';
+
+import {
+	setSessionid
+} from "./common/common.js";
+
+/**
+ *流动纹理
+ */
+import DynamicWallMaterialProperty from "./WallObject/DynamicWallMaterialProperty.js";
+import WallDiffuseMaterialProperty from "./WallObject/WallDiffuseMaterialProperty.js";
+import WallMaterialProperty from "./WallObject/WallMaterialProperty.js";
+
+/**
+ * 墙体对象
+ */
+class WallObject {
+	/**
+	 * 默认初始化
+	 */
+	constructor(viewer) {
+		if (!viewer) throw new Cesium.DeveloperError('no viewer object!');
+		this._viewer = viewer;
+	}
+}
+
+/**
+ * 通用对外公开函数 
+ */
+Object.assign(WallObject.prototype, /** @lends WallObject.prototype */ {
+
+	/**
+	 * @description 根据GeoJson绘制墙体对象
+	 * @param {String} geoJsonUrl geoJson文件路径
+	 * @param {Object} [options] 线的样式,具有以下属性:
+	 * @param {Number} [options.id] 用于移除
+	 * @param {Number} [options.clampToGround=true] 是否贴地
+	 * @param {Number} [options.minimunHeights=0] 最低高度
+	 * @param {Number} [options.maximumHeights=100] 最高高度
+	 * @param {Number} [options.imgUrl] 动态墙图片
+	 * @param {String} [options.color="#FF0000"] 指定墙的颜色
+	 * @param {Number} [options.duration=3000] 持续时间 毫秒,越小越快
+	 * @param {Number} [options.count] 重复次数
+	 * @param {String} [options.direction='horizontal'] 方向 vertical纵,垂直方向,horizontal横,水平方向
+	 * @param {String} [options.order] 方向正负 
+	 *                                        vertical 纵:'-'(由下到上) , '+"(由上到下)
+	 *                                        horizontal 横:'-'(顺时针) , '+'(逆时针)
+	 */
+	drawWallByGeoJson: function(geoJsonUrl, options) {
+		return new Promise((resolve, reject) => {
+
+			let _self = this;
+			let viewer = this._viewer;
+
+			if (!Cesium.defined(geoJsonUrl)) {
+				throw new Cesium.DeveloperError("geoJsonUrl is required.");
+			}
+
+			options = options || {};
+			options.id = options.id || setSessionid();
+			options.clampToGround = Cesium.defaultValue(options.clampToGround, true);
+
+			options.minimunHeights = options.minimunHeights !== undefined && typeof options.minimunHeights === 'number' ? options.minimunHeights : 0;
+			options.maximumHeights = options.maximumHeights !== undefined && typeof options.maximumHeights === 'number' ? options.maximumHeights : 1000;
+
+			if (options.color) {
+				if (options.color instanceof Array) {
+					options.color = new Cesium.Color(options.color[0] / 255, options.color[1] / 255, options.color[2] / 255, options.color[3]);
+				} else if (typeof(options.color) === 'string') {
+					options.color = new Cesium.Color.fromCssColorString(options.color);
+				} else {
+					options.color = new Cesium.Color.fromCssColorString("#FFFF00");
+				}
+			}
+
+			options.trailImage = Cesium.defaultValue(options.trailImage, 'jt3dSDK/imgs/wallmaterial/wl.png');
+			options.duration = Cesium.defaultValue(options.duration, 3000);
+			options.count = Cesium.defaultValue(options.count, 1);
+			options.direction = Cesium.defaultValue(options.direction, 'vertical');
+			options.order = Cesium.defaultValue(options.order, '-');
+
+			fetch(geoJsonUrl).then(res => {
+				return res.json();
+			}).then(res => {
+
+				for (var i = 0; i < res.features.length; i++) {
+					let coordinates = res.features[i].geometry.coordinates;
+					let positions = coordinates.map(point => {
+						return Cesium.Cartesian3.fromDegrees(point[0], point[1], point[2] || 0);
+					});
+
+					//先创建一个CustomDataSource源,然后把entity存入这里面
+					let wall = new Cesium.CustomDataSource(options.id);
+					viewer.dataSources.add(wall);
+
+					let entity = new Cesium.Entity({
+						name: "立体墙效果",
+						wall: {
+							positions: positions,
+							// 设置高度
+							maximumHeights: new Array(positions.length).fill(options.maximumHeights),
+							minimunHeights: new Array(positions.length).fill(options.minimunHeights),
+							// 扩散墙材质
+							// material: new Cesium.WallDiffuseMaterialProperty({
+							//     color: new Cesium.Color(1.0, 1.0, 0.0, 1.0)
+							// }),
+							material: new WallMaterialProperty(viewer, {
+								trailImage: options.trailImage,
+								color: options.color,
+								duration: options.duration,
+								param: {
+									count: options.count,
+									direction: options.direction,
+									order: options.order,
+								},
+							}),
+
+							// material: new Cesium.DynamicWallMaterialProperty({
+							// 	trailImage: 'jt3dSDK/imgs/wallmaterial/wl.png',
+							// 	color: Cesium.Color.CYAN,
+							// 	duration: 1500
+							// })
+						}
+					});
+
+					// 绘制墙体
+					wall.entities.add(entity)
+				}
+
+				resolve(options.id);
+			});
+
+		});
+	},
+});
+
+export default WallObject;

+ 107 - 0
src/jtMap3d/Widgets/WallObject/DynamicWallMaterialProperty.js

@@ -0,0 +1,107 @@
+/*
+    动态墙材质
+    color 颜色
+    duration 持续时间 毫秒
+    trailImage 贴图地址
+*/
+function DynamicWallMaterialProperty(options) {
+	this._definitionChanged = new Cesium.Event();
+	this._color = undefined;
+	this._colorSubscription = undefined;
+	this.color = options.color || Color.BLUE;
+	this.duration = options.duration || 1000;
+	this.trailImage = options.trailImage;
+	this._time = (new Date()).getTime();
+}
+
+/**
+ * 带方向的墙体
+ * @param {*} options.get:true/false
+ * @param {*} options.count:数量 
+ * @param {*} options.direction:vertical/standard
+ * @param {*} options.order:+/-
+ */
+function _getDirectionWallShader(options) {
+	if (options && options.get) {
+		var materail = "czm_material czm_getMaterial(czm_materialInput materialInput)\n\
+      {\n\
+          czm_material material = czm_getDefaultMaterial(materialInput);\n\
+          vec2 st = materialInput.st;";
+		if (options.direction == "vertical") { //(由下到上)
+			materail += "vec4 colorImage = texture2D(image, vec2(fract(st.s), fract(float(" + options.count + ")*st.t" + options.order + " time)));\n\ ";
+		} else { //(逆时针)
+			materail += "vec4 colorImage = texture2D(image, vec2(fract(float(" + options.count + ")*st.s " + options.order + " time), fract(st.t)));\n\ ";
+		}
+		//泛光
+		materail += "vec4 fragColor;\n\
+          fragColor.rgb = (colorImage.rgb+color.rgb) / 1.0;\n\
+          fragColor = czm_gammaCorrect(fragColor);\n\
+          material.diffuse = colorImage.rgb;\n\
+          material.alpha = colorImage.a;\n\
+          material.emission = fragColor.rgb;\n\
+          return material;\n\
+      }";
+		return materail
+	}
+}
+
+Object.defineProperties(DynamicWallMaterialProperty.prototype, {
+	isConstant: {
+		get: function() {
+			return false;
+		}
+	},
+	definitionChanged: {
+		get: function() {
+			return this._definitionChanged;
+		}
+	},
+	color: Cesium.createPropertyDescriptor('color')
+});
+
+var MaterialType = 'wallType' + parseInt(Math.random() * 1000);
+DynamicWallMaterialProperty.prototype.getType = function(time) {
+	return MaterialType;
+};
+
+DynamicWallMaterialProperty.prototype.getValue = function(time, result) {
+	if (!Cesium.defined(result)) {
+		result = {};
+	}
+	result.color = Cesium.Property.getValueOrClonedDefault(this._color, time, Cesium.Color.WHITE, result.color);
+	result.image = this.trailImage;
+	if (this.duration) {
+		result.time = (((new Date()).getTime() - this._time) % this.duration) / this.duration;
+	}
+	viewer.scene.requestRender();
+	return result;
+};
+
+DynamicWallMaterialProperty.prototype.equals = function(other) {
+	return this === other ||
+		(other instanceof DynamicWallMaterialProperty &&
+			Cesium.Property.equals(this._color, other._color))
+};
+
+Cesium.Material._materialCache.addMaterial(MaterialType, {
+	fabric: {
+		type: MaterialType,
+		uniforms: {
+			color: new Cesium.Color(1.0, 0.0, 0.0, 0.5),
+			image: Cesium.Material.DefaultImageId,
+			time: -20
+		},
+		source: _getDirectionWallShader({
+			get: true,
+			count: 3.0,
+			direction: 'vertical',
+			order: '-'
+		})
+	},
+	translucent: function(material) {
+		return true;
+	}
+});
+Cesium.DynamicWallMaterialProperty = DynamicWallMaterialProperty;
+
+export default DynamicWallMaterialProperty;

+ 79 - 0
src/jtMap3d/Widgets/WallObject/WallDiffuseMaterialProperty.js

@@ -0,0 +1,79 @@
+/*
+ * @Description: 动态扩散墙的墙体效果(参考开源代码)(不同高度透明度不同)
+ * @Version: 1.0
+ * @Author: Julian
+ * @Date: 2022-03-07 19:50:46
+ * @LastEditors: Julian
+ * @LastEditTime: 2022-03-08 13:34:04
+ */
+class WallDiffuseMaterialProperty {
+    constructor(options) {
+        this._definitionChanged = new Cesium.Event();
+        this._color = undefined;
+        this.color = options.color;
+    };
+
+    get isConstant() {
+        return false;
+    }
+
+    get definitionChanged() {
+        return this._definitionChanged;
+    }
+
+    getType(time) {
+        return Cesium.Material.WallDiffuseMaterialType;
+    }
+
+    getValue(time, result) {
+        if (!Cesium.defined(result)) {
+            result = {};
+        }
+
+        result.color = Cesium.Property.getValueOrDefault(this._color, time, Cesium.Color.RED, result.color);
+        return result
+    }
+
+    equals(other) {
+        return (this === other ||
+            (other instanceof WallDiffuseMaterialProperty &&
+                Cesium.Property.equals(this._color, other._color))
+        )
+    }
+}
+
+Object.defineProperties(WallDiffuseMaterialProperty.prototype, {
+    color: Cesium.createPropertyDescriptor('color'),
+})
+
+Cesium.WallDiffuseMaterialProperty = WallDiffuseMaterialProperty;
+Cesium.Material.WallDiffuseMaterialProperty = 'WallDiffuseMaterialProperty';
+Cesium.Material.WallDiffuseMaterialType = 'WallDiffuseMaterialType';
+Cesium.Material.WallDiffuseMaterialSource =
+    `
+    uniform vec4 color;
+    czm_material czm_getMaterial(czm_materialInput materialInput){
+    czm_material material = czm_getDefaultMaterial(materialInput);
+    vec2 st = materialInput.st;
+    material.diffuse = color.rgb * 2.0;
+    material.alpha = color.a * (1.0 - fract(st.t)) * 0.8;
+    return material;
+    }
+                                            
+    `
+
+Cesium.Material._materialCache.addMaterial(Cesium.Material.WallDiffuseMaterialType, {
+    fabric: {
+        type: Cesium.Material.WallDiffuseMaterialType,
+        uniforms: {
+            color: new Cesium.Color(1.0, 0.0, 0.0, 1.0),
+        },
+        source: Cesium.Material.WallDiffuseMaterialSource
+    },
+    translucent: function(material) {
+        return true;
+    }
+})
+
+
+export default WallDiffuseMaterialProperty;

+ 186 - 0
src/jtMap3d/Widgets/WallObject/WallMaterialProperty.js

@@ -0,0 +1,186 @@
+class WallMaterialProperty {
+	/**
+	 * 构造方法
+	 * @ignore 无需公开
+	 * @param {Cesium.Viewer} viewer 着色器运行所需的视图
+	 * @param {JSON} options 配置项
+	 * @param {Cesium.Color} options.color [墙的颜色,默认蓝色] 可选
+	 * @param {Number} options.duration [循环时间 默认1000] 可选
+	 * @param {String} options.trailImage 墙的贴图
+	 * @param {JSON} options.param 着色器参数
+	 * @param {Number} options.param.count [数量 可选 默认为1]
+	 * @param {String} options.param.direction [方向 可选 默认竖直 ] 取值vertical/horizontal
+	 * @param {String} options.param.order [顺序 可选 上下/下上/顺时针/逆时针 与方向配合使用 ] 取值+/-
+	 */
+	constructor(viewer, options) {
+		
+
+		/* 着色器运行依赖的视图 */
+		this._viewer = viewer;
+		options = options || {};
+
+		/* 变更事件 */
+		this._definitionChanged = new Cesium.Event();
+		this._color = undefined;
+		/* 墙的颜色 */
+		this.color = options.color || Cesium.Color.BLUE;
+		/* 动态循环周期 */
+		this.duration = options.duration || 1000;
+		
+		this.count = options.duration || 1;	
+		this.direction = options.duration || 'vertical';
+		this.order = options.duration || '-';
+		
+		
+		
+		/* 墙的贴图 */
+		this.trailImage = Cesium.defaultValue(options.trailImage, 'jt3dSDK/imgs/wallmaterial/wl.png');
+		/* 默认时间 */
+		this._time = (new Date()).getTime();
+		/* 材质类型名称 */
+		this._materialTypeName = 'WallMaterial' + this._guid();
+		/* 存储相关参数的属性 以便后期进行追踪修改 */
+		this._param = {
+			color: this.color._value.toCssColorString(),
+			image: this.trailImage,
+			duration: this.duration,
+			count: this.count,
+			direction: this.direction,
+			order: this.order,
+		}
+		/* 将材质加入缓存 以便重复利用 */
+		Cesium.Material._materialCache.addMaterial(this._materialTypeName, {
+			fabric: {
+				type: this._materialTypeName,
+				uniforms: {
+					time: -20,
+					color: new Cesium.Color(1.0, 0.0, 0.0, 0.5),
+					image: options.trailImage,
+				},
+				source: this._getDirectionWallShader(options.param)
+			},
+			translucent: function(material) {
+				/* 材质是否半透明 */
+				return true;
+			}
+		});
+	}
+
+	/**
+	 * 生成GUID随机数
+	 * @ignore 无需公开
+	 */
+	_guid() {
+		function S4() {
+			return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
+		}
+		return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
+	}
+
+	/**
+	 * 重新获取类型方法
+	 * @ignore 无需公开
+	 * @param {Cesium.JulianDate} time 时间
+	 */
+	getType(time) {
+		return this._materialTypeName;
+	}
+
+	/**
+	 * 重写获取值方法
+	 * @ignore 无需公开
+	 * @param {Cesium.JulianDate} time
+	 * @param {JSON} result 
+	 */
+	getValue(time, result) {
+		if (!Cesium.defined(result)) {
+			result = {};
+		}
+		result.color = Cesium.Property.getValueOrClonedDefault(this._color, time, Cesium.Color.BLUE, result.color);
+		result.image = this.trailImage;
+		if (this.duration) {
+			result.time = (((new Date()).getTime() - this._time) % this.duration) / this.duration;
+		}
+		this._viewer.scene.requestRender();
+		return result;
+	}
+
+	/**
+	 * 重写对比函数
+	 * @ignore 无需公开
+	 * @param {Object} other 传入对比对象
+	 */
+	equals(other) {
+		return (this === other || (other instanceof WallMaterialProperty && Cesium.Property.equals(this
+				._color, other._color) && other._param.order === this._param.order && other._param.count ===
+			this._param.count && other._param.direction === this._param.direction && other.duration === this
+			.duration));
+	}
+
+	/**
+	 * 创建着色器资源
+	 * @ignore 无需公开
+	 * @param {JSON} options 配置项
+	 * @param {Number} options.count [数量 可选 默认为1]
+	 * @param {String} options.direction [方向 可选 默认竖直 ] 取值vertical/horizontal
+	 * @param {String} options.order [顺序 可选 上下/下上/顺时针/逆时针 与方向配合使用 ] 取值+/-
+	 */
+	_getDirectionWallShader(options) {
+		let op = Cesium.defaultValue(options, {});
+		// console.log('>>>op===', op);
+		let count = op.count !== undefined && typeof op.count === 'number' && op.count > 0 ? op.count : 1;
+		let direction = op.direction === 'horizontal' ? 'horizontal' : 'vertical';
+		let order = op.order === '+' ? '+' : '-';
+		this._param.count = count;
+		this._param.direction = direction;
+		this._param.order = order;
+		let materail = '';
+		/* 补充参数 */
+		// console.log('_param', this._param);
+		materail += 'czm_material czm_getMaterial(czm_materialInput materialInput){\n' +
+			'  czm_material material = czm_getDefaultMaterial(materialInput);\n' +
+			'  vec2 st = materialInput.st;\n';
+		if (direction === 'vertical') {
+			materail += '  vec4 colorImage = texture2D(image,vec2(st.s,fract(float(' + count + ')*st.t ' + order + ' time)));\n';
+		} else if (direction === 'horizontal') {
+			materail += '  vec4 colorImage = texture2D(image, vec2(fract(float(' + count + ')*st.s ' + order + ' time), st.t));\n'
+		}
+		materail += '  vec4 fragColor;\n' +
+			'  fragColor.rgb = color.rgb / 1.0;\n' +
+			'  fragColor = czm_gammaCorrect(fragColor);\n' +
+			'  material.alpha = colorImage.a * color.a;\n' +
+			'  material.diffuse = color.rgb;\n' +
+			'  material.emission = fragColor.rgb;\n' +
+			'  return material;\n' +
+			'}';
+		return materail;
+	}
+}
+
+/**
+ * 增加默认属性
+ */
+Object.defineProperties(WallMaterialProperty.prototype, {
+	/**
+	 * @ignore 无需公开
+	 * 判断是否相等,返回false表示属性一直在变化中
+	 */
+	isConstant: {
+		get: function() {
+			return false;
+		}
+	},
+	/**
+	 * @ignore 无需公开
+	 * 事件变更
+	 */
+	definitionChanged: {
+		get: function() {
+			return this._definitionChanged;
+		}
+	},
+	/* 颜色属性 */
+	color: Cesium.createPropertyDescriptor('color')
+})
+
+export default WallMaterialProperty;

+ 88 - 0
src/jtMap3d/Widgets/common/CoordTransform.js

@@ -328,6 +328,94 @@ class CoordTransform {
 		let _double = parseFloat(DMS.degrees) + parseFloat(DMS.minutes) / 60 + parseFloat(DMS.seconds) / 3600;
 		return parseFloat(_double).toFixed(6);
 	}
+	
+	/**
+	 * 世界坐标转换为经纬度坐标
+	 * @ignore 生成方法时不对外公开
+	 * @param {Cesium.Cartesian3} position 点
+	 */
+	static _cartesian3ToGeo(position) {
+		let g = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position);
+		return {
+			longitude: Cesium.Math.toDegrees(g.longitude),
+			latitude: Cesium.Math.toDegrees(g.latitude),
+			height: g.height,
+		}
+	}
+	
+	/**
+	 * 弧度转度
+	 * @ignore
+	 * @param {Number} arc 弧度
+	 * @return {Number} 角度
+	 */
+	static _arcToDegree(arc) {
+		return arc / Math.PI * 180;
+	}
+	
+	/**
+	 * 根据地形或实景或模型检测当前屏幕位置的经纬度及高度
+	 * @ignore
+	 * @param {JSON} screenPoint 屏幕坐标
+	 * @param {Number} screenPoint.x 屏幕坐标x
+	 * @param {Number} screenPoint.y 屏幕坐标y
+	 * @return {JSON} 位置信息{lng,lat,height}
+	 */
+	static _getScreenClickPositionAndHeight(viewer,screenPoint) {
+		this._viewer=viewer;
+		
+		var lng = undefined,
+			lat = undefined,
+			height = undefined;
+	
+		/* 从相机位置到 windowPosition 处的像素创建射线在世界坐标系中 */
+		var ray = this._viewer.scene.camera.getPickRay(screenPoint);
+		/* 找到射线与渲染的地球表面之间的交点 */
+		var position = this._viewer.scene.globe.pick(ray, this._viewer.scene);
+		/* 获取地理位置的制图表达 */
+		var cartographic = Cesium.Ellipsoid.WGS84.cartesianToCartographic(position);
+	
+		/* 查询屏幕位置的要素 */
+		var feature = this._viewer.scene.pick(screenPoint);
+		if (feature == undefined) {
+			lng = this._arcToDegree(cartographic.longitude);
+			lat = this._arcToDegree(cartographic.latitude);
+			height = cartographic.height;
+		} else {
+			var cartesian = this._viewer.scene.pickPosition(screenPoint);
+			if (Cesium.defined(cartesian)) {
+				var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
+				lng = this._arcToDegree(cartographic.longitude);
+				lat = this._arcToDegree(cartographic.latitude);
+				height = cartographic.height;
+			}
+		}
+		/* 返回结果 */
+		return {
+			lng: lng,
+			lat: lat,
+			height: height,
+		}
+	}
+	
+	/**
+	 * 屏幕位置转换为经纬度位置及空间位置
+	 * @ignore
+	 * @param {Object} viewer 三维场景
+	 * @param {Cesium.Cartesian2} screenPosition 屏幕位置
+	 * @return {JSON} 经纬度位置及空间位置
+	 */
+	static _transfromFromScreenPoint(viewer,screenPosition) {
+		/* 根据屏幕位置获取经度、纬度和高度信息 */
+		let location = this._getScreenClickPositionAndHeight(viewer,screenPosition);
+		/* 经纬度位置转换为三维坐标 */
+		var cartesian = Cesium.Cartesian3.fromDegrees(location.lng, location.lat, location.height);
+		/* 返回 */
+		return {
+			gLocation: location,
+			sLocation: cartesian,
+		}
+	}
 }
 
 export default CoordTransform;

+ 111 - 6
src/jtMap3d/Widgets/common/RuntimeEnvironment.js

@@ -2,7 +2,7 @@
  * 检测程序运行环境
  * @return
  */
-const checkAppOrWeb = function() {
+const _checkAppOrWeb = function() {
 	if (window.navigator.userAgent.match(
 			/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
 		)) {
@@ -16,20 +16,125 @@ const checkAppOrWeb = function() {
  * 是否是运行于App
  * @ignore
  */
-const isRuntimeApp = function() {
-	if (this._checkAppOrWeb() === "App") {
+export const isRuntimeApp = function() {
+	if (_checkAppOrWeb() === "App") {
 		return true;
 	}
-	return false;
+	return true;
 }
 
 /**
  * 是否是运行于App
  * @ignore
  */
-const isRuntimeWeb = function() {
-	if (this._checkAppOrWeb() === "Web") {
+export const isRuntimeWeb = function() {
+	if (_checkAppOrWeb() === "Web") {
 		return true;
 	}
 	return false;
 }
+
+/**
+ * @ignore
+ * 创建操作的主容器
+ */
+export function createOperationMainDom() {
+	//创建画布
+	let buttonDiv = document.createElement('div');
+	buttonDiv.id = "drawButtonDiv";
+	buttonDiv.style.width = '80px';
+	buttonDiv.style.backgroundColor = 'rgba(5, 45, 155, 0.7)';
+	buttonDiv.style.borderRadius = '5px';
+	buttonDiv.style.display = 'flex';
+	buttonDiv.style.flexDirection = 'column';
+	buttonDiv.style.padding = '8px';
+	buttonDiv.style.justifyContent = 'center';
+	buttonDiv.style.position = 'absolute';
+	buttonDiv.style.bottom = '150px';
+	buttonDiv.style.right = '10px';
+
+	let btnUndo = document.createElement('button');
+	btnUndo.id = "btnDrawBackout";
+	btnUndo.style.height = '30px';
+	btnUndo.style.marginBottom = '8px';
+	btnUndo.style.backgroundColor = 'rgba(52, 137, 255, 1.0)';
+	btnUndo.style.color = 'rgb(255, 255, 255)';
+	btnUndo.style.border = '0px solid red';
+	btnUndo.style.borderRadius = '5px';
+	btnUndo.innerHTML = '回退';
+	btnUndo.style.fontSize = '13px';
+	btnUndo.style.cursor = 'pointer';
+	buttonDiv.appendChild(btnUndo);
+
+	let btnCompletion = document.createElement('button');
+	btnCompletion.id = "btnDrawComplete";
+	btnCompletion.style.height = '30px';
+	btnCompletion.style.backgroundColor = 'rgba(88, 185, 45, 1.0)';
+	btnCompletion.style.color = 'rgb(255, 255, 255)';
+	btnCompletion.style.border = '0px solid red';
+	btnCompletion.style.borderRadius = '5px';
+	btnCompletion.innerHTML = '完成';
+	btnCompletion.style.fontSize = '13px';
+	btnCompletion.style.cursor = 'pointer';
+	buttonDiv.appendChild(btnCompletion);
+
+	/* 加入到页面 */
+	document.body.appendChild(buttonDiv);
+}
+
+/**
+ * 创建顶部弹出提示消息 1秒后自动消失
+ * @ignore
+ * @param {String} message 消息内容
+ */
+export function showTooltipMessage(message) {
+	let msgMainDom = document.getElementById('messageMainDom');
+	if (msgMainDom !== null && msgMainDom !== undefined) {
+		document.body.removeChild(msgMainDom);
+	}
+	msgMainDom = document.createElement('div');
+	msgMainDom.style.width = '30%';
+	msgMainDom.style.backgroundColor = 'rgba(237, 248, 230, 1.0)';
+	msgMainDom.style.height = '45px';
+	msgMainDom.style.border = 'solid 2px rgb(219, 241, 208)';
+	msgMainDom.style.borderRadius = '8px';
+	msgMainDom.style.display = 'flex';
+	msgMainDom.style.alignItems = 'center';
+	msgMainDom.style.paddingLeft = '10px';
+	msgMainDom.style.color = 'rgb(91, 188, 48)';
+	msgMainDom.style.fontSize = '14px';
+	msgMainDom.style.fontWeight = '600';
+	msgMainDom.style.position = 'absolute';
+	msgMainDom.style.left = '35%';
+	msgMainDom.style.transition = 'transform 1s';
+	msgMainDom.style.transform = 'translateY(-90px)';
+	msgMainDom.style.top = '0px';
+	msgMainDom.style.zIndex = 1000;
+	document.body.appendChild(msgMainDom);
+
+	let strHtml = '';
+	strHtml += "<div style='"
+	strHtml += "background-color: rgb(88, 185, 45);";
+	strHtml += "color: rgb(255, 255, 255);";
+	strHtml += "height: 24px;";
+	strHtml += "width: 24px;";
+	strHtml += "border-radius: 20px;";
+	strHtml += "display: flex;";
+	strHtml += "justify-content: center;";
+	strHtml += "align-items: center;";
+	strHtml += "font-size: 14px;";
+	strHtml += "margin-right: 18px;";
+	strHtml += "'>&#10003</div>";
+	strHtml += "<div>" + message + "</div>";
+
+	msgMainDom.innerHTML = strHtml;
+	msgMainDom.addEventListener('transitionend', function() {
+		setTimeout(function() {
+			document.body.removeChild(msgMainDom);
+		}, 1000);
+	}, false);
+
+	setTimeout(function() {
+		msgMainDom.style.transform = 'translateY(50px)';
+	}, 100)
+}

+ 40 - 1
src/jtMap3d/Widgets/common/common.js

@@ -166,7 +166,7 @@ export function getHeigthByPointMostDetailed(viewer, points) {
 		throw new Cesium.DeveloperError("points is required.");
 	}
 
-	let positions = Cesium.Cartographic.fromDegrees(points[0], points[1]);//经纬度转为世界坐标;
+	let positions = Cesium.Cartographic.fromDegrees(points[0], points[1]); //经纬度转为世界坐标;
 
 	let terrainProvider = viewer.terrainProvider;
 
@@ -178,3 +178,42 @@ export function getHeigthByPointMostDetailed(viewer, points) {
 		});
 	})
 }
+
+import '../../Assets/styles/tooltip.css';
+export function createTooltip(frameDiv) {
+
+	var tooltip = function(frameDiv) {
+
+		var div = document.createElement('DIV');
+		div.className = "twipsy right";
+
+		var arrow = document.createElement('DIV');
+		arrow.className = "twipsy-arrow";
+		div.appendChild(arrow);
+
+		var title = document.createElement('DIV');
+		title.className = "twipsy-inner";
+		div.appendChild(title);
+
+		this._div = div;
+		this._title = title;
+
+		// add to frame div and display coordinates
+		frameDiv.appendChild(div);
+	}
+
+	tooltip.prototype.setVisible = function(visible) {
+		this._div.style.display = visible ? 'block' : 'none';
+	}
+
+	tooltip.prototype.showAt = function(position, message) {
+		if (position && message) {
+			this.setVisible(true);
+			this._title.innerHTML = message;
+			this._div.style.left = position.x + 10 + "px";
+			this._div.style.top = (position.y - this._div.clientHeight / 2) + "px";
+		}
+	}
+
+	return new tooltip(frameDiv);
+}

+ 284 - 79
src/jtMap3d/Widgets/layer.js

@@ -151,6 +151,8 @@ Object.assign(LoadMapData.prototype, /** @lends LoadMapData.prototype */ {
 	 * @param {Object} options 具有以下属性:
 	 * @param {String} options.url 地形服务url
 	 * @param {Number} [options.terrainExaggeration=1] 地形夸张系数
+	 * @param {Number} [options.requestVertexNormals=false] 请求地形照明数据
+	 * @param {Number} [options.requestWaterMask=false] 请求水体效果所需要的海岸线数据
 	 * 
 	 * @example
 	 * layer.addTerrain({
@@ -247,7 +249,7 @@ Object.assign(LoadMapData.prototype, /** @lends LoadMapData.prototype */ {
 	 * @param {string} options.url 服务地址
 	 * @param {string} [options.CRS] 坐标系,纠偏-“WGS84”
 	 * @param {Number} [options.minimumLevel=0] 最小层级
-	 * @param {Number} [options.maximumLevel] 最大层级
+	 * @param {Number} [options.maximumLevel=18] 最大层级
 	 * @param {Number} [options.alpha=1] 透明度
 	 * @return {String} 服务Id
 	 * 
@@ -270,12 +272,15 @@ Object.assign(LoadMapData.prototype, /** @lends LoadMapData.prototype */ {
 		let _ConstructorOptions = {
 			url: options.url
 		};
+
 		if (options.minimumLevel) {
 			_ConstructorOptions.minimumLevel = options.minimumLevel;
 		}
 
 		if (options.maximumLevel) {
 			_ConstructorOptions.maximumLevel = options.maximumLevel;
+		} else {
+			_ConstructorOptions.maximumLevel = 18;
 		}
 
 		var imageryProvider = new Cesium.UrlTemplateImageryProvider(_ConstructorOptions);
@@ -333,6 +338,8 @@ Object.assign(LoadMapData.prototype, /** @lends LoadMapData.prototype */ {
 
 		if (options.maximumLevel) {
 			_ConstructorOptions.maximumLevel = options.maximumLevel;
+		} else {
+			_ConstructorOptions.maximumLevel = 18;
 		}
 
 		var imageryProvider = new Cesium.TileMapServiceImageryProvider(_ConstructorOptions);
@@ -368,7 +375,7 @@ Object.assign(LoadMapData.prototype, /** @lends LoadMapData.prototype */ {
 	 * layer.addWebMapTileService({
 	 *   url: 'http://t0.tianditu.gov.cn/cia_w/wmts?tk=10f42f91b6e50d2a8eec980577e6a2e6', //加载全国中文注记(经纬度)
 	 *   layers: 'cia',
-	 *   layerstyle: 'default',
+	 *   style: 'default',
 	 *   tileMatrixSetID: 'w',
 	 *   format: 'tiles',
 	 *   maximumLevel: 18
@@ -412,6 +419,8 @@ Object.assign(LoadMapData.prototype, /** @lends LoadMapData.prototype */ {
 
 		if (options.maximumLevel) {
 			_ConstructorOptions.maximumLevel = options.maximumLevel;
+		} else {
+			_ConstructorOptions.maximumLevel = 18;
 		}
 
 		let imageryProvider = new Cesium.WebMapTileServiceImageryProvider(_ConstructorOptions);
@@ -434,6 +443,13 @@ Object.assign(LoadMapData.prototype, /** @lends LoadMapData.prototype */ {
 	 * @param {String} [options.id=guid] 服务ID(不支持全数字),加入到整体图层中 以便可以删除对应的图层
 	 * @param {string} options.url 服务地址
 	 * @param {string} options.layers 加载图层目录,要包含的层,用逗号分隔。
+	 * @param {Number} [options.parameters={
+			service:'WMS',
+			version:'1.1.1',
+			request:'GetMap',
+			styles:'',
+			format:'image/jpeg'
+	 }] 基础参数
 	 * @param {Number} [options.minimumLevel=0] 最小层级
 	 * @param {Number} [options.maximumLevel] 最大层级
 	 * @param {Number} [options.alpha=1] 透明度
@@ -461,13 +477,19 @@ Object.assign(LoadMapData.prototype, /** @lends LoadMapData.prototype */ {
 
 		let _ConstructorOptions = {
 			url: options.url,
-			layer: options.layers,
-			parameters: {
+			layers: options.layers,
+		};
+
+		if (options.parameters) {
+			_ConstructorOptions.parameters = options.parameters;
+		} else {
+			_ConstructorOptions.parameters = {
+				service: 'WMS',
 				transparent: true, //是否透明
 				request: "GetMap", //添加上则显示,好像变成了必填
 				format: "image/png",
-			},
-		};
+			}
+		}
 
 		if (options.minimumLevel) {
 			_ConstructorOptions.minimumLevel = options.minimumLevel;
@@ -475,6 +497,8 @@ Object.assign(LoadMapData.prototype, /** @lends LoadMapData.prototype */ {
 
 		if (options.maximumLevel) {
 			_ConstructorOptions.maximumLevel = options.maximumLevel;
+		} else {
+			_ConstructorOptions.maximumLevel = 18;
 		}
 
 		let imageryProvider = new Cesium.WebMapServiceImageryProvider(_ConstructorOptions);
@@ -609,6 +633,8 @@ Object.assign(LoadMapData.prototype, /** @lends LoadMapData.prototype */ {
 	 *
 	 */
 	addCesium3DTilesetBm: function(options, callSuccess) {
+		let _self = this;
+
 		if (!Cesium.defined(options) || !Cesium.defined(options.url)) {
 			throw new Cesium.DeveloperError("options.url is required.");
 		}
@@ -997,51 +1023,6 @@ Object.assign(LoadMapData.prototype, /** @lends LoadMapData.prototype */ {
 		billboard.scale = Cesium.defaultValue(billboard.scale, 1);
 		billboard.pixelOffset = Cesium.defaultValue(billboard.pixelOffset, 0);
 
-		billboard.near = Cesium.defaultValue(billboard.near, 1.5e2);
-		billboard.nearValue = Cesium.defaultValue(billboard.nearValue, 1);
-		billboard.far = Cesium.defaultValue(billboard.far, 2400);
-		billboard.farValue = Cesium.defaultValue(billboard.farValue, 0);
-
-		let label = options.label || {};
-		label.text = Cesium.defaultValue(label.text, "");
-		label.textField = Cesium.defaultValue(label.textField, "");
-		label.font = Cesium.defaultValue(label.font, "24px Helvetica");
-		if (label.fillColor instanceof Array) {
-			label.fillColor = new Cesium.Color(label.fillColor[0] / 255, label.fillColor[1] / 255, label.fillColor[2] / 255, label.fillColor[3]);
-		} else if (typeof options.color === 'string') {
-			label.fillColor = new Cesium.Color.fromCssColorString(label.fillColor);
-		} else {
-			label.fillColor = new Cesium.Color.fromCssColorString("#ff0000");
-		}
-
-		if (label.outlineColor instanceof Array) {
-			label.outlineColor = new Cesium.Color(label.outlineColor[0] / 255, label.outlineColor[1] / 255, label.outlineColor[2] / 255, label.outlineColor[3]);
-		} else if (label.outlineColor instanceof String) {
-			label.outlineColor = new Cesium.Color.fromCssColorString(label.outlineColor);
-		} else {
-			label.outlineColor = new Cesium.Color.fromCssColorString("#FFFF00");
-		}
-		label.outlineWidth = Cesium.defaultValue(label.outlineWidth, 1);
-
-		//是否显示背景颜色
-		label.showBackground = Cesium.defaultValue(label.showBackground, false);
-		//背景颜色
-		if (label.backgroundColor instanceof Array) {
-			label.backgroundColor = new Cesium.Color(label.backgroundColor[0] / 255, label.backgroundColor[1] / 255, label.backgroundColor[2] / 255, label.backgroundColor[3]);
-		} else if (label.backgroundColor instanceof String) {
-			label.backgroundColor = new Cesium.Color.fromCssColorString(label.backgroundColor);
-		} else {
-			label.backgroundColor = new Cesium.Color.fromCssColorString("#FFFF00");
-		}
-
-		label.pixelOffset = Cesium.defaultValue(label.pixelOffset, 0);
-		label.scale = Cesium.defaultValue(label.scale, 1);
-
-		label.near = Cesium.defaultValue(label.near, 1.5e2);
-		label.nearValue = Cesium.defaultValue(label.nearValue, 1);
-		label.far = Cesium.defaultValue(label.far, 2400);
-		label.farValue = Cesium.defaultValue(label.farValue, 0);
-
 		const dataSource = new Cesium.GeoJsonDataSource(options.id); // 创建并取名
 		dataSource.load(options.url, {
 			clampToGround: true
@@ -1059,45 +1040,269 @@ Object.assign(LoadMapData.prototype, /** @lends LoadMapData.prototype */ {
 					disableDepthTestDistance: Number.POSITIVE_INFINITY,
 				};
 
-				let labelText = label.text;
-				if (entity.properties[label.textField]) {
-					labelText = entity.properties[label.textField]._value;
-				}
-				if (labelText === "") {
-					labelText = (i + 1).toString();
+				if (billboard.scaleByDistance) {
+					billboard.scaleByDistance.near = Cesium.defaultValue(billboard.scaleByDistance.near, 0);
+					billboard.scaleByDistance.nearValue = Cesium.defaultValue(billboard.scaleByDistance.nearValue, 0);
+					billboard.scaleByDistance.far = Cesium.defaultValue(billboard.scaleByDistance.far, 1);
+					billboard.scaleByDistance.farValue = Cesium.defaultValue(billboard.scaleByDistance.farValue, 0);
+
+					entity.billboard.scaleByDistance = new Cesium.NearFarScalar(billboard.scaleByDistance.near, billboard.scaleByDistance.nearValue, billboard.scaleByDistance.far, billboard.scaleByDistance.farValue) //按距离缩放,即距离大于180米时,图标不显示  Cesium.NearFarScalar(near, nearValue, far, farValue)相机范围的下界。相机范围下界的值。相机范围的上限。该值位于摄像机范围的上界。
 				}
 
-				entity.label = {
-					text: labelText.toString(),
-					font: label.font,
-					fillColor: label.fillColor, //填充颜色
-					outlineColor: label.outlineColor, //边框颜色
-					outlineWidth: label.outlineWidth, //边框宽度	
-					style: Cesium.LabelStyle.FILL_AND_OUTLINE, //FILL不要轮廓 , OUTLINE只要轮廓,FILL_AND_OUTLINE轮廓加填充
-
-					verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
-					showBackground: label.showBackground, //指定标签后面背景的可见性
-					backgroundColor: label.backgroundColor, // 背景颜色
-					backgroundPadding: new Cesium.Cartesian2(6, 6), //指定以像素为单位的水平和垂直背景填充padding
-					disableDepthTestDistance: Number.POSITIVE_INFINITY,
+				if (options.label) {
+					let label = options.label || {};
+					label.text = Cesium.defaultValue(label.text, "");
+					label.textField = Cesium.defaultValue(label.textField, "");
+					label.font = Cesium.defaultValue(label.font, "24px Helvetica");
+					if (label.fillColor instanceof Array) {
+						label.fillColor = new Cesium.Color(label.fillColor[0] / 255, label.fillColor[1] / 255, label.fillColor[2] / 255, label.fillColor[3]);
+					} else if (typeof options.color === 'string') {
+						label.fillColor = new Cesium.Color.fromCssColorString(label.fillColor);
+					} else {
+						label.fillColor = new Cesium.Color.fromCssColorString("#ff0000");
+					}
 
-					pixelOffset: new Cesium.Cartesian2(0, label.pixelOffset), //偏移量
-					scale: label.scale, //尺寸
-				}
+					if (label.outlineColor instanceof Array) {
+						label.outlineColor = new Cesium.Color(label.outlineColor[0] / 255, label.outlineColor[1] / 255, label.outlineColor[2] / 255, label.outlineColor[3]);
+					} else if (label.outlineColor instanceof String) {
+						label.outlineColor = new Cesium.Color.fromCssColorString(label.outlineColor);
+					} else {
+						label.outlineColor = new Cesium.Color.fromCssColorString("#FFFF00");
+					}
+					label.outlineWidth = Cesium.defaultValue(label.outlineWidth, 1);
+
+					//是否显示背景颜色
+					label.showBackground = Cesium.defaultValue(label.showBackground, false);
+					//背景颜色
+					if (label.backgroundColor instanceof Array) {
+						label.backgroundColor = new Cesium.Color(label.backgroundColor[0] / 255, label.backgroundColor[1] / 255, label.backgroundColor[2] / 255, label.backgroundColor[3]);
+					} else if (label.backgroundColor instanceof String) {
+						label.backgroundColor = new Cesium.Color.fromCssColorString(label.backgroundColor);
+					} else {
+						label.backgroundColor = new Cesium.Color.fromCssColorString("#FFFF00");
+					}
+
+					label.pixelOffset = Cesium.defaultValue(label.pixelOffset, 0);
+					label.scale = Cesium.defaultValue(label.scale, 1);
 
-				if (label.scaleByDistance) {
-					label.scaleByDistance.near = Cesium.defaultValue(label.scaleByDistance.near, 0);
-					label.scaleByDistance.nearValue = Cesium.defaultValue(label.scaleByDistance.nearValue, 0);
-					label.scaleByDistance.far = Cesium.defaultValue(label.scaleByDistance.far, 1);
-					label.scaleByDistance.farValue = Cesium.defaultValue(label.scaleByDistance.farValue, 0);
+					label.near = Cesium.defaultValue(label.near, 1.5e2);
+					label.nearValue = Cesium.defaultValue(label.nearValue, 1);
+					label.far = Cesium.defaultValue(label.far, 2400);
+					label.farValue = Cesium.defaultValue(label.farValue, 0);
+
+
+					let labelText = label.text;
+					if (entity.properties[label.textField]) {
+						labelText = entity.properties[label.textField]._value;
+					}
+					if (labelText === "") {
+						labelText = (i + 1).toString();
+					}
 
-					entity.label.scaleByDistance = new Cesium.NearFarScalar(label.scaleByDistance.near, label.scaleByDistance.nearValue, label.scaleByDistance.far, label.scaleByDistance.farValue) //按距离缩放,即距离大于180米时,图标不显示  Cesium.NearFarScalar(near, nearValue, far, farValue)相机范围的下界。相机范围下界的值。相机范围的上限。该值位于摄像机范围的上界。
+					entity.label = {
+						text: labelText.toString(),
+						font: label.font,
+						fillColor: label.fillColor, //填充颜色
+						outlineColor: label.outlineColor, //边框颜色
+						outlineWidth: label.outlineWidth, //边框宽度	
+						style: Cesium.LabelStyle.FILL_AND_OUTLINE, //FILL不要轮廓 , OUTLINE只要轮廓,FILL_AND_OUTLINE轮廓加填充
+
+						verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+						showBackground: label.showBackground, //指定标签后面背景的可见性
+						backgroundColor: label.backgroundColor, // 背景颜色
+						backgroundPadding: new Cesium.Cartesian2(6, 6), //指定以像素为单位的水平和垂直背景填充padding
+						disableDepthTestDistance: Number.POSITIVE_INFINITY,
+
+						pixelOffset: new Cesium.Cartesian2(0, label.pixelOffset), //偏移量
+						scale: label.scale, //尺寸
+					}
+
+					if (label.scaleByDistance) {
+						label.scaleByDistance.near = Cesium.defaultValue(label.scaleByDistance.near, 0);
+						label.scaleByDistance.nearValue = Cesium.defaultValue(label.scaleByDistance.nearValue, 0);
+						label.scaleByDistance.far = Cesium.defaultValue(label.scaleByDistance.far, 1);
+						label.scaleByDistance.farValue = Cesium.defaultValue(label.scaleByDistance.farValue, 0);
+
+						entity.label.scaleByDistance = new Cesium.NearFarScalar(label.scaleByDistance.near, label.scaleByDistance.nearValue, label.scaleByDistance.far, label.scaleByDistance.farValue) //按距离缩放,即距离大于180米时,图标不显示  Cesium.NearFarScalar(near, nearValue, far, farValue)相机范围的下界。相机范围下界的值。相机范围的上限。该值位于摄像机范围的上界。
+					}
 				}
 			})
 
 			if (callSuccess) callSuccess(options.id);
 		})
 	},
+
+	/**
+	 * 根据GeoJson添加广告牌
+	 * @param {Object} options
+	 * @param {String} options.url geoJson文件路径
+	 * @param {String} options.id 用于移除
+	 * @param {Object} [options.billboard] 广告牌的样式,具有以下属性:
+	 * @param {Number} [options.billboard.imgUrl] 广告牌图片
+	 * @param {Number} [options.billboard.scale=1] 尺寸
+	 * @param {Object} [options.billboard.scaleByDistance] 距离相机的距离缩放点。
+	 * @param {Number} [options.billboard.scaleByDistance.near=0] 相机范围的下界。
+	 * @param {String} [options.billboard.scaleByDistance.nearValue=0] 相机范围下界的值。
+	 * @param {String} [options.billboard.scaleByDistance.far=1] 相机范围的上限。
+	 * @param {Number} [options.billboard.scaleByDistance.farValue=0] 该值位于摄像机范围的上界。
+	 * 
+	 * @param {Object} [options.lable] lable的样式,具有以下属性:
+	 * @param {Number} [options.lable.text=""] 文字
+	 * @param {Number} [options.lable.textField=""] 文字字段
+	 * @param {String} [options.lable.font="24px Helvetica"] 指定CSS字体的属性,字体大小及样式
+	 * @param {String} [options.lable.fillColor=[255,255,0,1]] 字体颜色
+	 * @param {String} [options.lable.outlineColor=[255,255,255,1]] 字体边框颜色
+	 * @param {Number} [options.lable.outlineWidth=1] 边框宽度	
+	 * @param {Number} [options.lable.showBackground=false] 是否显示背景颜色
+	 * @param {Number} [options.lable.backgroundColor=[255,255,255,1]] 背景颜色		
+	 * @param {Number} [options.lable.pixelOffset=0] 偏移量
+	 * @param {Number} [options.lable.scale=1] 尺寸
+	 * @param {Object} [options.lable.scaleByDistance] 距离相机的距离缩放点。
+	 * @param {Number} [options.lable.scaleByDistance.near=0] 相机范围的下界。
+	 * @param {String} [options.lable.scaleByDistance.nearValue=0] 相机范围下界的值。
+	 * @param {String} [options.lable.scaleByDistance.far=1] 相机范围的上限。
+	 * @param {Number} [options.lable.scaleByDistance.farValue=0] 该值位于摄像机范围的上界。
+	 */
+	addBillboardByJson(options, callSuccess) {
+
+		let _self = this;
+		let viewer = this._viewer;
+
+		if (!Cesium.defined(options.url)) {
+			resolve("options.url is required.");
+			throw new Cesium.DeveloperError("options.url is required.");
+		}
+
+		options.id = options.id || this._guid();
+
+		let billboard = options.billboard || {};
+		billboard.imgUrl = Cesium.defaultValue(billboard.imgUrl, 'jt3dSDK/imgs/point/point3.png');
+
+		billboard.scale = Cesium.defaultValue(billboard.scale, 1);
+		billboard.pixelOffset = Cesium.defaultValue(billboard.pixelOffset, 0);
+
+		fetch(options.url).then(res => {
+			return res.json();
+		}).then(res => {
+		
+
+			for (var i = 0; i < res.features.length; i++) {
+				let coordinates = res.features[i].geometry.coordinates;
+				let position = Cesium.Cartesian3.fromDegrees(coordinates[0], coordinates[1], coordinates[2] || 0);
+
+				//先创建一个CustomDataSource源,然后把entity存入这里面
+				let Point = new Cesium.CustomDataSource(options.id);
+				viewer.dataSources.add(Point);
+
+				let entity = new Cesium.Entity({
+					// id: options.id,
+					name: "add billboard",
+					//位置
+					position: position,
+					//图片标签
+					billboard: {
+						image: billboard.imgUrl,
+						horizontalOrigin: Cesium.HorizontalOrigin.CENTER, //水平
+						verticalOrigin: Cesium.VerticalOrigin.BOTTOM, //垂直位置
+						scale: billboard.scale, //尺寸
+						pixelOffset: new Cesium.Cartesian2(0, billboard.pixelOffset),
+						disableDepthTestDistance: Number.POSITIVE_INFINITY,
+					}
+				});
+
+				if (billboard.scaleByDistance) {
+					billboard.scaleByDistance.near = Cesium.defaultValue(billboard.scaleByDistance.near, 0);
+					billboard.scaleByDistance.nearValue = Cesium.defaultValue(billboard.scaleByDistance.nearValue, 0);
+					billboard.scaleByDistance.far = Cesium.defaultValue(billboard.scaleByDistance.far, 1);
+					billboard.scaleByDistance.farValue = Cesium.defaultValue(billboard.scaleByDistance.farValue, 0);
+
+					entity.billboard.scaleByDistance = new Cesium.NearFarScalar(billboard.scaleByDistance.near, billboard.scaleByDistance.nearValue, billboard.scaleByDistance.far, billboard.scaleByDistance.farValue) //按距离缩放,即距离大于180米时,图标不显示  Cesium.NearFarScalar(near, nearValue, far, farValue)相机范围的下界。相机范围下界的值。相机范围的上限。该值位于摄像机范围的上界。
+				}
+
+				if (options.label) {
+					let label = options.label || {};
+					label.text = Cesium.defaultValue(label.text, "");
+					label.textField = Cesium.defaultValue(label.textField, "");
+					label.font = Cesium.defaultValue(label.font, "24px Helvetica");
+					if (label.fillColor instanceof Array) {
+						label.fillColor = new Cesium.Color(label.fillColor[0] / 255, label.fillColor[1] / 255, label.fillColor[2] / 255, label.fillColor[3]);
+					} else if (typeof options.color === 'string') {
+						label.fillColor = new Cesium.Color.fromCssColorString(label.fillColor);
+					} else {
+						label.fillColor = new Cesium.Color.fromCssColorString("#ff0000");
+					}
+
+					if (label.outlineColor instanceof Array) {
+						label.outlineColor = new Cesium.Color(label.outlineColor[0] / 255, label.outlineColor[1] / 255, label.outlineColor[2] / 255, label.outlineColor[3]);
+					} else if (label.outlineColor instanceof String) {
+						label.outlineColor = new Cesium.Color.fromCssColorString(label.outlineColor);
+					} else {
+						label.outlineColor = new Cesium.Color.fromCssColorString("#FFFF00");
+					}
+					label.outlineWidth = Cesium.defaultValue(label.outlineWidth, 1);
+
+					//是否显示背景颜色
+					label.showBackground = Cesium.defaultValue(label.showBackground, false);
+					//背景颜色
+					if (label.backgroundColor instanceof Array) {
+						label.backgroundColor = new Cesium.Color(label.backgroundColor[0] / 255, label.backgroundColor[1] / 255, label.backgroundColor[2] / 255, label.backgroundColor[3]);
+					} else if (label.backgroundColor instanceof String) {
+						label.backgroundColor = new Cesium.Color.fromCssColorString(label.backgroundColor);
+					} else {
+						label.backgroundColor = new Cesium.Color.fromCssColorString("#FFFF00");
+					}
+
+					label.pixelOffset = Cesium.defaultValue(label.pixelOffset, 0);
+					label.scale = Cesium.defaultValue(label.scale, 1);
+
+					label.near = Cesium.defaultValue(label.near, 1.5e2);
+					label.nearValue = Cesium.defaultValue(label.nearValue, 1);
+					label.far = Cesium.defaultValue(label.far, 2400);
+					label.farValue = Cesium.defaultValue(label.farValue, 0);
+
+					let labelText = label.text;
+					if (res.features[i].properties[label.textField]) {
+						labelText = res.features[i].properties[label.textField];
+					}
+					if (labelText === "") {
+						labelText = (i + 1).toString();
+					}
+
+					entity.label = {
+						text: labelText.toString(),
+						font: label.font,
+						fillColor: label.fillColor, //填充颜色
+						outlineColor: label.outlineColor, //边框颜色
+						outlineWidth: label.outlineWidth, //边框宽度	
+						style: Cesium.LabelStyle.FILL_AND_OUTLINE, //FILL不要轮廓 , OUTLINE只要轮廓,FILL_AND_OUTLINE轮廓加填充
+
+						verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
+						showBackground: label.showBackground, //指定标签后面背景的可见性
+						backgroundColor: label.backgroundColor, // 背景颜色
+						backgroundPadding: new Cesium.Cartesian2(6, 6), //指定以像素为单位的水平和垂直背景填充padding
+						disableDepthTestDistance: Number.POSITIVE_INFINITY,
+
+						pixelOffset: new Cesium.Cartesian2(0, label.pixelOffset), //偏移量
+						scale: label.scale, //尺寸
+					}
+
+					if (label.scaleByDistance) {
+						label.scaleByDistance.near = Cesium.defaultValue(label.scaleByDistance.near, 0);
+						label.scaleByDistance.nearValue = Cesium.defaultValue(label.scaleByDistance.nearValue, 0);
+						label.scaleByDistance.far = Cesium.defaultValue(label.scaleByDistance.far, 1);
+						label.scaleByDistance.farValue = Cesium.defaultValue(label.scaleByDistance.farValue, 0);
+
+						entity.label.scaleByDistance = new Cesium.NearFarScalar(label.scaleByDistance.near, label.scaleByDistance.nearValue, label.scaleByDistance.far, label.scaleByDistance.farValue) //按距离缩放,即距离大于180米时,图标不显示  Cesium.NearFarScalar(near, nearValue, far, farValue)相机范围的下界。相机范围下界的值。相机范围的上限。该值位于摄像机范围的上界。
+					}
+				}
+				// viewer.entities.add(entity);
+				Point.entities.add(entity)
+			}
+
+			if (callSuccess) callSuccess(options.id);
+		});
+	},
+
 });
 
 /**

+ 4 - 0
src/jtMap3d/index.js

@@ -28,6 +28,10 @@ export { default as PointObject } from "./Widgets/PointObject.js";
 export { default as PolylineObject } from "./Widgets/PolylineObject.js";
 //面对象
 export { default as PolygonObject } from "./Widgets/PolygonObject.js";
+//墙体对象
+export { default as WallObject } from "./Widgets/WallObject.js";
+//墙体对象
+export { default as CircleObject } from "./Widgets/CircleObject.js";
 
 //绘图工具
 export { default as CommonTools } from "./Widgets/DrawTools/CommonTools.js";

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно