From a0c951cb32ef03151022ddfc1052d319da0e0578 Mon Sep 17 00:00:00 2001 From: Valentin Platzgummer Date: Tue, 15 Sep 2020 22:10:16 +0200 Subject: [PATCH] 234 --- Paths/KlingenbachTest.wima | 5397 ++++++++++++++++- src/Wima/Geometry/WimaMeasurementArea.cc | 217 +- src/Wima/Geometry/WimaMeasurementArea.h | 40 +- .../WimaMeasurementArea.SettingsGroup.json | 46 +- src/Wima/Snake/SnakeThread.cc | 196 +- src/Wima/Snake/SnakeTile.cpp | 2 +- src/Wima/Snake/SnakeTile.h | 2 +- src/Wima/Snake/snake.cpp | 261 +- src/Wima/Snake/snake.h | 119 +- src/WimaView/WimaMeasurementAreaEditor.qml | 63 +- 10 files changed, 5600 insertions(+), 743 deletions(-) diff --git a/Paths/KlingenbachTest.wima b/Paths/KlingenbachTest.wima index b39dbab02..1b1cc674d 100644 --- a/Paths/KlingenbachTest.wima +++ b/Paths/KlingenbachTest.wima @@ -1,53 +1,59 @@ { "AreaItems": [ { - "AreaType": "Measurement Area", + "AreaType": "Service Area", "BorderPolygonOffset": 6, - "BottomLayerAltitude": 5, - "LayerDistance": 1, - "NumberOfLayers": 1, "ShowBorderPolygon": 0, "maxAltitude": 30, "polygon": [ [ - 47.768115102959555, - 16.530342246669797 + 47.76780423605158, + 16.53039502668514 ], [ - 47.76836640344051, - 16.530980102821747 + 47.76786397711215, + 16.53061320536986 ], [ - 47.76798694569257, - 16.531146687122508 + 47.767783696604035, + 16.530655731490725 ], [ - 47.76777418124312, - 16.530481637145055 + 47.76771642095403, + 16.53041704413795 ] ] }, { - "AreaType": "Service Area", + "AreaType": "Measurement Area", "BorderPolygonOffset": 6, + "MinTileArea": 5, + "MinTransectLength": 1, "ShowBorderPolygon": 0, + "TileHeight": 5, + "TileWidth": 5, + "TransectDistance": 2, "maxAltitude": 30, "polygon": [ [ - 47.76777317830783, - 16.530413969584316 + 47.768104934026056, + 16.53019867766355 ], [ - 47.76785089069791, - 16.530667046992818 + 47.76837004980939, + 16.530954417342286 ], [ - 47.76775614544286, - 16.5307494063876 + 47.76799341665491, + 16.531158942063684 ], [ - 47.76766140001518, - 16.530447230100037 + 47.767773186698484, + 16.530367723621737 + ], + [ + 47.767978337016025, + 16.530375028338852 ] ] } @@ -77,9 +83,9 @@ 0, 0, null, - 47.76776040370392, - 16.530569413178814, - 8 + 47.76779208273835, + 16.53052025186404, + 5 ], "type": "SimpleItem" }, @@ -108,8 +114,8 @@ 0, 0, null, - 47.76826616141194, - 16.530725666402216, + 47.768080815499374, + 16.530830644424782, 15 ], "type": "SimpleItem" @@ -124,8 +130,8 @@ 0, 0, null, - 47.76825906623652, - 16.53087697971209, + 47.76808551691831, + 16.53083046126021, 15 ], "type": "SimpleItem" @@ -140,8 +146,8 @@ 0, 0, null, - 47.76825595539324, - 16.531028590198325, + 47.76809020545099, + 16.53082991226853, 15 ], "type": "SimpleItem" @@ -156,8 +162,8 @@ 0, 0, null, - 47.76825595539324, - 16.531028590198325, + 47.768094868246465, + 16.530828998954494, 15 ], "type": "SimpleItem" @@ -172,8 +178,8 @@ 0, 0, null, - 47.76816596834739, - 16.53106809506861, + 47.768099492524335, + 16.530827723821435, 15 ], "type": "SimpleItem" @@ -188,8 +194,8 @@ 0, 0, null, - 47.76816596834739, - 16.53106809506861, + 47.768104065609776, + 16.530826090364396, 15 ], "type": "SimpleItem" @@ -204,8 +210,8 @@ 0, 0, null, - 47.76816873697609, - 16.530889307913807, + 47.76810857496828, + 16.530824103060578, 15 ], "type": "SimpleItem" @@ -220,8 +226,8 @@ 0, 0, null, - 47.76817686074449, - 16.530710882254596, + 47.768113008240014, + 16.530821767357036, 15 ], "type": "SimpleItem" @@ -236,8 +242,8 @@ 0, 0, null, - 47.768190323493215, - 16.530533173006166, + 47.76811735327368, + 16.530819089655772, 15 ], "type": "SimpleItem" @@ -252,8 +258,8 @@ 0, 0, null, - 47.768190323493215, - 16.530533173006166, + 47.76812159815985, + 16.530816077296183, 15 ], "type": "SimpleItem" @@ -268,8 +274,8 @@ 0, 0, null, - 47.76811851790795, - 16.530350914563478, + 47.76812573126358, + 16.530812738534934, 15 ], "type": "SimpleItem" @@ -284,8 +290,8 @@ 0, 0, null, - 47.76811851790795, - 16.530350914563478, + 47.768129741256324, + 16.530809082523337, 15 ], "type": "SimpleItem" @@ -300,8 +306,8 @@ 0, 0, null, - 47.768099209120734, - 16.530538775407198, + 47.768133617146965, + 16.53080511928227, 15 ], "type": "SimpleItem" @@ -316,8 +322,8 @@ 0, 0, null, - 47.76808571028981, - 16.53072775601019, + 47.76813734831196, + 16.530800859674695, 15 ], "type": "SimpleItem" @@ -332,8 +338,8 @@ 0, 0, null, - 47.76807804981345, - 16.53091745880308, + 47.76814092452445, + 16.530796315375905, 15 ], "type": "SimpleItem" @@ -348,8 +354,8 @@ 0, 0, null, - 47.76807624380742, - 16.53110748469719, + 47.76814433598228, + 16.530791498841506, 15 ], "type": "SimpleItem" @@ -364,8 +370,8 @@ 0, 0, null, - 47.76807624380742, - 16.53110748469719, + 47.76814757333488, + 16.53078642327328, 15 ], "type": "SimpleItem" @@ -380,8 +386,8 @@ 0, 0, null, - 47.76798674683302, - 16.531146065535864, + 47.76815062770889, + 16.530781102583013, 15 ], "type": "SimpleItem" @@ -396,8 +402,8 @@ 0, 0, null, - 47.76798674683302, - 16.531146065535864, + 47.76815349073249, + 16.530775551354346, 15 ], "type": "SimpleItem" @@ -412,8 +418,8 @@ 0, 0, null, - 47.76798738725695, - 16.530953664408617, + 47.768156154558326, + 16.530769784802807, 15 ], "type": "SimpleItem" @@ -428,8 +434,8 @@ 0, 0, null, - 47.7679938426545, - 16.530761500810428, + 47.76815861188504, + 16.530763818734115, 15 ], "type": "SimpleItem" @@ -444,8 +450,8 @@ 0, 0, null, - 47.76800609996228, - 16.530569963610645, + 47.768160855977264, + 16.530757669500854, 15 ], "type": "SimpleItem" @@ -460,8 +466,8 @@ 0, 0, null, - 47.76802413437596, - 16.530379440411014, + 47.76816288068411, + 16.530751353957637, 15 ], "type": "SimpleItem" @@ -476,8 +482,8 @@ 0, 0, null, - 47.76802413437596, - 16.530379440411014, + 47.76816468045598, + 16.530744889414933, 15 ], "type": "SimpleItem" @@ -492,8 +498,8 @@ 0, 0, null, - 47.76792911566441, - 16.53041829010208, + 47.76816625035984, + 16.530738293591604, 15 ], "type": "SimpleItem" @@ -508,8 +514,8 @@ 0, 0, null, - 47.76792911566441, - 16.53041829010208, + 47.76816758609268, + 16.530731584566343, 15 ], "type": "SimpleItem" @@ -524,8 +530,8 @@ 0, 0, null, - 47.76791032279039, - 16.53064518113584, + 47.76816868399336, + 16.530724780728125, 15 ], "type": "SimpleItem" @@ -540,179 +546,5064 @@ 0, 0, null, - 47.767899456183414, - 16.530873216172655, + 47.76816954105261, + 16.530717900725794, 15 ], "type": "SimpleItem" - } - ], - "Refly90Degrees": false, - "TurnAroundDistance": 10, - "VisualTransectPoints": [ - [ - 47.76826616141194, - 16.530725666402216 - ], - [ - 47.76825906623652, - 16.53087697971209 - ], - [ - 47.76825595539324, - 16.531028590198325 - ], - [ - 47.76825595539324, - 16.531028590198325 - ], - [ - 47.76816596834739, - 16.53106809506861 - ], - [ - 47.76816596834739, - 16.53106809506861 - ], - [ - 47.76816873697609, - 16.530889307913807 - ], - [ - 47.76817686074449, - 16.530710882254596 - ], - [ - 47.768190323493215, - 16.530533173006166 - ], - [ - 47.768190323493215, - 16.530533173006166 - ], - [ - 47.76811851790795, - 16.530350914563478 - ], - [ - 47.76811851790795, - 16.530350914563478 - ], - [ - 47.768099209120734, - 16.530538775407198 - ], - [ - 47.76808571028981, - 16.53072775601019 - ], - [ - 47.76807804981345, - 16.53091745880308 - ], - [ - 47.76807624380742, - 16.53110748469719 - ], - [ - 47.76807624380742, - 16.53110748469719 - ], - [ - 47.76798674683302, - 16.531146065535864 - ], - [ - 47.76798674683302, - 16.531146065535864 - ], - [ - 47.76798738725695, - 16.530953664408617 - ], - [ - 47.7679938426545, - 16.530761500810428 - ], - [ - 47.76800609996228, - 16.530569963610645 - ], - [ - 47.76802413437596, - 16.530379440411014 - ], - [ - 47.76802413437596, - 16.530379440411014 - ], - [ - 47.76792911566441, - 16.53041829010208 - ], - [ - 47.76792911566441, - 16.53041829010208 - ], - [ - 47.76791032279039, - 16.53064518113584 - ], - [ - 47.767899456183414, - 16.530873216172655 - ] - ], - "version": 1 - }, - "complexItemType": "circularSurvey", - "deltaAlpha": 3, - "deltaR": 10, - "fixedDirection": false, - "polygon": [ - [ - 47.768115102959555, - 16.530342246669797 - ], - [ - 47.76836640344051, - 16.530980102821747 - ], - [ - 47.76798694569257, - 16.531146687122508 - ], - [ - 47.76777418124312, - 16.530481637145055 - ] - ], - "referencePointAlt": 0, - "referencePointLat": 47.77086091347008, - "referencePointLong": 16.531071041719485, - "reverse": false, - "transectMinLength": 15, - "type": "ComplexItem", - "version": 1 - }, - { - "AMSLAltAboveTerrain": null, - "Altitude": 5, - "AltitudeMode": 1, - "autoContinue": true, - "command": 16, - "doJumpId": 33, - "frame": 3, - "params": [ - 0, - 0, - 0, - null, - 47.76783728246855, - 16.530678876245194, - 5 - ], - "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 30, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76817015492127, + 16.530710963416958, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 31, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7681705239168, + 16.5307039878163, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 32, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76817064702779, + 16.530696993043453, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 33, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7681705239168, + 16.530689998270606, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 34, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76817015492127, + 16.530683022669947, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 35, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76816954105261, + 16.53067608536111, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 36, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76816868399336, + 16.53066920535878, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 37, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76816758609268, + 16.530662401520562, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 38, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76816625035984, + 16.5306556924953, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 39, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76816468045598, + 16.530649096671972, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 40, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76816288068411, + 16.53064263212927, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 41, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768160855977264, + 16.53063631658605, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 42, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76815861188504, + 16.53063016735279, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 43, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768156154558326, + 16.5306242012841, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 44, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76815349073249, + 16.53061843473256, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 45, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76815062770889, + 16.530612883503892, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 46, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76814757333488, + 16.530607562813625, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 47, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76814433598228, + 16.5306024872454, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 48, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76814092452445, + 16.530597670711, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 49, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76813734831196, + 16.53059312641221, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 50, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768133617146965, + 16.530588866804635, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 51, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768129741256324, + 16.530584903563568, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 52, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76812573126358, + 16.53058124755197, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 53, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76812159815985, + 16.530577908790722, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 54, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76811735327368, + 16.530574896431133, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 55, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768113008240014, + 16.53057221872987, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 56, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76810857496828, + 16.530569883026327, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 57, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768104065609776, + 16.53056789572251, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 58, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768099492524335, + 16.53056626226547, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 59, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768094868246465, + 16.53056498713241, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 60, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76809020545099, + 16.530564073818375, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 61, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76808551691831, + 16.530563524826697, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 62, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768080815499374, + 16.530563341662123, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 63, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768076114080436, + 16.530563524826697, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 64, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76807142554776, + 16.530564073818375, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 65, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768066762752284, + 16.53056498713241, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 66, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76806213847441, + 16.53056626226547, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 67, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76805756538897, + 16.53056789572251, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 68, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76805305603047, + 16.530569883026327, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 69, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768048622758734, + 16.53057221872987, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 70, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76804427772507, + 16.530574896431133, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 71, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7680400328389, + 16.530577908790722, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 72, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76803589973517, + 16.53058124755197, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 73, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768031889742424, + 16.530584903563568, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 74, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76802801385178, + 16.530588866804635, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 75, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76802428268679, + 16.53059312641221, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 76, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768020706474296, + 16.530597670711, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 77, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76801729501647, + 16.5306024872454, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 78, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76801405766387, + 16.530607562813625, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 79, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76801100328986, + 16.530612883503892, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 80, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76800814026626, + 16.53061843473256, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 81, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76800547644042, + 16.5306242012841, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 82, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768003019113706, + 16.53063016735279, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 83, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768000775021484, + 16.53063631658605, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 84, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76799875031464, + 16.53064263212927, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 85, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767996950542766, + 16.530649096671972, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 86, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76799538063891, + 16.5306556924953, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 87, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76799404490607, + 16.530662401520562, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 88, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76799294700539, + 16.53066920535878, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 89, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76799208994614, + 16.53067608536111, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 90, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767991476077476, + 16.530683022669947, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 91, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76799110708195, + 16.530689998270606, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 92, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76799098397096, + 16.530696993043453, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 93, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76799110708195, + 16.5307039878163, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 94, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767991476077476, + 16.530710963416958, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 95, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76799208994614, + 16.530717900725794, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 96, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76799294700539, + 16.530724780728125, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 97, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76799404490607, + 16.530731584566343, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 98, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76799538063891, + 16.530738293591604, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 99, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767996950542766, + 16.530744889414933, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 100, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76799875031464, + 16.530751353957637, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 101, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768000775021484, + 16.530757669500854, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 102, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768003019113706, + 16.530763818734115, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 103, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76800547644042, + 16.530769784802807, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 104, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76800814026626, + 16.530775551354346, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 105, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76801100328986, + 16.530781102583013, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 106, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76801405766387, + 16.53078642327328, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 107, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76801729501647, + 16.530791498841506, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 108, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768020706474296, + 16.530796315375905, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 109, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76802428268679, + 16.530800859674695, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 110, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76802801385178, + 16.53080511928227, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 111, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768031889742424, + 16.530809082523337, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 112, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76803589973517, + 16.530812738534934, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 113, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7680400328389, + 16.530816077296183, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 114, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76804427772507, + 16.530819089655772, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 115, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768048622758734, + 16.530821767357036, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 116, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76805305603047, + 16.530824103060578, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 117, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76805756538897, + 16.530826090364396, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 118, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76806213847441, + 16.530827723821435, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 119, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768066762752284, + 16.530828998954494, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 120, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76807142554776, + 16.53082991226853, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 121, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768076114080436, + 16.53083046126021, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 122, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768080815499374, + 16.530830644424782, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 123, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76811011597513, + 16.531095570330024, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 124, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76809668886304, + 16.531097251074474, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 125, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76808322206859, + 16.53109793120032, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 126, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768069749257876, + 16.531097609007293, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 127, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76805630411204, + 16.53109628530085, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 128, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76804292024304, + 16.531093963390173, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 129, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768029631109684, + 16.531090649079882, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 130, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76801646993391, + 16.53108635065554, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 131, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7680034696178, + 16.531081078862915, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 132, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767990662661276, + 16.531074846881143, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 133, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767978081080884, + 16.53106767028977, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 134, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76796575632975, + 16.531059567029796, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 135, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76823097459738, + 16.531029939952692, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 136, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768242032904105, + 16.531018290000745, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 137, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76825268365733, + 16.531005827818255, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 138, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76826289993222, + 16.53099258490931, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 139, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768272655902294, + 16.530978594751637, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 140, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768281926904706, + 16.530963892712006, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 141, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76829068950259, + 16.530948515956798, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 142, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768298921544336, + 16.530932503358056, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 143, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76830660221954, + 16.53091589539523, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 144, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76831371211166, + 16.53089873405282, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 145, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76832023324706, + 16.530881062714265, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 146, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768326149140485, + 16.53086292605226, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 147, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7683314448367, + 16.53084436991583, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 148, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76825303744394, + 16.530620861616672, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 149, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76825547279669, + 16.53063433487386, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 150, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76825743232134, + 16.530647978834008, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 151, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76825891067946, + 16.53066175632615, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 152, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76825990384347, + 16.530675629815548, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 153, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76826040910765, + 16.530689561505913, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 154, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76826042509547, + 16.530703513442408, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 155, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76825995176339, + 16.530717447615036, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 156, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76825899040092, + 16.530731326062195, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 157, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76825754362716, + 16.5307451109741, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 158, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76825561538363, + 16.53075876479578, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 159, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76825321092354, + 16.53077225032942, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 160, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76825033679749, + 16.530785530835654, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 161, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768247000835615, + 16.530798570133708, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 162, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76824321212626, + 16.530811332699933, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 163, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768238980991185, + 16.53082378376459, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 164, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76823431895752, + 16.530835889406593, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 165, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76822923872627, + 16.530847616645893, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 166, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768223754137786, + 16.530858933533363, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 167, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76821788013402, + 16.5308698092378, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 168, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76821163271783, + 16.530880214129954, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 169, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768205028909385, + 16.530890119863226, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 170, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76819808669978, + 16.530899499450904, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 171, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768190825002065, + 16.53090832733968, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 172, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76818326359964, + 16.53091657947927, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 173, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76817542309245, + 16.53092423338794, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 174, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768167324840796, + 16.530931268213738, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 175, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768158990907175, + 16.530937664791313, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 176, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76815044399616, + 16.53094340569414, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 177, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76814170739256, + 16.530948475281967, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 178, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76813280489795, + 16.53095285974345, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 179, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76812376076589, + 16.53095654713377, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 180, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76811459963576, + 16.530959527407173, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 181, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76810534646573, + 16.530961792444344, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 182, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76809602646469, + 16.530963336074525, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 183, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76808666502361, + 16.53096415409232, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 184, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76807728764636, + 16.530964244269157, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 185, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76806791988024, + 16.530963606359368, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 186, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76805858724633, + 16.53096224210084, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 187, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76804931517002, + 16.530960155210302, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 188, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76804012891172, + 16.53095735137317, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 189, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76803105349804, + 16.530953838228093, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 190, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768022113653615, + 16.530949625346114, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 191, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76801333373373, + 16.53094472420461, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 192, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768004737657975, + 16.53093914815602, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 193, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7679963488451, + 16.53093291239147, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 194, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7679881901492, + 16.53092603389938, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 195, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76798028379742, + 16.53091853141919, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 196, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76797265132948, + 16.530910425390303, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 197, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767965313538895, + 16.5309017378964, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 198, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767958290416395, + 16.530892492605282, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 199, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767951601095454, + 16.530882714704386, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 200, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76794526380014, + 16.530872430832158, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 201, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76793929579548, + 16.5308616690055, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 202, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76793371334042, + 16.530850458543416, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 203, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767928531643534, + 16.53083882998717, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 204, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76792376482161, + 16.530826815017047, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 205, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76791942586114, + 16.530814446366065, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 206, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767915526582975, + 16.530801757730792, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 207, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76791207761014, + 16.53078878367955, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 208, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767909088338854, + 16.53077555955823, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 209, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767906566912934, + 16.530762121394005, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 210, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76790452020164, + 16.530748505797174, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 211, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76790295378094, + 16.530734749861427, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 212, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76790187191831, + 16.53072089106279, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 213, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76790127756113, + 16.530706967157514, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 214, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767901172328635, + 16.53069301607923, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 215, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76790155650752, + 16.530679075835604, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 216, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76790242905114, + 16.53066518440477, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 217, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767903787582384, + 16.530651379631895, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 218, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767905628400136, + 16.530637699126043, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 219, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767907946489345, + 16.53062418015774, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 220, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767910735534734, + 16.53061085955743, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 221, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76791398793795, + 16.530597773615124, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 222, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7679176948383, + 16.530584957981546, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 223, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767921846136886, + 16.530572447571004, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 224, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767926430524106, + 16.53056027646627, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 225, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76793143551046, + 16.53054847782573, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 226, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76793684746061, + 16.53053708379304, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 227, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76794265163049, + 16.530526125409562, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 228, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767948832207495, + 16.530515632529806, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 229, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767955372353555, + 16.530505633740077, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 230, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767962254250996, + 16.530496156280602, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 231, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76796945915111, + 16.530487225971328, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 232, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767976967425206, + 16.530478867141564, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 233, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.7679847586181, + 16.530471102563716, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 234, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76799281150382, + 16.530463953391234, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 235, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76800110414347, + 16.530457439100978, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 236, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76800961394498, + 16.530451577440186, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 237, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76801831772465, + 16.530446384378077, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 238, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76802719177031, + 16.530441874062394, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 239, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76803621190592, + 16.53043805878082, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 240, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76804535355746, + 16.53043494892754, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 241, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76805459181984, + 16.530432552974876, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 242, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768063901524776, + 16.53043087745026, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 243, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76807325730934, + 16.53042992691841, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 244, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76808263368508, + 16.530429703968906, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 245, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76809200510745, + 16.530430209209147, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 246, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76810134604538, + 16.530431441262674, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 247, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76811063105085, + 16.530433396772942, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 248, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76811983482824, + 16.530436070412453, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 249, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76812893230322, + 16.530439454897266, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 250, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768137898691045, + 16.530443541006854, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 251, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768146709564114, + 16.530448317609206, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 252, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768155340918504, + 16.53045377169118, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 253, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76816376923936, + 16.530459888393928, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 254, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76817197156496, + 16.530466651053395, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 255, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768179925549276, + 16.53047404124571, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 256, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76818760952285, + 16.530482038837384, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 257, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76819500255183, + 16.53049062204015, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 258, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76820208449498, + 16.530499767470342, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 259, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76820883605861, + 16.530509450212577, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 260, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76821523884907, + 16.530519643887654, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 261, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.768221275422896, + 16.5305303207244, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 262, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76792203268757, + 16.530373023529908, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 263, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76791141284898, + 16.530385157490954, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 264, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76790121121543, + 16.530398061281755, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 265, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76789145297174, + 16.530411703046656, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 266, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76788216220812, + 16.530426049108183, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 267, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76787336186072, + 16.53044106405015, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 268, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767865073654995, + 16.530456710805108, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 269, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76785731805208, + 16.530472950745846, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 270, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.767850114198254, + 16.53048974378075, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 271, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76784347987771, + 16.530507048452787, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 272, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76783743146862, + 16.53052482204184, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 273, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76783198390272, + 16.530543020670173, + 15 + ], + "type": "SimpleItem" + }, + { + "autoContinue": true, + "command": 16, + "doJumpId": 274, + "frame": 3, + "params": [ + 0, + 0, + 0, + null, + 47.76782715062843, + 16.530561599410756, + 15 + ], + "type": "SimpleItem" + } + ], + "Refly90Degrees": false, + "TurnAroundDistance": 10, + "VisualTransectPoints": [ + [ + 47.768080815499374, + 16.530830644424782 + ], + [ + 47.76808551691831, + 16.53083046126021 + ], + [ + 47.76809020545099, + 16.53082991226853 + ], + [ + 47.768094868246465, + 16.530828998954494 + ], + [ + 47.768099492524335, + 16.530827723821435 + ], + [ + 47.768104065609776, + 16.530826090364396 + ], + [ + 47.76810857496828, + 16.530824103060578 + ], + [ + 47.768113008240014, + 16.530821767357036 + ], + [ + 47.76811735327368, + 16.530819089655772 + ], + [ + 47.76812159815985, + 16.530816077296183 + ], + [ + 47.76812573126358, + 16.530812738534934 + ], + [ + 47.768129741256324, + 16.530809082523337 + ], + [ + 47.768133617146965, + 16.53080511928227 + ], + [ + 47.76813734831196, + 16.530800859674695 + ], + [ + 47.76814092452445, + 16.530796315375905 + ], + [ + 47.76814433598228, + 16.530791498841506 + ], + [ + 47.76814757333488, + 16.53078642327328 + ], + [ + 47.76815062770889, + 16.530781102583013 + ], + [ + 47.76815349073249, + 16.530775551354346 + ], + [ + 47.768156154558326, + 16.530769784802807 + ], + [ + 47.76815861188504, + 16.530763818734115 + ], + [ + 47.768160855977264, + 16.530757669500854 + ], + [ + 47.76816288068411, + 16.530751353957637 + ], + [ + 47.76816468045598, + 16.530744889414933 + ], + [ + 47.76816625035984, + 16.530738293591604 + ], + [ + 47.76816758609268, + 16.530731584566343 + ], + [ + 47.76816868399336, + 16.530724780728125 + ], + [ + 47.76816954105261, + 16.530717900725794 + ], + [ + 47.76817015492127, + 16.530710963416958 + ], + [ + 47.7681705239168, + 16.5307039878163 + ], + [ + 47.76817064702779, + 16.530696993043453 + ], + [ + 47.7681705239168, + 16.530689998270606 + ], + [ + 47.76817015492127, + 16.530683022669947 + ], + [ + 47.76816954105261, + 16.53067608536111 + ], + [ + 47.76816868399336, + 16.53066920535878 + ], + [ + 47.76816758609268, + 16.530662401520562 + ], + [ + 47.76816625035984, + 16.5306556924953 + ], + [ + 47.76816468045598, + 16.530649096671972 + ], + [ + 47.76816288068411, + 16.53064263212927 + ], + [ + 47.768160855977264, + 16.53063631658605 + ], + [ + 47.76815861188504, + 16.53063016735279 + ], + [ + 47.768156154558326, + 16.5306242012841 + ], + [ + 47.76815349073249, + 16.53061843473256 + ], + [ + 47.76815062770889, + 16.530612883503892 + ], + [ + 47.76814757333488, + 16.530607562813625 + ], + [ + 47.76814433598228, + 16.5306024872454 + ], + [ + 47.76814092452445, + 16.530597670711 + ], + [ + 47.76813734831196, + 16.53059312641221 + ], + [ + 47.768133617146965, + 16.530588866804635 + ], + [ + 47.768129741256324, + 16.530584903563568 + ], + [ + 47.76812573126358, + 16.53058124755197 + ], + [ + 47.76812159815985, + 16.530577908790722 + ], + [ + 47.76811735327368, + 16.530574896431133 + ], + [ + 47.768113008240014, + 16.53057221872987 + ], + [ + 47.76810857496828, + 16.530569883026327 + ], + [ + 47.768104065609776, + 16.53056789572251 + ], + [ + 47.768099492524335, + 16.53056626226547 + ], + [ + 47.768094868246465, + 16.53056498713241 + ], + [ + 47.76809020545099, + 16.530564073818375 + ], + [ + 47.76808551691831, + 16.530563524826697 + ], + [ + 47.768080815499374, + 16.530563341662123 + ], + [ + 47.768076114080436, + 16.530563524826697 + ], + [ + 47.76807142554776, + 16.530564073818375 + ], + [ + 47.768066762752284, + 16.53056498713241 + ], + [ + 47.76806213847441, + 16.53056626226547 + ], + [ + 47.76805756538897, + 16.53056789572251 + ], + [ + 47.76805305603047, + 16.530569883026327 + ], + [ + 47.768048622758734, + 16.53057221872987 + ], + [ + 47.76804427772507, + 16.530574896431133 + ], + [ + 47.7680400328389, + 16.530577908790722 + ], + [ + 47.76803589973517, + 16.53058124755197 + ], + [ + 47.768031889742424, + 16.530584903563568 + ], + [ + 47.76802801385178, + 16.530588866804635 + ], + [ + 47.76802428268679, + 16.53059312641221 + ], + [ + 47.768020706474296, + 16.530597670711 + ], + [ + 47.76801729501647, + 16.5306024872454 + ], + [ + 47.76801405766387, + 16.530607562813625 + ], + [ + 47.76801100328986, + 16.530612883503892 + ], + [ + 47.76800814026626, + 16.53061843473256 + ], + [ + 47.76800547644042, + 16.5306242012841 + ], + [ + 47.768003019113706, + 16.53063016735279 + ], + [ + 47.768000775021484, + 16.53063631658605 + ], + [ + 47.76799875031464, + 16.53064263212927 + ], + [ + 47.767996950542766, + 16.530649096671972 + ], + [ + 47.76799538063891, + 16.5306556924953 + ], + [ + 47.76799404490607, + 16.530662401520562 + ], + [ + 47.76799294700539, + 16.53066920535878 + ], + [ + 47.76799208994614, + 16.53067608536111 + ], + [ + 47.767991476077476, + 16.530683022669947 + ], + [ + 47.76799110708195, + 16.530689998270606 + ], + [ + 47.76799098397096, + 16.530696993043453 + ], + [ + 47.76799110708195, + 16.5307039878163 + ], + [ + 47.767991476077476, + 16.530710963416958 + ], + [ + 47.76799208994614, + 16.530717900725794 + ], + [ + 47.76799294700539, + 16.530724780728125 + ], + [ + 47.76799404490607, + 16.530731584566343 + ], + [ + 47.76799538063891, + 16.530738293591604 + ], + [ + 47.767996950542766, + 16.530744889414933 + ], + [ + 47.76799875031464, + 16.530751353957637 + ], + [ + 47.768000775021484, + 16.530757669500854 + ], + [ + 47.768003019113706, + 16.530763818734115 + ], + [ + 47.76800547644042, + 16.530769784802807 + ], + [ + 47.76800814026626, + 16.530775551354346 + ], + [ + 47.76801100328986, + 16.530781102583013 + ], + [ + 47.76801405766387, + 16.53078642327328 + ], + [ + 47.76801729501647, + 16.530791498841506 + ], + [ + 47.768020706474296, + 16.530796315375905 + ], + [ + 47.76802428268679, + 16.530800859674695 + ], + [ + 47.76802801385178, + 16.53080511928227 + ], + [ + 47.768031889742424, + 16.530809082523337 + ], + [ + 47.76803589973517, + 16.530812738534934 + ], + [ + 47.7680400328389, + 16.530816077296183 + ], + [ + 47.76804427772507, + 16.530819089655772 + ], + [ + 47.768048622758734, + 16.530821767357036 + ], + [ + 47.76805305603047, + 16.530824103060578 + ], + [ + 47.76805756538897, + 16.530826090364396 + ], + [ + 47.76806213847441, + 16.530827723821435 + ], + [ + 47.768066762752284, + 16.530828998954494 + ], + [ + 47.76807142554776, + 16.53082991226853 + ], + [ + 47.768076114080436, + 16.53083046126021 + ], + [ + 47.768080815499374, + 16.530830644424782 + ], + [ + 47.76811011597513, + 16.531095570330024 + ], + [ + 47.76809668886304, + 16.531097251074474 + ], + [ + 47.76808322206859, + 16.53109793120032 + ], + [ + 47.768069749257876, + 16.531097609007293 + ], + [ + 47.76805630411204, + 16.53109628530085 + ], + [ + 47.76804292024304, + 16.531093963390173 + ], + [ + 47.768029631109684, + 16.531090649079882 + ], + [ + 47.76801646993391, + 16.53108635065554 + ], + [ + 47.7680034696178, + 16.531081078862915 + ], + [ + 47.767990662661276, + 16.531074846881143 + ], + [ + 47.767978081080884, + 16.53106767028977 + ], + [ + 47.76796575632975, + 16.531059567029796 + ], + [ + 47.76823097459738, + 16.531029939952692 + ], + [ + 47.768242032904105, + 16.531018290000745 + ], + [ + 47.76825268365733, + 16.531005827818255 + ], + [ + 47.76826289993222, + 16.53099258490931 + ], + [ + 47.768272655902294, + 16.530978594751637 + ], + [ + 47.768281926904706, + 16.530963892712006 + ], + [ + 47.76829068950259, + 16.530948515956798 + ], + [ + 47.768298921544336, + 16.530932503358056 + ], + [ + 47.76830660221954, + 16.53091589539523 + ], + [ + 47.76831371211166, + 16.53089873405282 + ], + [ + 47.76832023324706, + 16.530881062714265 + ], + [ + 47.768326149140485, + 16.53086292605226 + ], + [ + 47.7683314448367, + 16.53084436991583 + ], + [ + 47.76825303744394, + 16.530620861616672 + ], + [ + 47.76825547279669, + 16.53063433487386 + ], + [ + 47.76825743232134, + 16.530647978834008 + ], + [ + 47.76825891067946, + 16.53066175632615 + ], + [ + 47.76825990384347, + 16.530675629815548 + ], + [ + 47.76826040910765, + 16.530689561505913 + ], + [ + 47.76826042509547, + 16.530703513442408 + ], + [ + 47.76825995176339, + 16.530717447615036 + ], + [ + 47.76825899040092, + 16.530731326062195 + ], + [ + 47.76825754362716, + 16.5307451109741 + ], + [ + 47.76825561538363, + 16.53075876479578 + ], + [ + 47.76825321092354, + 16.53077225032942 + ], + [ + 47.76825033679749, + 16.530785530835654 + ], + [ + 47.768247000835615, + 16.530798570133708 + ], + [ + 47.76824321212626, + 16.530811332699933 + ], + [ + 47.768238980991185, + 16.53082378376459 + ], + [ + 47.76823431895752, + 16.530835889406593 + ], + [ + 47.76822923872627, + 16.530847616645893 + ], + [ + 47.768223754137786, + 16.530858933533363 + ], + [ + 47.76821788013402, + 16.5308698092378 + ], + [ + 47.76821163271783, + 16.530880214129954 + ], + [ + 47.768205028909385, + 16.530890119863226 + ], + [ + 47.76819808669978, + 16.530899499450904 + ], + [ + 47.768190825002065, + 16.53090832733968 + ], + [ + 47.76818326359964, + 16.53091657947927 + ], + [ + 47.76817542309245, + 16.53092423338794 + ], + [ + 47.768167324840796, + 16.530931268213738 + ], + [ + 47.768158990907175, + 16.530937664791313 + ], + [ + 47.76815044399616, + 16.53094340569414 + ], + [ + 47.76814170739256, + 16.530948475281967 + ], + [ + 47.76813280489795, + 16.53095285974345 + ], + [ + 47.76812376076589, + 16.53095654713377 + ], + [ + 47.76811459963576, + 16.530959527407173 + ], + [ + 47.76810534646573, + 16.530961792444344 + ], + [ + 47.76809602646469, + 16.530963336074525 + ], + [ + 47.76808666502361, + 16.53096415409232 + ], + [ + 47.76807728764636, + 16.530964244269157 + ], + [ + 47.76806791988024, + 16.530963606359368 + ], + [ + 47.76805858724633, + 16.53096224210084 + ], + [ + 47.76804931517002, + 16.530960155210302 + ], + [ + 47.76804012891172, + 16.53095735137317 + ], + [ + 47.76803105349804, + 16.530953838228093 + ], + [ + 47.768022113653615, + 16.530949625346114 + ], + [ + 47.76801333373373, + 16.53094472420461 + ], + [ + 47.768004737657975, + 16.53093914815602 + ], + [ + 47.7679963488451, + 16.53093291239147 + ], + [ + 47.7679881901492, + 16.53092603389938 + ], + [ + 47.76798028379742, + 16.53091853141919 + ], + [ + 47.76797265132948, + 16.530910425390303 + ], + [ + 47.767965313538895, + 16.5309017378964 + ], + [ + 47.767958290416395, + 16.530892492605282 + ], + [ + 47.767951601095454, + 16.530882714704386 + ], + [ + 47.76794526380014, + 16.530872430832158 + ], + [ + 47.76793929579548, + 16.5308616690055 + ], + [ + 47.76793371334042, + 16.530850458543416 + ], + [ + 47.767928531643534, + 16.53083882998717 + ], + [ + 47.76792376482161, + 16.530826815017047 + ], + [ + 47.76791942586114, + 16.530814446366065 + ], + [ + 47.767915526582975, + 16.530801757730792 + ], + [ + 47.76791207761014, + 16.53078878367955 + ], + [ + 47.767909088338854, + 16.53077555955823 + ], + [ + 47.767906566912934, + 16.530762121394005 + ], + [ + 47.76790452020164, + 16.530748505797174 + ], + [ + 47.76790295378094, + 16.530734749861427 + ], + [ + 47.76790187191831, + 16.53072089106279 + ], + [ + 47.76790127756113, + 16.530706967157514 + ], + [ + 47.767901172328635, + 16.53069301607923 + ], + [ + 47.76790155650752, + 16.530679075835604 + ], + [ + 47.76790242905114, + 16.53066518440477 + ], + [ + 47.767903787582384, + 16.530651379631895 + ], + [ + 47.767905628400136, + 16.530637699126043 + ], + [ + 47.767907946489345, + 16.53062418015774 + ], + [ + 47.767910735534734, + 16.53061085955743 + ], + [ + 47.76791398793795, + 16.530597773615124 + ], + [ + 47.7679176948383, + 16.530584957981546 + ], + [ + 47.767921846136886, + 16.530572447571004 + ], + [ + 47.767926430524106, + 16.53056027646627 + ], + [ + 47.76793143551046, + 16.53054847782573 + ], + [ + 47.76793684746061, + 16.53053708379304 + ], + [ + 47.76794265163049, + 16.530526125409562 + ], + [ + 47.767948832207495, + 16.530515632529806 + ], + [ + 47.767955372353555, + 16.530505633740077 + ], + [ + 47.767962254250996, + 16.530496156280602 + ], + [ + 47.76796945915111, + 16.530487225971328 + ], + [ + 47.767976967425206, + 16.530478867141564 + ], + [ + 47.7679847586181, + 16.530471102563716 + ], + [ + 47.76799281150382, + 16.530463953391234 + ], + [ + 47.76800110414347, + 16.530457439100978 + ], + [ + 47.76800961394498, + 16.530451577440186 + ], + [ + 47.76801831772465, + 16.530446384378077 + ], + [ + 47.76802719177031, + 16.530441874062394 + ], + [ + 47.76803621190592, + 16.53043805878082 + ], + [ + 47.76804535355746, + 16.53043494892754 + ], + [ + 47.76805459181984, + 16.530432552974876 + ], + [ + 47.768063901524776, + 16.53043087745026 + ], + [ + 47.76807325730934, + 16.53042992691841 + ], + [ + 47.76808263368508, + 16.530429703968906 + ], + [ + 47.76809200510745, + 16.530430209209147 + ], + [ + 47.76810134604538, + 16.530431441262674 + ], + [ + 47.76811063105085, + 16.530433396772942 + ], + [ + 47.76811983482824, + 16.530436070412453 + ], + [ + 47.76812893230322, + 16.530439454897266 + ], + [ + 47.768137898691045, + 16.530443541006854 + ], + [ + 47.768146709564114, + 16.530448317609206 + ], + [ + 47.768155340918504, + 16.53045377169118 + ], + [ + 47.76816376923936, + 16.530459888393928 + ], + [ + 47.76817197156496, + 16.530466651053395 + ], + [ + 47.768179925549276, + 16.53047404124571 + ], + [ + 47.76818760952285, + 16.530482038837384 + ], + [ + 47.76819500255183, + 16.53049062204015 + ], + [ + 47.76820208449498, + 16.530499767470342 + ], + [ + 47.76820883605861, + 16.530509450212577 + ], + [ + 47.76821523884907, + 16.530519643887654 + ], + [ + 47.768221275422896, + 16.5305303207244 + ], + [ + 47.76792203268757, + 16.530373023529908 + ], + [ + 47.76791141284898, + 16.530385157490954 + ], + [ + 47.76790121121543, + 16.530398061281755 + ], + [ + 47.76789145297174, + 16.530411703046656 + ], + [ + 47.76788216220812, + 16.530426049108183 + ], + [ + 47.76787336186072, + 16.53044106405015 + ], + [ + 47.767865073654995, + 16.530456710805108 + ], + [ + 47.76785731805208, + 16.530472950745846 + ], + [ + 47.767850114198254, + 16.53048974378075 + ], + [ + 47.76784347987771, + 16.530507048452787 + ], + [ + 47.76783743146862, + 16.53052482204184 + ], + [ + 47.76783198390272, + 16.530543020670173 + ], + [ + 47.76782715062843, + 16.530561599410756 + ] + ], + "version": 1 + }, + "complexItemType": "circularSurvey", + "deltaAlpha": 3, + "deltaR": 10, + "fixedDirection": false, + "polygon": [ + [ + 47.768104934026056, + 16.53019867766355 + ], + [ + 47.76837004980939, + 16.530954417342286 + ], + [ + 47.76799341665491, + 16.531158942063684 + ], + [ + 47.767773186698484, + 16.530367723621737 + ], + [ + 47.767978337016025, + 16.530375028338852 + ] + ], + "referencePointAlt": null, + "referencePointLat": 47.768080815499374, + "referencePointLong": 16.530696993043453, + "reverse": false, + "transectMinLength": 15, + "type": "ComplexItem", + "version": 1 }, { "AMSLAltAboveTerrain": null, @@ -720,23 +5611,23 @@ "AltitudeMode": 1, "autoContinue": true, "command": 21, - "doJumpId": 34, + "doJumpId": 278, "frame": 3, "params": [ 0, 0, 0, null, - 47.76776040370392, - 16.530569413178814, + 47.76779208273835, + 16.53052025186404, 0 ], "type": "SimpleItem" } ], "plannedHomePosition": [ - 47.76776040370392, - 16.530569413178814, + 47.76779208273835, + 16.53052025186404, 178 ], "vehicleType": 2, diff --git a/src/Wima/Geometry/WimaMeasurementArea.cc b/src/Wima/Geometry/WimaMeasurementArea.cc index a442503a5..02f0af2f1 100644 --- a/src/Wima/Geometry/WimaMeasurementArea.cc +++ b/src/Wima/Geometry/WimaMeasurementArea.cc @@ -1,10 +1,16 @@ #include "WimaMeasurementArea.h" +#include "SnakeTile.h" +#include "snake.h" + +#include const char *WimaMeasurementArea::settingsGroup = "MeasurementArea"; -const char *WimaMeasurementArea::bottomLayerAltitudeName = - "BottomLayerAltitude"; -const char *WimaMeasurementArea::numberOfLayersName = "NumberOfLayers"; -const char *WimaMeasurementArea::layerDistanceName = "LayerDistance"; +const char *WimaMeasurementArea::tileHeightName = "TileHeight"; +const char *WimaMeasurementArea::tileWidthName = "TileWidth"; +const char *WimaMeasurementArea::minTileAreaName = "MinTileArea"; +const char *WimaMeasurementArea::transectDistanceName = "TransectDistance"; +const char *WimaMeasurementArea::minTransectLengthName = "MinTransectLength"; +const char *WimaMeasurementArea::showTilesName = "ShowTiles"; const char *WimaMeasurementArea::WimaMeasurementAreaName = "Measurement Area"; WimaMeasurementArea::WimaMeasurementArea(QObject *parent) @@ -12,15 +18,21 @@ WimaMeasurementArea::WimaMeasurementArea(QObject *parent) _metaDataMap(FactMetaData::createMapFromJsonFile( QStringLiteral(":/json/WimaMeasurementArea.SettingsGroup.json"), this /* QObject parent */)), - _bottomLayerAltitude(SettingsFact(settingsGroup, - _metaDataMap[bottomLayerAltitudeName], - this /* QObject parent */)), - _numberOfLayers(SettingsFact(settingsGroup, - _metaDataMap[numberOfLayersName], - this /* QObject parent */)), - _layerDistance(SettingsFact(settingsGroup, - _metaDataMap[layerDistanceName], - this /* QObject parent */)) { + _tileHeight(SettingsFact(settingsGroup, _metaDataMap[tileHeightName], + this /* QObject parent */)), + _tileWidth(SettingsFact(settingsGroup, _metaDataMap[tileWidthName], + this /* QObject parent */)), + _minTileArea(SettingsFact(settingsGroup, _metaDataMap[minTileAreaName], + this /* QObject parent */)), + _transectDistance(SettingsFact(settingsGroup, + _metaDataMap[transectDistanceName], + this /* QObject parent */)), + _minTransectLength(SettingsFact(settingsGroup, + _metaDataMap[minTransectLengthName], + this /* QObject parent */)), + _showTiles(SettingsFact(settingsGroup, _metaDataMap[showTilesName], + this /* QObject parent */)), + _calculating(false) { init(); } @@ -30,15 +42,21 @@ WimaMeasurementArea::WimaMeasurementArea(const WimaMeasurementArea &other, _metaDataMap(FactMetaData::createMapFromJsonFile( QStringLiteral(":/json/WimaMeasurementArea.SettingsGroup.json"), this /* QObject parent */)), - _bottomLayerAltitude(SettingsFact(settingsGroup, - _metaDataMap[bottomLayerAltitudeName], - this /* QObject parent */)), - _numberOfLayers(SettingsFact(settingsGroup, - _metaDataMap[numberOfLayersName], - this /* QObject parent */)), - _layerDistance(SettingsFact(settingsGroup, - _metaDataMap[layerDistanceName], - this /* QObject parent */)) { + _tileHeight(SettingsFact(settingsGroup, _metaDataMap[tileHeightName], + this /* QObject parent */)), + _tileWidth(SettingsFact(settingsGroup, _metaDataMap[tileWidthName], + this /* QObject parent */)), + _minTileArea(SettingsFact(settingsGroup, _metaDataMap[minTileAreaName], + this /* QObject parent */)), + _transectDistance(SettingsFact(settingsGroup, + _metaDataMap[transectDistanceName], + this /* QObject parent */)), + _minTransectLength(SettingsFact(settingsGroup, + _metaDataMap[minTransectLengthName], + this /* QObject parent */)), + _showTiles(SettingsFact(settingsGroup, _metaDataMap[showTilesName], + this /* QObject parent */)), + _calculating(false) { init(); } @@ -54,6 +72,10 @@ operator=(const WimaMeasurementArea &other) { return *this; } +WimaMeasurementArea::~WimaMeasurementArea() { + this->_tiles.clearAndDeleteContents(); +} + QString WimaMeasurementArea::mapVisualQML() const { return "WimaMeasurementAreaMapVisual.qml"; } @@ -64,11 +86,24 @@ QString WimaMeasurementArea::editorQML() const { Fact *WimaMeasurementArea::tileHeight() { return &_tileHeight; } +Fact *WimaMeasurementArea::tileWidth() { return &_tileWidth; } + +Fact *WimaMeasurementArea::minTileArea() { return &_minTileArea; } + +Fact *WimaMeasurementArea::transectDistance() { return &_transectDistance; } + +Fact *WimaMeasurementArea::minTransectLength() { return &_minTransectLength; } + +Fact *WimaMeasurementArea::showTiles() { return &_showTiles; } + void WimaMeasurementArea::saveToJson(QJsonObject &json) { this->WimaArea::saveToJson(json); - json[bottomLayerAltitudeName] = _bottomLayerAltitude.rawValue().toDouble(); - json[numberOfLayersName] = _numberOfLayers.rawValue().toInt(); - json[layerDistanceName] = _layerDistance.rawValue().toDouble(); + json[tileHeightName] = _tileHeight.rawValue().toDouble(); + json[tileWidthName] = _tileWidth.rawValue().toDouble(); + json[minTileAreaName] = _minTileArea.rawValue().toDouble(); + json[transectDistanceName] = _transectDistance.rawValue().toDouble(); + json[minTransectLengthName] = _minTransectLength.rawValue().toDouble(); + json[showTilesName] = _showTiles.rawValue().toBool(); json[areaTypeName] = WimaMeasurementAreaName; } @@ -77,79 +112,119 @@ bool WimaMeasurementArea::loadFromJson(const QJsonObject &json, if (this->WimaArea::loadFromJson(json, errorString)) { bool retVal = true; - if (json.contains(bottomLayerAltitudeName) && - json[bottomLayerAltitudeName].isDouble()) { - _bottomLayerAltitude.setRawValue( - json[bottomLayerAltitudeName].toDouble()); + if (json.contains(tileHeightName) && json[tileHeightName].isDouble()) { + _tileHeight.setRawValue(json[tileHeightName].toDouble()); } else { - errorString.append(tr("Could not load Bottom Layer Altitude!\n")); + errorString.append(tr("Could not load tile height!\n")); retVal = false; } - if (json.contains(numberOfLayersName) && - json[numberOfLayersName].isDouble()) { - _numberOfLayers.setRawValue(json[numberOfLayersName].toInt()); + if (json.contains(tileWidthName) && json[tileWidthName].isDouble()) { + _tileHeight.setRawValue(json[tileWidthName].toDouble()); } else { - errorString.append(tr("Could not load Number of Layers!\n")); + errorString.append(tr("Could not load tile width!\n")); retVal = false; } - if (json.contains(layerDistanceName) && - json[layerDistanceName].isDouble()) { - _layerDistance.setRawValue(json[layerDistanceName].toDouble()); + if (json.contains(minTileAreaName) && json[minTileAreaName].isDouble()) { + _tileHeight.setRawValue(json[minTileAreaName].toDouble()); } else { - errorString.append(tr("Could not load Layer Distance!\n")); + errorString.append(tr("Could not load minimal tile area!\n")); retVal = false; } + if (json.contains(transectDistanceName) && + json[transectDistanceName].isDouble()) { + _tileHeight.setRawValue(json[transectDistanceName].toDouble()); + } else { + errorString.append(tr("Could not load transect distance!\n")); + retVal = false; + } + + if (json.contains(minTransectLengthName) && + json[minTransectLengthName].isDouble()) { + _tileHeight.setRawValue(json[minTransectLengthName].toDouble()); + } else { + errorString.append(tr("Could not load minimal transect length!\n")); + retVal = false; + } + + if (json.contains(showTilesName) && json[showTilesName].isBool()) { + _tileHeight.setRawValue(json[showTilesName].toDouble()); + } else { + errorString.append(tr("Could not load show tiles !\n")); + retVal = false; + } return retVal; } else { return false; } } -void WimaMeasurementArea::setBottomLayerAltitude(double altitude) { - if (!qFuzzyCompare(_bottomLayerAltitude.rawValue().toDouble(), altitude)) { - _bottomLayerAltitude.setRawValue(altitude); - - emit bottomLayerAltitudeChanged(); +void WimaMeasurementArea::doUpdate() { + using namespace snake; + using namespace boost::units; +#ifdef SNAKE_SHOW_TIME + auto start = std::chrono::high_resolution_clock::now(); +#endif + auto polygon = this->coordinateList(); + for (auto &v : polygon) { + v.setAltitude(0); } -} - -void WimaMeasurementArea::setNumberOfLayers(double numLayers) { - if (!qFuzzyCompare(_numberOfLayers.rawValue().toDouble(), numLayers)) { - _numberOfLayers.setRawValue(numLayers); - - emit numberOfLayersChanged(); + if (polygon.size() > 3) { + QGeoCoordinate origin = polygon.first(); + BoostPolygon polygonENU; + areaToEnu(origin, polygon, polygonENU); + Length height = this->_tileHeight.rawValue().toDouble() * si::meter; + Length width = this->_tileWidth.rawValue().toDouble() * si::meter; + Area minArea = + this->_minTileArea.rawValue().toDouble() * si::meter * si::meter; + std::vector tilesENU; + BoundingBox bbox; + std::string errorString; + if (snake::tiles(polygonENU, height, width, minArea, tilesENU, bbox, + errorString)) { + this->_tiles.clearAndDeleteContents(); + for (const auto &t : tilesENU) { + auto geoTile = new SnakeTile(&this->_tiles); + for (const auto &v : t.outer()) { + QGeoCoordinate geoVertex; + fromENU(origin, v, geoVertex); + geoTile->push_back(geoVertex); + } + this->_tiles.append(geoTile); + } + } } +#ifdef SNAKE_SHOW_TIME + qDebug() << "WimaMeasurementArea::doUpdate execution time: " + << std::chrono::duration_cast( + std::chrono::high_resolution_clock::now() - start) + .count() + << " ms"; +#endif } -void WimaMeasurementArea::setLayerDistance(double layerDistance) { - if (!qFuzzyCompare(_layerDistance.rawValue().toDouble(), layerDistance)) { - _layerDistance.setRawValue(layerDistance); - - emit layerDistanceChanged(); +void WimaMeasurementArea::deferUpdate() { + if (this->_timer.isActive()) { + this->_timer.stop(); } -} - -void print(const WimaMeasurementArea &area) { - QString message; - print(area, message); - qWarning() << message; -} - -void print(const WimaMeasurementArea &area, QString outputStr) { - print(static_cast(area), outputStr); - outputStr.append(QString("Bottom Layer Altitude: %1\n") - .arg(area._bottomLayerAltitude.rawValue().toDouble())); - outputStr.append(QString("Number of Layers: %1\n") - .arg(area._numberOfLayers.rawValue().toInt())); - outputStr.append(QString("Layer Distance: %1\n") - .arg(area._layerDistance.rawValue().toDouble())); + this->_timer.start(100); } void WimaMeasurementArea::init() { this->setObjectName(WimaMeasurementAreaName); + connect(&this->_tileHeight, &Fact::rawValueChanged, this, + &WimaMeasurementArea::deferUpdate); + connect(&this->_tileWidth, &Fact::rawValueChanged, this, + &WimaMeasurementArea::deferUpdate); + connect(&this->_minTileArea, &Fact::rawValueChanged, this, + &WimaMeasurementArea::deferUpdate); + connect(this, &WimaArea::pathChanged, this, + &WimaMeasurementArea::deferUpdate); + this->_timer.setSingleShot(true); + connect(&this->_timer, &QTimer::timeout, this, + &WimaMeasurementArea::doUpdate); } /*! diff --git a/src/Wima/Geometry/WimaMeasurementArea.h b/src/Wima/Geometry/WimaMeasurementArea.h index 02d78966b..06e9c5594 100644 --- a/src/Wima/Geometry/WimaMeasurementArea.h +++ b/src/Wima/Geometry/WimaMeasurementArea.h @@ -1,7 +1,7 @@ #pragma once -#include "QScopedPointer" #include +#include #include "WimaArea.h" @@ -14,14 +14,25 @@ public: WimaMeasurementArea(const WimaMeasurementArea &other, QObject *parent = nullptr); WimaMeasurementArea &operator=(const WimaMeasurementArea &other); + ~WimaMeasurementArea(); - Q_PROPERTY(Fact *borderPolygonOffset READ borderPolygonOffsetFact CONSTANT) + Q_PROPERTY(Fact *tileHeight READ tileHeight CONSTANT) + Q_PROPERTY(Fact *tileWidth READ tileWidth CONSTANT) + Q_PROPERTY(Fact *minTileArea READ minTileArea CONSTANT) + Q_PROPERTY(Fact *transectDistance READ transectDistance CONSTANT) + Q_PROPERTY(Fact *minTransectLength READ minTransectLength CONSTANT) + Q_PROPERTY(Fact *showTiles READ showTiles CONSTANT) // Overrides from WimaPolygon - QString mapVisualQML(void) const { - return "WimaMeasurementAreaMapVisual.qml"; - } - QString editorQML(void) const { return "WimaMeasurementAreaEditor.qml"; } + QString mapVisualQML(void) const; + QString editorQML(void) const; + + Fact *tileHeight(); + Fact *tileWidth(); + Fact *minTileArea(); + Fact *transectDistance(); + Fact *minTransectLength(); + Fact *showTiles(); // Member Methodes void saveToJson(QJsonObject &json); @@ -36,14 +47,19 @@ public: static const char *tileHeightName; static const char *tileWidthName; static const char *minTileAreaName; - static const char *transcetDistanceName; - static const char *minTransectLength; + static const char *transectDistanceName; + static const char *minTransectLengthName; + static const char *showTilesName; static const char *WimaMeasurementAreaName; signals: public slots: +private slots: + void doUpdate(); + void deferUpdate(); + private: // Member Methodes void init(); @@ -51,9 +67,15 @@ private: // Members QMap _metaDataMap; - SettingsFact _tileWidth; SettingsFact _tileHeight; + SettingsFact _tileWidth; SettingsFact _minTileArea; SettingsFact _transectDistance; SettingsFact _minTransectLength; + SettingsFact _showTiles; + + // Tile stuff. + QTimer _timer; + std::atomic_bool _calculating; + QmlObjectListModel _tiles; }; diff --git a/src/Wima/Geometry/json/WimaMeasurementArea.SettingsGroup.json b/src/Wima/Geometry/json/WimaMeasurementArea.SettingsGroup.json index b1998a39a..cd838205e 100644 --- a/src/Wima/Geometry/json/WimaMeasurementArea.SettingsGroup.json +++ b/src/Wima/Geometry/json/WimaMeasurementArea.SettingsGroup.json @@ -1,31 +1,55 @@ [ { - "name": "BottomLayerAltitude", - "shortDescription": "The distance between the terrain and the first layer of the measurement path.", + "name": "TileHeight", + "shortDescription": "The height of a tile", "type": "double", "units": "m", - "min": 1, + "min": 0.3, "decimalPlaces": 2, "defaultValue": 5 }, { - "name": "NumberOfLayers", - "shortDescription": "The number of layers.", - "type": "uint32", + "name": "TileWidth", + "shortDescription": "The height of a tile", + "type": "double", "units": "m", - "min": 1, - "decimalPlaces": 0, - "defaultValue": 1 + "min": 0.3, + "decimalPlaces": 2, + "defaultValue": 5 }, { - "name": "LayerDistance", - "shortDescription": "Specify the time between each photo", + "name": "MinTileArea", + "shortDescription": "The minimal allowed area of a tile", + "type": "double", + "units": "m^2", + "min": 0, + "decimalPlaces": 2, + "defaultValue": 5 +}, +{ + "name": "TransectDistance", + "shortDescription": "The transect distance", + "type": "double", + "units": "m", + "min": 0.3, + "decimalPlaces": 2, + "defaultValue": 2 +}, +{ + "name": "MinTransectLength", + "shortDescription": "The minimal transect length", "type": "double", "units": "m", "min": 0, "decimalPlaces": 2, "defaultValue": 1 }, +{ + "name": "ShowTiles", + "shortDescription": "Show tiles", + "type": "bool", + "defaultValue": true +}, { "name": "BorderPolygonOffset", "shortDescription": "The distance between the measurement area and it's enclosing polygon", diff --git a/src/Wima/Snake/SnakeThread.cc b/src/Wima/Snake/SnakeThread.cc index d0d61efa2..06b0b443c 100644 --- a/src/Wima/Snake/SnakeThread.cc +++ b/src/Wima/Snake/SnakeThread.cc @@ -97,7 +97,12 @@ public: bool doTopicServiceSetup(); // Internal data. - snake::Scenario scenario; + snake::BoostPolygon mAreaENU; + snake::BoostPolygon sAreaENU; + snake::BoostPolygon corridorENU; + snake::BoostPolygon jAreaENU; + std::vector tilesENU; + QGeoCoordinate ENUOrigin; SnakeThread *parent; // Input @@ -225,36 +230,35 @@ void SnakeThread::setLineDistance(Length lineDistance) { Area SnakeThread::minTileArea() const { SharedLock lk(this->pImpl->input.mutex); - return this->pImpl->scenario.minTileArea(); + return this->pImpl->input.minTileArea; } void SnakeThread::setMinTileArea(Area minTileArea) { - this->pImpl->input.scenarioChanged = true; this->pImpl->input.scenarioChanged = true; UniqueLock lk(this->pImpl->input.mutex); - this->pImpl->scenario.setMinTileArea(minTileArea); + this->pImpl->input.minTileArea = minTileArea; } Length SnakeThread::tileHeight() const { SharedLock lk(this->pImpl->input.mutex); - return this->pImpl->scenario.tileHeight(); + return this->pImpl->input.tileHeight; } void SnakeThread::setTileHeight(Length tileHeight) { this->pImpl->input.scenarioChanged = true; UniqueLock lk(this->pImpl->input.mutex); - this->pImpl->scenario.setTileHeight(tileHeight); + this->pImpl->input.tileHeight = tileHeight; } Length SnakeThread::tileWidth() const { SharedLock lk(this->pImpl->input.mutex); - return this->pImpl->scenario.tileWidth(); + return this->pImpl->input.tileWidth; } void SnakeThread::setTileWidth(Length tileWidth) { this->pImpl->input.scenarioChanged = true; UniqueLock lk(this->pImpl->input.mutex); - this->pImpl->scenario.setTileWidth(tileWidth); + this->pImpl->input.tileWidth = tileWidth; } void SnakeThread::run() { @@ -279,10 +283,13 @@ void SnakeThread::run() { this->pImpl->output.calcInProgress.store(false); emit calcInProgressChanged(this->pImpl->output.calcInProgress.load()); }; - CommandRAII onExitRAII(onExit); + CommandRAII commandRAII(onExit); bool tilesValid = true; - QGeoCoordinate origin; + bool progressValid = false; + snake::Length lineDistance; + snake::Length minTransectLength; + std::vector progress; { // Check preconditions. SharedLock lk(this->pImpl->input.mutex); @@ -295,118 +302,100 @@ void SnakeThread::run() { this->pImpl->output.errorMessage = "Service area invalid: size < 3."; tilesValid = false; } else { - // Set Origin - origin = this->pImpl->input.mArea.front(); // Update Scenario if necessary if (this->pImpl->input.scenarioChanged) { + // Set Origin + this->pImpl->ENUOrigin = this->pImpl->input.mArea.front(); // Update measurement area. - auto &mAreaEnu = this->pImpl->scenario.measurementArea(); - auto &mArea = this->pImpl->input.mArea; - mAreaEnu.clear(); - for (auto geoVertex : mArea) { - snake::BoostPoint p; - snake::toENU(origin, geoVertex, p); - mAreaEnu.outer().push_back(p); - } + this->pImpl->mAreaENU.clear(); + snake::areaToEnu(this->pImpl->ENUOrigin, this->pImpl->input.mArea, + this->pImpl->mAreaENU); // Update service area. - auto &sAreaEnu = this->pImpl->scenario.serviceArea(); - auto &sArea = this->pImpl->input.sArea; - sAreaEnu.clear(); - for (auto geoVertex : sArea) { - snake::BoostPoint p; - snake::toENU(origin, geoVertex, p); - sAreaEnu.outer().push_back(p); - } + this->pImpl->sAreaENU.clear(); + snake::areaToEnu(this->pImpl->ENUOrigin, this->pImpl->input.sArea, + this->pImpl->sAreaENU); // Update corridor. - auto &corridorEnu = this->pImpl->scenario.corridor(); - auto &corridor = this->pImpl->input.corridor; - corridorEnu.clear(); - for (auto geoVertex : corridor) { - snake::BoostPoint p; - snake::toENU(origin, geoVertex, p); - corridorEnu.outer().push_back(p); - } - // Update parametes. - this->pImpl->scenario.setTileHeight(this->pImpl->input.tileHeight); - this->pImpl->scenario.setTileWidth(this->pImpl->input.tileWidth); - this->pImpl->scenario.setMinTileArea(this->pImpl->input.minTileArea); - - if (!this->pImpl->scenario.update()) { - this->pImpl->output.errorMessage = - this->pImpl->scenario.errorString.c_str(); + this->pImpl->corridorENU.clear(); + snake::areaToEnu(this->pImpl->ENUOrigin, this->pImpl->input.corridor, + this->pImpl->corridorENU); + // Fetch parametes. + auto tileHeight = this->pImpl->input.tileHeight; + auto tileWidth = this->pImpl->input.tileWidth; + auto minTileArea = this->pImpl->input.minTileArea; + // Update tiles. + this->pImpl->tilesENU.clear(); + this->pImpl->jAreaENU.clear(); + std::string errorString; + snake::BoundingBox bbox; + if (!snake::joinedArea(this->pImpl->mAreaENU, this->pImpl->sAreaENU, + this->pImpl->corridorENU, this->pImpl->jAreaENU, + errorString) || + !snake::tiles(this->pImpl->mAreaENU, tileHeight, tileWidth, + minTileArea, this->pImpl->tilesENU, bbox, + errorString)) { + UniqueLock uLock(this->pImpl->output.mutex); + this->pImpl->output.errorMessage = errorString.c_str(); tilesValid = false; } } + if (tilesValid) { + // Sample data + lineDistance = this->pImpl->input.lineDistance; + minTransectLength = this->pImpl->input.minTransectLength; + // Verify progress. + size_t nTiles = this->pImpl->tilesENU.size(); + if (size_t(this->pImpl->input.progress.progress().size()) != nTiles) { + for (size_t i = 0; i < nTiles; ++i) { + progress.push_back(0); + } + } else { + for (size_t i = 0; i < nTiles; ++i) { + progress.push_back(this->pImpl->input.progress.progress()[i]); + } + } + progressValid = tilesValid; + } } } - bool waypointsValid = tilesValid; - bool progressValid = tilesValid; - snake::flight_plan::Transects transects; - snake::flight_plan::Transects transectsRouted; - snake::flight_plan::Route route; - std::vector progress; + bool waypointsValid = true; + snake::Transects transects; + snake::Transects transectsRouted; + snake::Route route; bool needWaypointUpdate = this->pImpl->input.scenarioChanged || this->pImpl->input.routeParametersChanged || this->pImpl->input.progressChanged; if (tilesValid) { if (needWaypointUpdate) { - // Sample data - SharedLock inputLock(this->pImpl->input.mutex); - // Verify progress. - size_t nTiles = this->pImpl->scenario.tiles().size(); - if (size_t(this->pImpl->input.progress.progress().size()) != nTiles) { - for (size_t i = 0; i < nTiles; ++i) { - progress.push_back(0); - } - } else { - for (size_t i = 0; i < nTiles; ++i) { - progress.push_back(this->pImpl->input.progress.progress()[i]); - } - } - // Copy remaining parameters and release lock. - const auto &scenario = this->pImpl->scenario; - const auto lineDistance = this->pImpl->input.lineDistance; - const auto minTransectLength = this->pImpl->input.minTransectLength; - inputLock.unlock(); - - // Create transects. + // Data needed for transects. std::string errorString; - snake::Angle alpha(scenario.mAreaBoundingBox().angle * si::radian); - std::cout << "Transects angle: " << alpha << std::endl; - transects.push_back( - bg::model::linestring{scenario.homePositon()}); - - bool success = snake::flight_plan::transectsFromScenario( - lineDistance, minTransectLength, alpha, scenario, progress, transects, - errorString); + snake::BoundingBox bbox; + snake::minimalBoundingBox(this->pImpl->mAreaENU, bbox); + snake::Angle alpha(bbox.angle * si::radian); + snake::BoostPoint home; + snake::polygonCenter(this->pImpl->sAreaENU, home); + transects.push_back(bg::model::linestring{home}); + // Create transects. + bool success = snake::transectsFromScenario( + lineDistance, minTransectLength, alpha, this->pImpl->mAreaENU, + this->pImpl->tilesENU, progress, transects, errorString); if (!success) { UniqueLock lk(this->pImpl->output.mutex); this->pImpl->output.errorMessage = errorString.c_str(); waypointsValid = false; - progressValid = true; } else if (transects.size() > 1) { - success = - snake::flight_plan::route(scenario.joinedArea(), transects, - transectsRouted, route, errorString); + // Route transects. + success = snake::route(this->pImpl->jAreaENU, transects, + transectsRouted, route, errorString); if (!success) { UniqueLock lk(this->pImpl->output.mutex); this->pImpl->output.errorMessage = errorString.c_str(); waypointsValid = false; - progressValid = true; - } else { - waypointsValid = true; - progressValid = true; } } else { // No transects waypointsValid = false; - progressValid = true; } - } else { - // No update necessary - waypointsValid = true; - progressValid = true; } } @@ -428,26 +417,25 @@ void SnakeThread::run() { this->pImpl->output.tileCenterPoints.clear(); this->pImpl->output.tilesENU.polygons().clear(); this->pImpl->output.tileCenterPointsENU.clear(); - this->pImpl->output.ENUOrigin = origin; // Convert and store scenario data. - const auto &tiles = this->pImpl->scenario.tiles(); - const auto ¢erPoints = this->pImpl->scenario.tileCenterPoints(); + const auto &tiles = this->pImpl->tilesENU; for (unsigned int i = 0; i < tiles.size(); ++i) { const auto &tile = tiles[i]; SnakeTile geoTile; SnakeTileLocal enuTile; for (size_t i = 0; i < tile.outer().size() - 1; ++i) { - auto &p = tile.outer()[i]; - QPointF enuVertex(p.get<0>(), p.get<1>()); + const auto &p = tile.outer()[i]; + QPointF enuVertex{p.get<0>(), p.get<1>()}; QGeoCoordinate geoVertex; - snake::fromENU(origin, p, geoVertex); + snake::fromENU(this->pImpl->ENUOrigin, p, geoVertex); enuTile.polygon().points().push_back(enuVertex); geoTile.push_back(geoVertex); } - const auto &boostPoint = centerPoints[i]; - QPointF enuVertex(boostPoint.get<0>(), boostPoint.get<1>()); + snake::BoostPoint centerPoint; + snake::polygonCenter(tile, centerPoint); + QPointF enuVertex(centerPoint.get<0>(), centerPoint.get<1>()); QGeoCoordinate geoVertex; - snake::fromENU(origin, boostPoint, geoVertex); + snake::fromENU(this->pImpl->ENUOrigin, centerPoint, geoVertex); geoTile.setCenter(geoVertex); this->pImpl->output.tiles.polygons().push_back(geoTile); this->pImpl->output.tileCenterPoints.push_back( @@ -463,7 +451,7 @@ void SnakeThread::run() { this->pImpl->input.progress.progress().clear(); this->pImpl->output.progressUpdated = true; } else if (this->pImpl->input.progressChanged) { - if (progress.size() == this->pImpl->scenario.tiles().size()) { + if (progress.size() == this->pImpl->tilesENU.size()) { auto &qProgress = this->pImpl->input.progress; qProgress.progress().clear(); for (const auto &p : progress) { @@ -501,7 +489,7 @@ void SnakeThread::run() { } QPointF enuVertex{boostVertex.get<0>(), boostVertex.get<1>()}; QGeoCoordinate geoVertex; - snake::fromENU(origin, boostVertex, geoVertex); + snake::fromENU(this->pImpl->ENUOrigin, boostVertex, geoVertex); this->pImpl->output.arrivalPathENU.push_back(enuVertex); this->pImpl->output.arrivalPath.push_back(geoVertex); } @@ -516,7 +504,7 @@ void SnakeThread::run() { } QPointF enuVertex{boostVertex.get<0>(), boostVertex.get<1>()}; QGeoCoordinate geoVertex; - snake::fromENU(origin, boostVertex, geoVertex); + snake::fromENU(this->pImpl->ENUOrigin, boostVertex, geoVertex); this->pImpl->output.returnPathENU.push_back(enuVertex); this->pImpl->output.returnPath.push_back(geoVertex); } @@ -525,7 +513,7 @@ void SnakeThread::run() { const auto &boostVertex = route[i]; QPointF enuVertex{boostVertex.get<0>(), boostVertex.get<1>()}; QGeoCoordinate geoVertex; - snake::fromENU(origin, boostVertex, geoVertex); + snake::fromENU(this->pImpl->ENUOrigin, boostVertex, geoVertex); this->pImpl->output.waypointsENU.push_back(enuVertex); this->pImpl->output.waypoints.push_back(geoVertex); } diff --git a/src/Wima/Snake/SnakeTile.cpp b/src/Wima/Snake/SnakeTile.cpp index 44617ab65..92d9b9f12 100644 --- a/src/Wima/Snake/SnakeTile.cpp +++ b/src/Wima/Snake/SnakeTile.cpp @@ -1,6 +1,6 @@ #include "SnakeTile.h" -SnakeTile::SnakeTile() : WimaAreaData() {} +SnakeTile::SnakeTile(QObject *parent) : WimaAreaData(parent) {} SnakeTile::SnakeTile(const SnakeTile &other, QObject *parent) : WimaAreaData(parent) { diff --git a/src/Wima/Snake/SnakeTile.h b/src/Wima/Snake/SnakeTile.h index c527b4a4f..668cba070 100644 --- a/src/Wima/Snake/SnakeTile.h +++ b/src/Wima/Snake/SnakeTile.h @@ -4,7 +4,7 @@ class SnakeTile : public WimaAreaData { public: - SnakeTile(); + SnakeTile(QObject *parent = nullptr); SnakeTile(const SnakeTile &other, QObject *parent = nullptr); QString type() const { return "Tile"; } diff --git a/src/Wima/Snake/snake.cpp b/src/Wima/Snake/snake.cpp index a8753b2c3..a2093df46 100644 --- a/src/Wima/Snake/snake.cpp +++ b/src/Wima/Snake/snake.cpp @@ -375,160 +375,71 @@ void shortestPathFromGraph(const Matrix &graph, size_t startIndex, assert(ret); (void)ret; } - - //========================================================================= - // Scenario calculation. - //========================================================================= -} -Scenario::Scenario() - : _tileWidth(5 * bu::si::meter), _tileHeight(5 * bu::si::meter), - _minTileArea(0 * bu::si::meter * bu::si::meter), _needsUpdate(true) {} - -void Scenario::setMeasurementArea(const BoostPolygon &area) { - _needsUpdate = true; - _mArea = area; -} - -void Scenario::setServiceArea(const BoostPolygon &area) { - _needsUpdate = true; - _sArea = area; -} - -void Scenario::setCorridor(const BoostPolygon &area) { - _needsUpdate = true; - _corridor = area; -} - -BoostPolygon &Scenario::measurementArea() { - _needsUpdate = true; - return _mArea; -} - -BoostPolygon &Scenario::serviceArea() { - _needsUpdate = true; - return _sArea; -} - -BoostPolygon &Scenario::corridor() { - _needsUpdate = true; - return _corridor; -} - -const BoundingBox &Scenario::mAreaBoundingBox() const { - return _mAreaBoundingBox; } -const BoostPolygon &Scenario::measurementArea() const { return _mArea; } - -const BoostPolygon &Scenario::serviceArea() const { return _sArea; } - -const BoostPolygon &Scenario::corridor() const { return _corridor; } - -const BoostPolygon &Scenario::joinedArea() const { return _jArea; } - -const vector &Scenario::tiles() const { return _tiles; } - -const BoostLineString &Scenario::tileCenterPoints() const { - return _tileCenterPoints; -} - -const BoundingBox &Scenario::measurementAreaBBox() const { - return _mAreaBoundingBox; -} - -const BoostPoint &Scenario::homePositon() const { return _homePosition; } - -bool Scenario::update() { - if (!_needsUpdate) - return true; - bg::correct(_mArea); - bg::correct(_sArea); - bg::correct(_corridor); - polygonCenter(_sArea, _homePosition); - if (!_calculateJoinedArea()) - return false; - if (!_calculateBoundingBox()) +bool tiles(const BoostPolygon &area, Length tileHeight, Length tileWidth, + Area minTileArea, std::vector &tiles, + BoundingBox &bbox, string &errorString) { + if (area.outer().empty() || area.outer().size() < 4) { + errorString = "Area has to few vertices."; return false; - if (!_calculateTiles()) - return false; - _needsUpdate = false; - return true; -} - -bool Scenario::_calculateBoundingBox() const { - return minimalBoundingBox(_mArea, _mAreaBoundingBox); -} + } -/** - * Devides the (measurement area) bounding box into tiles and clips it to the - * measurement area. - * - * Devides the (measurement area) bounding box into tiles of width \p tileWidth - * and height \p tileHeight. Clips the resulting tiles to the measurement area. - * Tiles are rejected, if their area is smaller than \p minTileArea. The - * function assumes that \a _mArea and \a _mAreaBoundingBox have correct values. - * \see \ref Scenario::_areas2enu() and \ref Scenario::_calculateBoundingBox(). - * - * @param tileWidth The width (>0) of a tile. - * @param tileHeight The heigth (>0) of a tile. - * @param minTileArea The minimal area (>0) of a tile. - * - * @return Returns true if successful. - */ -bool Scenario::_calculateTiles() const { - _tiles.clear(); - _tileCenterPoints.clear(); - - if (_tileWidth <= 0 * bu::si::meter || _tileHeight <= 0 * bu::si::meter || - _minTileArea < 0 * bu::si::meter * bu::si::meter) { + if (tileWidth <= 0 * bu::si::meter || tileHeight <= 0 * bu::si::meter || + minTileArea < 0 * bu::si::meter * bu::si::meter) { std::stringstream ss; - ss << "Parameters tileWidth (" << _tileWidth << "), tileHeight (" - << _tileHeight << "), minTileArea (" << _minTileArea + ss << "Parameters tileWidth (" << tileWidth << "), tileHeight (" + << tileHeight << "), minTileArea (" << minTileArea << ") must be positive."; errorString = ss.str(); return false; } - double bboxWidth = _mAreaBoundingBox.width; - double bboxHeight = _mAreaBoundingBox.height; + if (bbox.corners.outer().size() != 5) { + bbox.corners.clear(); + minimalBoundingBox(area, bbox); + } - BoostPoint origin = _mAreaBoundingBox.corners.outer()[0]; + if (bbox.corners.outer().size() < 5) + return false; + double bboxWidth = bbox.width; + double bboxHeight = bbox.height; + BoostPoint origin = bbox.corners.outer()[0]; // cout << "Origin: " << origin[0] << " " << origin[1] << endl; // Transform _mArea polygon to bounding box coordinate system. trans::rotate_transformer rotate( - _mAreaBoundingBox.angle * 180 / M_PI); + bbox.angle * 180 / M_PI); trans::translate_transformer translate(-origin.get<0>(), -origin.get<1>()); BoostPolygon translated_polygon; BoostPolygon rotated_polygon; - boost::geometry::transform(_mArea, translated_polygon, translate); + boost::geometry::transform(area, translated_polygon, translate); boost::geometry::transform(translated_polygon, rotated_polygon, rotate); bg::correct(rotated_polygon); - // cout << bg::wkt(rotated_polygon) << endl; - size_t iMax = ceil(bboxWidth / _tileWidth.value()); - size_t jMax = ceil(bboxHeight / _tileHeight.value()); + size_t iMax = ceil(bboxWidth / tileWidth.value()); + size_t jMax = ceil(bboxHeight / tileHeight.value()); if (iMax < 1 || jMax < 1) { std::stringstream ss; - ss << "Tile width (" << _tileWidth << ") or tile height (" << _tileHeight + ss << "Tile width (" << tileWidth << ") or tile height (" << tileHeight << ") to large for measurement area."; errorString = ss.str(); return false; } trans::rotate_transformer rotate_back( - -_mAreaBoundingBox.angle * 180 / M_PI); + -bbox.angle * 180 / M_PI); trans::translate_transformer translate_back(origin.get<0>(), origin.get<1>()); for (size_t i = 0; i < iMax; ++i) { - double x_min = _tileWidth.value() * i; - double x_max = x_min + _tileWidth.value(); + double x_min = tileWidth.value() * i; + double x_max = x_min + tileWidth.value(); for (size_t j = 0; j < jMax; ++j) { - double y_min = _tileHeight.value() * j; - double y_max = y_min + _tileHeight.value(); + double y_min = tileHeight.value() * j; + double y_max = y_min + tileHeight.value(); BoostPolygon tile_unclipped; tile_unclipped.outer().push_back(BoostPoint{x_min, y_min}); @@ -543,7 +454,7 @@ bool Scenario::_calculateTiles() const { continue; for (BoostPolygon t : boost_tiles) { - if (bg::area(t) > _minTileArea.value()) { + if (bg::area(t) > minTileArea.value()) { // Transform boost_tile to world coordinate system. BoostPolygon rotated_tile; BoostPolygon translated_tile; @@ -552,18 +463,15 @@ bool Scenario::_calculateTiles() const { translate_back); // Store tile and calculate center point. - _tiles.push_back(translated_tile); - BoostPoint tile_center; - polygonCenter(translated_tile, tile_center); - _tileCenterPoints.push_back(tile_center); + tiles.push_back(translated_tile); } } } } - if (_tiles.size() < 1) { + if (tiles.size() < 1) { std::stringstream ss; - ss << "No tiles calculated. Is the minTileArea (" << _minTileArea + ss << "No tiles calculated. Is the minTileArea (" << minTileArea << ") parameter large enough?"; errorString = ss.str(); return false; @@ -572,19 +480,20 @@ bool Scenario::_calculateTiles() const { return true; } -bool Scenario::_calculateJoinedArea() const { - _jArea.clear(); +bool joinedArea(const BoostPolygon &mArea, const BoostPolygon &sArea, + const BoostPolygon &corridor, BoostPolygon &jArea, + std::string &errorString) { // Measurement area and service area overlapping? - bool overlapingSerMeas = bg::intersects(_mArea, _sArea) ? true : false; - bool corridorValid = _corridor.outer().size() > 0 ? true : false; + bool overlapingSerMeas = bg::intersects(mArea, sArea) ? true : false; + bool corridorValid = corridor.outer().size() > 0 ? true : false; // Check if corridor is connecting measurement area and service area. bool corridor_is_connection = false; if (corridorValid) { // Corridor overlaping with measurement area? - if (bg::intersects(_corridor, _mArea)) { + if (bg::intersects(corridor, mArea)) { // Corridor overlaping with service area? - if (bg::intersects(_corridor, _sArea)) { + if (bg::intersects(corridor, sArea)) { corridor_is_connection = true; } } @@ -592,13 +501,13 @@ bool Scenario::_calculateJoinedArea() const { // Are areas joinable? std::deque sol; - BoostPolygon partialArea = _mArea; + BoostPolygon partialArea = mArea; if (overlapingSerMeas) { if (corridor_is_connection) { - bg::union_(partialArea, _corridor, sol); + bg::union_(partialArea, corridor, sol); } } else if (corridor_is_connection) { - bg::union_(partialArea, _corridor, sol); + bg::union_(partialArea, corridor, sol); } else { std::stringstream ss; auto printPoint = [&ss](const BoostPoint &p) { @@ -606,13 +515,13 @@ bool Scenario::_calculateJoinedArea() const { }; ss << "Areas are not overlapping." << std::endl; ss << "Measurement area:"; - bg::for_each_point(_mArea, printPoint); + bg::for_each_point(mArea, printPoint); ss << std::endl; ss << "Service area:"; - bg::for_each_point(_sArea, printPoint); + bg::for_each_point(sArea, printPoint); ss << std::endl; ss << "Corridor:"; - bg::for_each_point(_corridor, printPoint); + bg::for_each_point(corridor, printPoint); ss << std::endl; errorString = ss.str(); return false; @@ -624,62 +533,46 @@ bool Scenario::_calculateJoinedArea() const { } // Join areas. - bg::union_(partialArea, _sArea, sol); + bg::union_(partialArea, sArea, sol); if (sol.size() > 0) { - _jArea = sol[0]; + jArea = sol[0]; } else { + std::stringstream ss; + auto printPoint = [&ss](const BoostPoint &p) { + ss << " (" << p.get<0>() << ", " << p.get<1>() << ")"; + }; + ss << "Areas not joinable." << std::endl; + ss << "Measurement area:"; + bg::for_each_point(mArea, printPoint); + ss << std::endl; + ss << "Service area:"; + bg::for_each_point(sArea, printPoint); + ss << std::endl; + ss << "Corridor:"; + bg::for_each_point(corridor, printPoint); + ss << std::endl; + errorString = ss.str(); return false; } return true; } -Area Scenario::minTileArea() const { return _minTileArea; } - -void Scenario::setMinTileArea(Area minTileArea) { - if (minTileArea >= 0 * bu::si::meter * bu::si::meter) { - _needsUpdate = true; - _minTileArea = minTileArea; - } -} - -Length Scenario::tileHeight() const { return _tileHeight; } - -void Scenario::setTileHeight(Length tileHeight) { - if (tileHeight > 0 * bu::si::meter) { - _needsUpdate = true; - _tileHeight = tileHeight; - } -} - -Length Scenario::tileWidth() const { return _tileWidth; } - -void Scenario::setTileWidth(Length tileWidth) { - if (tileWidth > 0 * bu::si::meter) { - _needsUpdate = true; - _tileWidth = tileWidth; - } -} - -//========================================================================= -// Tile calculation. -//========================================================================= - -bool joinAreas(const std::vector &areas, - BoostPolygon &joinedArea) { +bool joinedArea(const std::vector &areas, + BoostPolygon &joinedArea) { if (areas.size() < 1) return false; + joinedArea = *areas[0]; std::deque idxList; for (size_t i = 1; i < areas.size(); ++i) idxList.push_back(i); - joinedArea = areas[0]; std::deque sol; while (idxList.size() > 0) { bool success = false; for (auto it = idxList.begin(); it != idxList.end(); ++it) { - bg::union_(joinedArea, areas[*it], sol); + bg::union_(joinedArea, *areas[*it], sol); if (sol.size() > 0) { joinedArea = sol[0]; sol.clear(); @@ -704,13 +597,12 @@ void BoundingBox::clear() { corners.clear(); } -bool flight_plan::transectsFromScenario(Length distance, Length minLength, - Angle angle, const Scenario &scenario, - const Progress &p, - flight_plan::Transects &t, - string &errorString) { +bool transectsFromScenario(Length distance, Length minLength, Angle angle, + const BoostPolygon &mArea, + const std::vector &tiles, + const Progress &p, Transects &t, + string &errorString) { // Rotate measurement area by angle and calculate bounding box. - auto &mArea = scenario.measurementArea(); BoostPolygon mAreaRotated; trans::rotate_transformer rotate(angle.value() * 180 / M_PI); @@ -778,14 +670,13 @@ bool flight_plan::transectsFromScenario(Length distance, Length minLength, ClipperLib::pftNonZero, ClipperLib::pftNonZero); const auto *transects = &clippedTransecs; - bool ignoreProgress = p.size() != scenario.tiles().size(); + bool ignoreProgress = p.size() != tiles.size(); ClipperLib::PolyTree clippedTransecs2; if (!ignoreProgress) { // Calculate processed tiles (_progress[i] == 100) and subtract them from // measurement area. size_t numTiles = p.size(); vector processedTiles; - const auto &tiles = scenario.tiles(); for (size_t i = 0; i < numTiles; ++i) { if (p[i] == 100) { processedTiles.push_back(tiles[i]); @@ -889,10 +780,8 @@ void generateRoutingModel(const BoostLineString &vertices, dataModel.depot = 0; } -bool flight_plan::route(const BoostPolygon &area, - const flight_plan::Transects &transects, - Transects &transectsRouted, flight_plan::Route &route, - string &errorString) { +bool route(const BoostPolygon &area, const Transects &transects, + Transects &transectsRouted, Route &route, string &errorString) { //======================================= // Route Transects using Google or-tools. //======================================= diff --git a/src/Wima/Snake/snake.h b/src/Wima/Snake/snake.h index 26d900c92..f8581c7ca 100644 --- a/src/Wima/Snake/snake.h +++ b/src/Wima/Snake/snake.h @@ -103,6 +103,7 @@ void toENU(const GeoPoint &origin, const GeoPoint &in, BoostPoint &out) { out.set<1>(y); (void)z; } + template void fromENU(const GeoPoint &origin, const BoostPoint &in, GeoPoint &out) { GeographicLib::Geocentric earth(GeographicLib::Constants::WGS84_a(), @@ -117,88 +118,6 @@ void fromENU(const GeoPoint &origin, const BoostPoint &in, GeoPoint &out) { out.setAltitude(alt); } -void polygonCenter(const BoostPolygon &polygon, BoostPoint ¢er); -bool minimalBoundingBox(const BoostPolygon &polygon, BoundingBox &minBBox); -void offsetPolygon(const BoostPolygon &polygon, BoostPolygon &polygonOffset, - double offset); - -void graphFromPolygon(const BoostPolygon &polygon, - const BoostLineString &vertices, Matrix &graph); -void toDistanceMatrix(Matrix &graph); -bool dijkstraAlgorithm( - const size_t numElements, size_t startIndex, size_t endIndex, - std::vector &elementPath, - std::function distanceDij); -void shortestPathFromGraph(const Matrix &graph, size_t startIndex, - size_t endIndex, std::vector &pathIdx); - -//========================================================================= -// Scenario. -//========================================================================= - -typedef bu::quantity Length; -typedef bu::quantity Area; -typedef bu::quantity Angle; - -class Scenario { -public: - Scenario(); - - void setMeasurementArea(const BoostPolygon &area); - void setServiceArea(const BoostPolygon &area); - void setCorridor(const BoostPolygon &area); - - const BoundingBox &mAreaBoundingBox() const; - - const BoostPolygon &measurementArea() const; - const BoostPolygon &serviceArea() const; - const BoostPolygon &corridor() const; - - BoostPolygon &measurementArea(); - BoostPolygon &serviceArea(); - BoostPolygon &corridor(); - - Length tileWidth() const; - void setTileWidth(Length tileWidth); - - Length tileHeight() const; - void setTileHeight(Length tileHeight); - - Area minTileArea() const; - void setMinTileArea(Area minTileArea); - - const BoostPolygon &joinedArea() const; - const vector &tiles() const; - const BoostLineString &tileCenterPoints() const; - const BoundingBox &measurementAreaBBox() const; - const BoostPoint &homePositon() const; - - bool update(); - - mutable string errorString; - -private: - bool _calculateBoundingBox() const; - bool _calculateTiles() const; - bool _calculateJoinedArea() const; - - Length _tileWidth; - Length _tileHeight; - Area _minTileArea; - - mutable bool _needsUpdate; - - BoostPolygon _mArea; - BoostPolygon _sArea; - BoostPolygon _corridor; - mutable BoostPolygon _jArea; - - mutable BoundingBox _mAreaBoundingBox; - mutable vector _tiles; - mutable BoostLineString _tileCenterPoints; - mutable BoostPoint _homePosition; -}; - template class Container> void areaToEnu(const GeoPoint &origin, const Container &in, BoostPolygon &out) { @@ -220,25 +139,43 @@ void areaFromEnu(const GeoPoint &origin, BoostPolygon &in, } } -bool joinAreas(const std::vector &areas, - BoostPolygon &joinedArea); +void polygonCenter(const BoostPolygon &polygon, BoostPoint ¢er); +bool minimalBoundingBox(const BoostPolygon &polygon, BoundingBox &minBBox); +void offsetPolygon(const BoostPolygon &polygon, BoostPolygon &polygonOffset, + double offset); +void graphFromPolygon(const BoostPolygon &polygon, + const BoostLineString &vertices, Matrix &graph); +void toDistanceMatrix(Matrix &graph); +bool dijkstraAlgorithm( + const size_t numElements, size_t startIndex, size_t endIndex, + std::vector &elementPath, + std::function distanceDij); +void shortestPathFromGraph(const Matrix &graph, size_t startIndex, + size_t endIndex, std::vector &pathIdx); -//======================================================================================== -// flight_plan -//======================================================================================== +typedef bu::quantity Length; +typedef bu::quantity Area; +typedef bu::quantity Angle; -namespace flight_plan { +bool joinedArea(const std::vector &areas, BoostPolygon &jArea); +bool joinedArea(const BoostPolygon &mArea, const BoostPolygon &sArea, + const BoostPolygon &corridor, BoostPolygon &jArea, + std::string &errorString); +bool tiles(const BoostPolygon &area, Length tileHeight, Length tileWidth, + Area minTileArea, std::vector &tiles, + BoundingBox &bbox, std::string &errorString); using Transects = vector; using Progress = vector; using Route = vector; bool transectsFromScenario(Length distance, Length minLength, Angle angle, - const Scenario &scenario, const Progress &p, - Transects &t, string &errorString); + const BoostPolygon &mArea, + const std::vector &tiles, + const Progress &p, Transects &t, + string &errorString); bool route(const BoostPolygon &area, const Transects &transects, Transects &transectsRouted, Route &route, string &errorString); -} // namespace flight_plan namespace detail { const double offsetConstant = diff --git a/src/WimaView/WimaMeasurementAreaEditor.qml b/src/WimaView/WimaMeasurementAreaEditor.qml index e47dce3fc..0eb4acd5e 100644 --- a/src/WimaView/WimaMeasurementAreaEditor.qml +++ b/src/WimaView/WimaMeasurementAreaEditor.qml @@ -43,7 +43,7 @@ Rectangle { SectionHeader { id: settingsHeader - text: qsTr("Settings") + text: qsTr("General") } Column { @@ -79,12 +79,18 @@ Rectangle { } } // Column - Settings + SectionHeader { - id: snakeHeader - text: qsTr("Snake") + id: tilesHeader + text: qsTr("Tiles") } Column { + anchors.left: parent.left + anchors.right: parent.right + spacing: _margin + visible: tilesHeader.checked + GridLayout { anchors.left: parent.left anchors.right: parent.right @@ -92,44 +98,69 @@ Rectangle { rowSpacing: _margin columns: 2 - QGCLabel { text: qsTr("Tile Height") } + QGCLabel { text: qsTr("Height") } FactTextField { - //fact: areaItem.borderPolygonOffset + fact: areaItem.tileHeight Layout.fillWidth: true } - QGCLabel { text: qsTr("Tile Width") } + QGCLabel { text: qsTr("Width") } FactTextField { - //fact: areaItem.borderPolygonOffset + fact: areaItem.tileWidth Layout.fillWidth: true } - QGCLabel { text: qsTr("Min. Tile Area") } + QGCLabel { text: qsTr("Min. Area") } FactTextField { - //fact: areaItem.borderPolygonOffset + fact: areaItem.minTileArea Layout.fillWidth: true } - QGCLabel { text: qsTr("Transect Distance") } + FactCheckBox { + text: qsTr("Show Tiles") + fact: areaItem.showTiles + } + } // Tile GridLayout + } // Tile Column + + + SectionHeader { + id: transectsHeader + text: qsTr("Transects") + } + + Column { + anchors.left: parent.left + anchors.right: parent.right + spacing: _margin + visible: transectsHeader.checked + + GridLayout { + anchors.left: parent.left + anchors.right: parent.right + columnSpacing: _margin + rowSpacing: _margin + columns: 2 + + QGCLabel { text: qsTr("Distance") } FactTextField { - //fact: areaItem.borderPolygonOffset + fact: areaItem.transectDistance Layout.fillWidth: true } - QGCLabel { text: qsTr("Min. Transect Length") } + QGCLabel { text: qsTr("Min. Length") } FactTextField { - //fact: areaItem.borderPolygonOffset + fact: areaItem.minTransectLength Layout.fillWidth: true } - } - + } // Transects GridLayout + } // Transects Column - } // Snake SectionHeader { id: statsHeader -- 2.22.0