BERATools 0.2.0__py3-none-any.whl → 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- beratools/__init__.py +1 -7
- beratools/core/algo_centerline.py +491 -351
- beratools/core/algo_common.py +497 -0
- beratools/core/algo_cost.py +192 -0
- beratools/core/{dijkstra_algorithm.py → algo_dijkstra.py} +503 -460
- beratools/core/algo_footprint_rel.py +577 -0
- beratools/core/algo_line_grouping.py +944 -0
- beratools/core/algo_merge_lines.py +214 -0
- beratools/core/algo_split_with_lines.py +304 -0
- beratools/core/algo_tiler.py +428 -0
- beratools/core/algo_vertex_optimization.py +469 -0
- beratools/core/constants.py +52 -86
- beratools/core/logger.py +76 -85
- beratools/core/tool_base.py +196 -133
- beratools/gui/__init__.py +11 -15
- beratools/gui/{beratools.json → assets/beratools.json} +2185 -2300
- beratools/gui/batch_processing_dlg.py +513 -463
- beratools/gui/bt_data.py +481 -487
- beratools/gui/bt_gui_main.py +710 -691
- beratools/gui/main.py +26 -0
- beratools/gui/map_window.py +162 -146
- beratools/gui/tool_widgets.py +725 -493
- beratools/tools/Beratools_r_script.r +1120 -1120
- beratools/tools/Ht_metrics.py +116 -116
- beratools/tools/__init__.py +7 -7
- beratools/tools/batch_processing.py +136 -132
- beratools/tools/canopy_threshold_relative.py +672 -670
- beratools/tools/canopycostraster.py +222 -222
- beratools/tools/centerline.py +136 -176
- beratools/tools/common.py +857 -885
- beratools/tools/fl_regen_csf.py +428 -428
- beratools/tools/forest_line_attributes.py +408 -408
- beratools/tools/line_footprint_absolute.py +213 -363
- beratools/tools/line_footprint_fixed.py +436 -282
- beratools/tools/line_footprint_functions.py +733 -720
- beratools/tools/line_footprint_relative.py +73 -64
- beratools/tools/line_grouping.py +45 -0
- beratools/tools/ln_relative_metrics.py +615 -615
- beratools/tools/r_cal_lpi_elai.r +24 -24
- beratools/tools/r_generate_pd_focalraster.r +100 -100
- beratools/tools/r_interface.py +79 -79
- beratools/tools/r_point_density.r +8 -8
- beratools/tools/rpy_chm2trees.py +86 -86
- beratools/tools/rpy_dsm_chm_by.py +81 -81
- beratools/tools/rpy_dtm_by.py +63 -63
- beratools/tools/rpy_find_cellsize.py +43 -43
- beratools/tools/rpy_gnd_csf.py +74 -74
- beratools/tools/rpy_hummock_hollow.py +85 -85
- beratools/tools/rpy_hummock_hollow_raster.py +71 -71
- beratools/tools/rpy_las_info.py +51 -51
- beratools/tools/rpy_laz2las.py +40 -40
- beratools/tools/rpy_lpi_elai_lascat.py +466 -466
- beratools/tools/rpy_normalized_lidar_by.py +56 -56
- beratools/tools/rpy_percent_above_dbh.py +80 -80
- beratools/tools/rpy_points2trees.py +88 -88
- beratools/tools/rpy_vegcoverage.py +94 -94
- beratools/tools/tiler.py +48 -206
- beratools/tools/tool_template.py +69 -54
- beratools/tools/vertex_optimization.py +61 -620
- beratools/tools/zonal_threshold.py +144 -144
- beratools-0.2.1.dist-info/METADATA +109 -0
- beratools-0.2.1.dist-info/RECORD +74 -0
- {beratools-0.2.0.dist-info → beratools-0.2.1.dist-info}/WHEEL +1 -1
- {beratools-0.2.0.dist-info → beratools-0.2.1.dist-info}/licenses/LICENSE +22 -22
- beratools/gui/cli.py +0 -18
- beratools/gui/gui.json +0 -8
- beratools/gui_tk/ASCII Banners.txt +0 -248
- beratools/gui_tk/__init__.py +0 -20
- beratools/gui_tk/beratools_main.py +0 -515
- beratools/gui_tk/bt_widgets.py +0 -442
- beratools/gui_tk/cli.py +0 -18
- beratools/gui_tk/img/BERALogo.png +0 -0
- beratools/gui_tk/img/closed.gif +0 -0
- beratools/gui_tk/img/closed.png +0 -0
- beratools/gui_tk/img/open.gif +0 -0
- beratools/gui_tk/img/open.png +0 -0
- beratools/gui_tk/img/tool.gif +0 -0
- beratools/gui_tk/img/tool.png +0 -0
- beratools/gui_tk/main.py +0 -14
- beratools/gui_tk/map_window.py +0 -144
- beratools/gui_tk/runner.py +0 -1481
- beratools/gui_tk/tooltip.py +0 -55
- beratools/third_party/pyqtlet2/__init__.py +0 -9
- beratools/third_party/pyqtlet2/leaflet/__init__.py +0 -26
- beratools/third_party/pyqtlet2/leaflet/control/__init__.py +0 -6
- beratools/third_party/pyqtlet2/leaflet/control/control.py +0 -59
- beratools/third_party/pyqtlet2/leaflet/control/draw.py +0 -52
- beratools/third_party/pyqtlet2/leaflet/control/layers.py +0 -20
- beratools/third_party/pyqtlet2/leaflet/core/Parser.py +0 -24
- beratools/third_party/pyqtlet2/leaflet/core/__init__.py +0 -2
- beratools/third_party/pyqtlet2/leaflet/core/evented.py +0 -180
- beratools/third_party/pyqtlet2/leaflet/layer/__init__.py +0 -5
- beratools/third_party/pyqtlet2/leaflet/layer/featuregroup.py +0 -34
- beratools/third_party/pyqtlet2/leaflet/layer/icon/__init__.py +0 -1
- beratools/third_party/pyqtlet2/leaflet/layer/icon/icon.py +0 -30
- beratools/third_party/pyqtlet2/leaflet/layer/imageoverlay.py +0 -18
- beratools/third_party/pyqtlet2/leaflet/layer/layer.py +0 -105
- beratools/third_party/pyqtlet2/leaflet/layer/layergroup.py +0 -45
- beratools/third_party/pyqtlet2/leaflet/layer/marker/__init__.py +0 -1
- beratools/third_party/pyqtlet2/leaflet/layer/marker/marker.py +0 -91
- beratools/third_party/pyqtlet2/leaflet/layer/tile/__init__.py +0 -2
- beratools/third_party/pyqtlet2/leaflet/layer/tile/gridlayer.py +0 -4
- beratools/third_party/pyqtlet2/leaflet/layer/tile/tilelayer.py +0 -16
- beratools/third_party/pyqtlet2/leaflet/layer/vector/__init__.py +0 -5
- beratools/third_party/pyqtlet2/leaflet/layer/vector/circle.py +0 -15
- beratools/third_party/pyqtlet2/leaflet/layer/vector/circlemarker.py +0 -18
- beratools/third_party/pyqtlet2/leaflet/layer/vector/path.py +0 -5
- beratools/third_party/pyqtlet2/leaflet/layer/vector/polygon.py +0 -14
- beratools/third_party/pyqtlet2/leaflet/layer/vector/polyline.py +0 -18
- beratools/third_party/pyqtlet2/leaflet/layer/vector/rectangle.py +0 -14
- beratools/third_party/pyqtlet2/leaflet/map/__init__.py +0 -1
- beratools/third_party/pyqtlet2/leaflet/map/map.py +0 -220
- beratools/third_party/pyqtlet2/mapwidget.py +0 -45
- beratools/third_party/pyqtlet2/web/custom.js +0 -43
- beratools/third_party/pyqtlet2/web/map.html +0 -23
- beratools/third_party/pyqtlet2/web/modules/leaflet_193/images/layers-2x.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_193/images/layers.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_193/images/marker-icon-2x.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_193/images/marker-icon.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_193/images/marker-shadow.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_193/leaflet.css +0 -656
- beratools/third_party/pyqtlet2/web/modules/leaflet_193/leaflet.js +0 -6
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/.codeclimate.yml +0 -14
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/.editorconfig +0 -4
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/.gitattributes +0 -22
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/.travis.yml +0 -43
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/LICENSE +0 -20
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/layers-2x.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/layers.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/marker-icon-2x.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/marker-icon.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/marker-shadow.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/spritesheet-2x.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/spritesheet.png +0 -0
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/images/spritesheet.svg +0 -156
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/leaflet.draw.css +0 -10
- beratools/third_party/pyqtlet2/web/modules/leaflet_draw_414/leaflet.draw.js +0 -10
- beratools/third_party/pyqtlet2/web/modules/leaflet_rotatedMarker_020/LICENSE +0 -22
- beratools/third_party/pyqtlet2/web/modules/leaflet_rotatedMarker_020/leaflet.rotatedMarker.js +0 -57
- beratools/tools/forest_line_ecosite.py +0 -216
- beratools/tools/lapis_all.py +0 -103
- beratools/tools/least_cost_path_from_chm.py +0 -152
- beratools-0.2.0.dist-info/METADATA +0 -63
- beratools-0.2.0.dist-info/RECORD +0 -142
- /beratools/gui/{img → assets}/BERALogo.png +0 -0
- /beratools/gui/{img → assets}/closed.gif +0 -0
- /beratools/gui/{img → assets}/closed.png +0 -0
- /beratools/{gui_tk → gui/assets}/gui.json +0 -0
- /beratools/gui/{img → assets}/open.gif +0 -0
- /beratools/gui/{img → assets}/open.png +0 -0
- /beratools/gui/{img → assets}/tool.gif +0 -0
- /beratools/gui/{img → assets}/tool.png +0 -0
- {beratools-0.2.0.dist-info → beratools-0.2.1.dist-info}/entry_points.txt +0 -0
beratools/gui/main.py
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Copyright (C) 2025 Applied Geospatial Research Group.
|
|
3
|
+
|
|
4
|
+
This script is licensed under the GNU General Public License v3.0.
|
|
5
|
+
See <https://gnu.org/licenses/gpl-3.0> for full license details.
|
|
6
|
+
|
|
7
|
+
Author: Richard Zeng
|
|
8
|
+
|
|
9
|
+
Description:
|
|
10
|
+
This script is part of the BERA Tools.
|
|
11
|
+
Webpage: https://github.com/appliedgrg/beratools
|
|
12
|
+
|
|
13
|
+
Main entry point of BERA Tools.
|
|
14
|
+
"""
|
|
15
|
+
import sys
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
|
|
18
|
+
if __name__ == "__main__":
|
|
19
|
+
current_file = Path(__file__).resolve()
|
|
20
|
+
btool_dir = current_file.parents[2]
|
|
21
|
+
sys.path.insert(0, btool_dir.as_posix())
|
|
22
|
+
|
|
23
|
+
from beratools.gui.bt_gui_main import runner
|
|
24
|
+
|
|
25
|
+
if __name__ == "__main__":
|
|
26
|
+
runner()
|
beratools/gui/map_window.py
CHANGED
|
@@ -1,146 +1,162 @@
|
|
|
1
|
-
import os
|
|
2
|
-
import sys
|
|
3
|
-
|
|
4
|
-
os.environ[
|
|
5
|
-
from
|
|
6
|
-
|
|
7
|
-
from qtpy.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
self.
|
|
25
|
-
self.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
self.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
self.ok_btn_box
|
|
32
|
-
self.ok_btn_box.
|
|
33
|
-
self.ok_btn_box.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
self.
|
|
37
|
-
self.
|
|
38
|
-
self.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
self.
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
map_layout
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
self.
|
|
59
|
-
self.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
self.map
|
|
71
|
-
|
|
72
|
-
#
|
|
73
|
-
# self.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def
|
|
77
|
-
style = {
|
|
78
|
-
|
|
79
|
-
self.map.addLayer(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
self.map =
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
self.
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
self.map.
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
self.
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
|
|
4
|
+
os.environ["QT_API"] = "pyqt5"
|
|
5
|
+
from pyqtlet2 import L, MapWidget
|
|
6
|
+
from qtpy.QtCore import Qt, Signal
|
|
7
|
+
from qtpy.QtWidgets import (
|
|
8
|
+
QApplication,
|
|
9
|
+
QDialog,
|
|
10
|
+
QDialogButtonBox,
|
|
11
|
+
QGroupBox,
|
|
12
|
+
QHBoxLayout,
|
|
13
|
+
QTreeWidget,
|
|
14
|
+
QTreeWidgetItem,
|
|
15
|
+
QVBoxLayout,
|
|
16
|
+
QWidget,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class MapWindow(QDialog):
|
|
21
|
+
def __init__(self, parent=None):
|
|
22
|
+
# Setting up the widgets and layout
|
|
23
|
+
super(MapWindow, self).__init__(parent)
|
|
24
|
+
self.setWindowTitle("Tiler map")
|
|
25
|
+
self.setGeometry(0, 0, 1200, 800)
|
|
26
|
+
|
|
27
|
+
# delete dialog when close
|
|
28
|
+
self.setAttribute(Qt.WA_DeleteOnClose)
|
|
29
|
+
|
|
30
|
+
# Add OK/cancel buttons
|
|
31
|
+
self.ok_btn_box = QDialogButtonBox(Qt.Vertical)
|
|
32
|
+
self.ok_btn_box.addButton("Run Tiler", QDialogButtonBox.AcceptRole)
|
|
33
|
+
self.ok_btn_box.addButton("Cancel", QDialogButtonBox.RejectRole)
|
|
34
|
+
self.ok_btn_box.addButton("Help", QDialogButtonBox.HelpRole)
|
|
35
|
+
|
|
36
|
+
self.ok_btn_box.buttons()[0].setFixedSize(120, 40)
|
|
37
|
+
self.ok_btn_box.buttons()[1].setFixedSize(120, 40)
|
|
38
|
+
self.ok_btn_box.buttons()[2].setFixedSize(120, 40)
|
|
39
|
+
|
|
40
|
+
self.ok_btn_box.accepted.connect(self.run)
|
|
41
|
+
self.ok_btn_box.rejected.connect(self.cancel)
|
|
42
|
+
self.ok_btn_box.helpRequested.connect(self.help)
|
|
43
|
+
|
|
44
|
+
self.info_layout = QVBoxLayout() # layout reserved for tiles info widgets
|
|
45
|
+
self.vbox_group = QVBoxLayout()
|
|
46
|
+
self.vbox_group.addLayout(self.info_layout)
|
|
47
|
+
self.vbox_group.addStretch()
|
|
48
|
+
self.vbox_group.addWidget(self.ok_btn_box, alignment=Qt.AlignCenter)
|
|
49
|
+
|
|
50
|
+
groupbox_info = QGroupBox("Tiles")
|
|
51
|
+
groupbox_info.setLayout(self.vbox_group)
|
|
52
|
+
|
|
53
|
+
central_widget = QWidget()
|
|
54
|
+
map_layout = QHBoxLayout(central_widget)
|
|
55
|
+
map_layout.addWidget(groupbox_info)
|
|
56
|
+
|
|
57
|
+
groupbox_map = QGroupBox("Map")
|
|
58
|
+
self.map_widget = MapWidget()
|
|
59
|
+
self.map_widget.setContentsMargins(10, 10, 10, 10)
|
|
60
|
+
self.vbox_map = QVBoxLayout()
|
|
61
|
+
self.vbox_map.addWidget(self.map_widget)
|
|
62
|
+
groupbox_map.setLayout(self.vbox_map)
|
|
63
|
+
map_layout.addWidget(groupbox_map, 10)
|
|
64
|
+
self.setLayout(map_layout)
|
|
65
|
+
|
|
66
|
+
# Working with the maps with pyqtlet
|
|
67
|
+
self.map = L.map(self.map_widget)
|
|
68
|
+
self.map.setView([0, 0], 10) # this is necessary
|
|
69
|
+
|
|
70
|
+
L.tileLayer("http://{s}.tile.osm.org/{z}/{x}/{y}.png").addTo(self.map)
|
|
71
|
+
|
|
72
|
+
# add marker layer
|
|
73
|
+
# self.add_marker_layer()
|
|
74
|
+
self.show()
|
|
75
|
+
|
|
76
|
+
def add_polygons_to_map(self, layer_name, polygons, color):
|
|
77
|
+
style = {"fillOpacity": 0.1, "color": color}
|
|
78
|
+
vars()[layer_name] = L.polygon(polygons, style)
|
|
79
|
+
self.map.addLayer(vars()[layer_name])
|
|
80
|
+
|
|
81
|
+
# this works too. addLayer has to be called first
|
|
82
|
+
# self.map.runJavaScript("var stylePoly = {fillColor:'red',color: 'blue',weight:2,fillOpacity:0.8};", 0)
|
|
83
|
+
# self.map.runJavaScript(f'{self.multipolygon.jsName}.setStyle(stylePoly);', 0)
|
|
84
|
+
|
|
85
|
+
def add_polylines_to_map(self, polylines, color):
|
|
86
|
+
style = {"color": color}
|
|
87
|
+
lines = L.polyline(polylines, style)
|
|
88
|
+
self.map.addLayer(lines)
|
|
89
|
+
|
|
90
|
+
def set_view(self, point, zoom):
|
|
91
|
+
self.map = self.map.setView(point, zoom)
|
|
92
|
+
|
|
93
|
+
# bounds is a pair of corner points, LL and UR
|
|
94
|
+
def fit_bounds(self, bounds):
|
|
95
|
+
# self.map.fitBounds(bounds)
|
|
96
|
+
self.map.runJavaScript(f"{self.map.jsName}.fitBounds(bounds);", 0)
|
|
97
|
+
|
|
98
|
+
def add_marker_layer(self):
|
|
99
|
+
self.marker = L.marker([12.934056, -77.610029])
|
|
100
|
+
self.marker.bindPopup("Maps are a treasure.")
|
|
101
|
+
self.map.addLayer(self.marker)
|
|
102
|
+
|
|
103
|
+
# Create a icon called markerIcon in the js runtime.
|
|
104
|
+
self.map.runJavaScript(
|
|
105
|
+
"var markerIcon "
|
|
106
|
+
'= L.icon({iconUrl: "https://leafletjs.com/examples/custom-icons/leaf-red.png"});',
|
|
107
|
+
0,
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
# Edit the existing python object by accessing it's jsName property
|
|
111
|
+
self.map.runJavaScript(f"{self.marker.jsName}.setIcon(markerIcon);", 0)
|
|
112
|
+
|
|
113
|
+
def accept(self):
|
|
114
|
+
print("Run the tiling.")
|
|
115
|
+
QDialog.accept(self)
|
|
116
|
+
|
|
117
|
+
def run(self):
|
|
118
|
+
self.accept()
|
|
119
|
+
|
|
120
|
+
def cancel(self):
|
|
121
|
+
print("Tiling canceled.")
|
|
122
|
+
self.reject()
|
|
123
|
+
|
|
124
|
+
def help(self):
|
|
125
|
+
print("Help requested.")
|
|
126
|
+
|
|
127
|
+
def set_tiles_info(self, tiles_info):
|
|
128
|
+
tree = QTreeWidget()
|
|
129
|
+
tree.setColumnCount(2)
|
|
130
|
+
tree.setHeaderLabels(["Item", "Value"])
|
|
131
|
+
item = QTreeWidgetItem(["Tiles"])
|
|
132
|
+
for key, value in tiles_info.items():
|
|
133
|
+
child = QTreeWidgetItem([key, str(value)])
|
|
134
|
+
item.addChild(child)
|
|
135
|
+
|
|
136
|
+
tree.insertTopLevelItem(0, item)
|
|
137
|
+
tree.expandAll()
|
|
138
|
+
|
|
139
|
+
# add to group widget
|
|
140
|
+
self.vbox_group.insertWidget(0, tree)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
if __name__ == "__main__":
|
|
144
|
+
# supress web engine logging
|
|
145
|
+
os.environ["QTWEBENGINE_CHROMIUM_FLAGS"] = "--enable-logging --log-level=3"
|
|
146
|
+
|
|
147
|
+
app = QApplication(sys.argv)
|
|
148
|
+
widget = MapWindow()
|
|
149
|
+
|
|
150
|
+
# add polygons to map
|
|
151
|
+
polygon_coords_base = [
|
|
152
|
+
[[17.285044, 78.286671], [16.606174, 80.748015], [17.886816, 83.518482]]
|
|
153
|
+
]
|
|
154
|
+
widget.add_polygons_to_map(polygon_coords_base, "blue")
|
|
155
|
+
|
|
156
|
+
polygon_coords = [
|
|
157
|
+
[[17.385044, 78.486671], [16.506174, 80.648015], [17.686816, 83.218482]],
|
|
158
|
+
[[13.082680, 80.270718], [12.971599, 77.594563], [15.828126, 78.037279]],
|
|
159
|
+
]
|
|
160
|
+
widget.add_polygons_to_map(polygon_coords, "red")
|
|
161
|
+
|
|
162
|
+
sys.exit(app.exec_())
|