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