maps4fs 1.6.91__py3-none-any.whl → 1.7.5__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.
Potentially problematic release.
This version of maps4fs might be problematic. Click here for more details.
- maps4fs/__init__.py +4 -2
- maps4fs/generator/component.py +6 -15
- maps4fs/generator/dtm/dtm.py +276 -48
- maps4fs/generator/dtm/nrw.py +127 -0
- maps4fs/generator/dtm/srtm.py +59 -161
- maps4fs/generator/dtm/usgs.py +6 -222
- maps4fs/generator/settings.py +1 -1
- maps4fs/generator/texture.py +51 -49
- maps4fs/toolbox/custom_osm.py +67 -0
- {maps4fs-1.6.91.dist-info → maps4fs-1.7.5.dist-info}/METADATA +64 -29
- {maps4fs-1.6.91.dist-info → maps4fs-1.7.5.dist-info}/RECORD +14 -12
- {maps4fs-1.6.91.dist-info → maps4fs-1.7.5.dist-info}/WHEEL +1 -1
- {maps4fs-1.6.91.dist-info → maps4fs-1.7.5.dist-info}/LICENSE.md +0 -0
- {maps4fs-1.6.91.dist-info → maps4fs-1.7.5.dist-info}/top_level.txt +0 -0
maps4fs/generator/texture.py
CHANGED
@@ -336,19 +336,12 @@ class Texture(Component):
|
|
336
336
|
# pylint: disable=W0201
|
337
337
|
def _read_parameters(self) -> None:
|
338
338
|
"""Reads map parameters from OSM data, such as:
|
339
|
-
- minimum and maximum coordinates
|
339
|
+
- minimum and maximum coordinates
|
340
340
|
- map dimensions in meters
|
341
341
|
- map coefficients (meters per pixel)
|
342
342
|
"""
|
343
|
-
|
344
|
-
|
345
|
-
# Parameters of the map in UTM format (meters).
|
346
|
-
self.minimum_x = min(west, east)
|
347
|
-
self.minimum_y = min(south, north)
|
348
|
-
self.maximum_x = max(west, east)
|
349
|
-
self.maximum_y = max(south, north)
|
350
|
-
self.logger.debug("Map minimum coordinates (XxY): %s x %s.", self.minimum_x, self.minimum_y)
|
351
|
-
self.logger.debug("Map maximum coordinates (XxY): %s x %s.", self.maximum_x, self.maximum_y)
|
343
|
+
bbox = ox.utils_geo.bbox_from_point(self.coordinates, dist=self.map_rotated_size / 2)
|
344
|
+
self.minimum_x, self.minimum_y, self.maximum_x, self.maximum_y = bbox
|
352
345
|
|
353
346
|
def info_sequence(self) -> dict[str, Any]:
|
354
347
|
"""Returns the JSON representation of the generation info for textures."""
|
@@ -428,7 +421,7 @@ class Texture(Component):
|
|
428
421
|
),
|
429
422
|
)
|
430
423
|
|
431
|
-
# pylint: disable=no-member, R0912
|
424
|
+
# pylint: disable=no-member, R0912, R0915
|
432
425
|
def draw(self) -> None:
|
433
426
|
"""Iterates over layers and fills them with polygons from OSM data."""
|
434
427
|
layers = self.layers_by_priority()
|
@@ -468,12 +461,19 @@ class Texture(Component):
|
|
468
461
|
for polygon in self.objects_generator( # type: ignore
|
469
462
|
layer.tags, layer.width, layer.info_layer
|
470
463
|
):
|
464
|
+
if not len(polygon) > 2:
|
465
|
+
self.logger.debug("Skipping polygon with less than 3 points.")
|
466
|
+
continue
|
471
467
|
if layer.info_layer:
|
472
468
|
info_layer_data[layer.info_layer].append(
|
473
469
|
self.np_to_polygon_points(polygon) # type: ignore
|
474
470
|
)
|
475
471
|
if not layer.invisible:
|
476
|
-
|
472
|
+
try:
|
473
|
+
cv2.fillPoly(layer_image, [polygon], color=255) # type: ignore
|
474
|
+
except Exception as e: # pylint: disable=W0718
|
475
|
+
self.logger.warning("Error drawing polygon: %s.", repr(e))
|
476
|
+
continue
|
477
477
|
|
478
478
|
if layer.info_layer == "roads":
|
479
479
|
for linestring in self.objects_generator(
|
@@ -576,29 +576,19 @@ class Texture(Component):
|
|
576
576
|
cv2.imwrite(layer_path, img)
|
577
577
|
self.logger.debug("Base texture %s saved.", layer_path)
|
578
578
|
|
579
|
-
def
|
580
|
-
"""Converts
|
579
|
+
def latlon_to_pixel(self, lat: float, lon: float) -> tuple[int, int]:
|
580
|
+
"""Converts latitude and longitude to pixel coordinates.
|
581
581
|
|
582
582
|
Arguments:
|
583
|
-
|
583
|
+
lat (float): Latitude.
|
584
|
+
lon (float): Longitude.
|
584
585
|
|
585
586
|
Returns:
|
586
|
-
int:
|
587
|
+
tuple[int, int]: Pixel coordinates.
|
587
588
|
"""
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
"""Converts UTM Y coordinate to relative Y coordinate in map image.
|
592
|
-
|
593
|
-
Arguments:
|
594
|
-
y (float): UTM Y coordinate.
|
595
|
-
|
596
|
-
Returns:
|
597
|
-
int: Relative Y coordinate in map image.
|
598
|
-
"""
|
599
|
-
return int(
|
600
|
-
self.map_rotated_size * (1 - (y - self.minimum_y) / (self.maximum_y - self.minimum_y))
|
601
|
-
)
|
589
|
+
x = int((lon - self.minimum_x) / (self.maximum_x - self.minimum_x) * self.map_rotated_size)
|
590
|
+
y = int((lat - self.maximum_y) / (self.minimum_y - self.maximum_y) * self.map_rotated_size)
|
591
|
+
return x, y
|
602
592
|
|
603
593
|
def np_to_polygon_points(self, np_array: np.ndarray) -> list[tuple[int, int]]:
|
604
594
|
"""Converts numpy array of polygon points to list of tuples.
|
@@ -623,11 +613,13 @@ class Texture(Component):
|
|
623
613
|
Returns:
|
624
614
|
np.ndarray: Numpy array of polygon points.
|
625
615
|
"""
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
616
|
+
coords = list(geometry.exterior.coords)
|
617
|
+
pts = np.array(
|
618
|
+
[self.latlon_to_pixel(coord[1], coord[0]) for coord in coords],
|
619
|
+
np.int32,
|
620
|
+
)
|
621
|
+
pts = pts.reshape((-1, 1, 2))
|
622
|
+
return pts
|
631
623
|
|
632
624
|
def _to_polygon(
|
633
625
|
self, obj: pd.core.series.Series, width: int | None
|
@@ -664,9 +656,20 @@ class Texture(Component):
|
|
664
656
|
Returns:
|
665
657
|
shapely.geometry.polygon.Polygon: Polygon geometry.
|
666
658
|
"""
|
667
|
-
polygon = geometry.buffer(width)
|
659
|
+
polygon = geometry.buffer(self.meters_to_degrees(width) if width else 0)
|
668
660
|
return polygon
|
669
661
|
|
662
|
+
def meters_to_degrees(self, meters: int) -> float:
|
663
|
+
"""Converts meters to degrees.
|
664
|
+
|
665
|
+
Arguments:
|
666
|
+
meters (int): Meters.
|
667
|
+
|
668
|
+
Returns:
|
669
|
+
float: Degrees.
|
670
|
+
"""
|
671
|
+
return meters / 111320
|
672
|
+
|
670
673
|
def _skip(
|
671
674
|
self, geometry: shapely.geometry.polygon.Polygon, *args, **kwargs
|
672
675
|
) -> shapely.geometry.polygon.Polygon:
|
@@ -724,46 +727,43 @@ class Texture(Component):
|
|
724
727
|
except Exception as e: # pylint: disable=W0718
|
725
728
|
self.logger.debug("Error fetching objects for tags: %s. Error: %s.", tags, e)
|
726
729
|
return
|
727
|
-
|
728
|
-
self.logger.debug("Fetched %s elements for tags: %s.", len(objects_utm), tags)
|
730
|
+
self.logger.debug("Fetched %s elements for tags: %s.", len(objects), tags)
|
729
731
|
|
730
732
|
method = self.linestrings_generator if yield_linestrings else self.polygons_generator
|
731
733
|
|
732
|
-
yield from method(
|
734
|
+
yield from method(objects, width, is_fieds)
|
733
735
|
|
734
736
|
def linestrings_generator(
|
735
|
-
self,
|
737
|
+
self, objects: pd.core.frame.DataFrame, *args, **kwargs
|
736
738
|
) -> Generator[list[tuple[int, int]], None, None]:
|
737
739
|
"""Generator which yields lists of point coordinates which represent LineStrings from OSM.
|
738
740
|
|
739
741
|
Arguments:
|
740
|
-
|
742
|
+
objects (pd.core.frame.DataFrame): Dataframe with OSM objects.
|
741
743
|
|
742
744
|
Yields:
|
743
745
|
Generator[list[tuple[int, int]], None, None]: List of point coordinates.
|
744
746
|
"""
|
745
|
-
for _, obj in
|
747
|
+
for _, obj in objects.iterrows():
|
746
748
|
geometry = obj["geometry"]
|
747
749
|
if isinstance(geometry, shapely.geometry.linestring.LineString):
|
748
|
-
points = [
|
749
|
-
(self.get_relative_x(x), self.get_relative_y(y)) for x, y in geometry.coords
|
750
|
-
]
|
750
|
+
points = [self.latlon_to_pixel(x, y) for y, x in geometry.coords]
|
751
751
|
yield points
|
752
752
|
|
753
753
|
def polygons_generator(
|
754
|
-
self,
|
754
|
+
self, objects: pd.core.frame.DataFrame, width: int | None, is_fieds: bool
|
755
755
|
) -> Generator[np.ndarray, None, None]:
|
756
756
|
"""Generator which yields numpy arrays of polygons from OSM data.
|
757
757
|
|
758
758
|
Arguments:
|
759
|
-
|
759
|
+
objects (pd.core.frame.DataFrame): Dataframe with OSM objects.
|
760
760
|
width (int | None): Width of the polygon in meters (only for LineString).
|
761
761
|
is_fieds (bool): Flag to determine if the fields should be padded.
|
762
762
|
|
763
763
|
Yields:
|
764
764
|
Generator[np.ndarray, None, None]: Numpy array of polygon points.
|
765
765
|
"""
|
766
|
-
for _, obj in
|
766
|
+
for _, obj in objects.iterrows():
|
767
767
|
try:
|
768
768
|
polygon = self._to_polygon(obj, width)
|
769
769
|
except Exception as e: # pylint: disable=W0703
|
@@ -773,7 +773,9 @@ class Texture(Component):
|
|
773
773
|
continue
|
774
774
|
|
775
775
|
if is_fieds and self.map.texture_settings.fields_padding > 0:
|
776
|
-
padded_polygon = polygon.buffer(
|
776
|
+
padded_polygon = polygon.buffer(
|
777
|
+
-self.meters_to_degrees(self.map.texture_settings.fields_padding)
|
778
|
+
)
|
777
779
|
|
778
780
|
if not isinstance(padded_polygon, shapely.geometry.polygon.Polygon):
|
779
781
|
self.logger.warning("The padding value is too high, field will not padded.")
|
@@ -0,0 +1,67 @@
|
|
1
|
+
"""This module contains functions to work with custom OSM files."""
|
2
|
+
|
3
|
+
import json
|
4
|
+
from xml.etree import ElementTree as ET
|
5
|
+
|
6
|
+
import osmnx as ox
|
7
|
+
from osmnx._errors import InsufficientResponseError
|
8
|
+
|
9
|
+
from maps4fs.generator.game import FS25
|
10
|
+
|
11
|
+
|
12
|
+
def check_osm_file(file_path: str) -> bool:
|
13
|
+
"""Tries to read the OSM file using OSMnx and returns True if the file is valid,
|
14
|
+
False otherwise.
|
15
|
+
|
16
|
+
Arguments:
|
17
|
+
file_path (str): Path to the OSM file.
|
18
|
+
|
19
|
+
Returns:
|
20
|
+
bool: True if the file is valid, False otherwise.
|
21
|
+
"""
|
22
|
+
with open(FS25().texture_schema, encoding="utf-8") as f:
|
23
|
+
schema = json.load(f)
|
24
|
+
|
25
|
+
tags = []
|
26
|
+
for element in schema:
|
27
|
+
element_tags = element.get("tags")
|
28
|
+
if element_tags:
|
29
|
+
tags.append(element_tags)
|
30
|
+
|
31
|
+
for tag in tags:
|
32
|
+
try:
|
33
|
+
ox.features_from_xml(file_path, tags=tag)
|
34
|
+
except InsufficientResponseError:
|
35
|
+
continue
|
36
|
+
except Exception: # pylint: disable=W0718
|
37
|
+
return False
|
38
|
+
return True
|
39
|
+
|
40
|
+
|
41
|
+
def fix_osm_file(input_file_path: str, output_file_path: str) -> tuple[bool, int]:
|
42
|
+
"""Fixes the OSM file by removing all the <relation> nodes and all the nodes with
|
43
|
+
action='delete'.
|
44
|
+
|
45
|
+
Arguments:
|
46
|
+
input_file_path (str): Path to the input OSM file.
|
47
|
+
output_file_path (str): Path to the output OSM file.
|
48
|
+
|
49
|
+
Returns:
|
50
|
+
tuple[bool, int]: A tuple containing the result of the check_osm_file function
|
51
|
+
and the number of fixed errors.
|
52
|
+
"""
|
53
|
+
broken_entries = ["relation", ".//*[@action='delete']"]
|
54
|
+
|
55
|
+
tree = ET.parse(input_file_path)
|
56
|
+
root = tree.getroot()
|
57
|
+
|
58
|
+
fixed_errors = 0
|
59
|
+
for entry in broken_entries:
|
60
|
+
for element in root.findall(entry):
|
61
|
+
root.remove(element)
|
62
|
+
fixed_errors += 1
|
63
|
+
|
64
|
+
tree.write(output_file_path)
|
65
|
+
result = check_osm_file(output_file_path)
|
66
|
+
|
67
|
+
return result, fixed_errors
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.2
|
2
2
|
Name: maps4fs
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.7.5
|
4
4
|
Summary: Generate map templates for Farming Simulator from real places.
|
5
5
|
Author-email: iwatkot <iwatkot@gmail.com>
|
6
6
|
License: MIT License
|
@@ -36,7 +36,6 @@ Requires-Dist: pydantic
|
|
36
36
|
<a href="#How-To-Run">How-To-Run</a><br>
|
37
37
|
<a href="docs/FAQ.md">FAQ</a> •
|
38
38
|
<a href="docs/map_structure.md">Map Structure</a> •
|
39
|
-
<a href="docs/tips_and_hints.md">Tips and Hints</a> •
|
40
39
|
<a href="#Modder-Toolbox">Modder Toolbox</a><br>
|
41
40
|
<a href="#Supported-objects">Supported objects</a> •
|
42
41
|
<a href="#Generation-info">Generation info</a> •
|
@@ -69,16 +68,15 @@ Requires-Dist: pydantic
|
|
69
68
|
</div>
|
70
69
|
|
71
70
|
🗺️ Supports 2x2, 4x4, 8x8, 16x16 and any custom size maps<br>
|
72
|
-
🔄 Support map rotation
|
71
|
+
🔄 Support map rotation<br>
|
73
72
|
🌐 Supports custom [DTM Providers](#DTM-Providers) 🆕<br>
|
74
|
-
🌾 Automatically generates fields
|
75
|
-
🌽 Automatically generates farmlands
|
76
|
-
🌿 Automatically generates decorative foliage
|
77
|
-
🌲 Automatically generates forests
|
78
|
-
🌊 Automatically generates water planes
|
73
|
+
🌾 Automatically generates fields<br>
|
74
|
+
🌽 Automatically generates farmlands<br>
|
75
|
+
🌿 Automatically generates decorative foliage<br>
|
76
|
+
🌲 Automatically generates forests<br>
|
77
|
+
🌊 Automatically generates water planes<br>
|
79
78
|
📈 Automatically generates splines 🆕<br>
|
80
79
|
🛰️ Automatically downloads high resolution satellite images 🆕<br>
|
81
|
-
🏔️ Allows to use multiple DTM providers for elevation models 🆕<br>
|
82
80
|
🌍 Based on real-world data from OpenStreetMap<br>
|
83
81
|
🗺️ Supports [custom OSM maps](/docs/custom_osm.md)<br>
|
84
82
|
🏞️ Generates height map using SRTM dataset<br>
|
@@ -99,10 +97,14 @@ Requires-Dist: pydantic
|
|
99
97
|
🌿 Automatically generates decorative foliage.<br><br>
|
100
98
|
<img src="https://github.com/user-attachments/assets/27a5e541-a9f5-4504-b8d2-64aae9fb3e52"><br>
|
101
99
|
🌲 Automatically generates forests.<br><br>
|
100
|
+
<img src="https://github.com/user-attachments/assets/891911d7-081d-431e-a677-b4ae96870286"><br>
|
101
|
+
🌲 Allows to select trees for generation.<br><br>
|
102
102
|
<img src="https://github.com/user-attachments/assets/cce7d4e0-cba2-4dd2-b22d-03137fb2e860"><br>
|
103
103
|
🌊 Automatically generates water planes.<br><br>
|
104
104
|
<img src="https://github.com/user-attachments/assets/0b05b511-a595-48e7-a353-8298081314a4"><br>
|
105
105
|
📈 Automatically generates splines.<br><br>
|
106
|
+
<img src="https://github.com/user-attachments/assets/0957db9e-7b95-4951-969c-9d1edd9f073b"><br>
|
107
|
+
🖌️ Allows customization of the texture schema.<br><br>
|
106
108
|
<img src="https://github.com/user-attachments/assets/80e5923c-22c7-4dc0-8906-680902511f3a"><br>
|
107
109
|
🗒️ True-to-life blueprints for fast and precise modding.<br><br>
|
108
110
|
<img width="480" src="https://github.com/user-attachments/assets/1a8802d2-6a3b-4bfa-af2b-7c09478e199b"><br>
|
@@ -138,7 +140,7 @@ Check out the [Docker FAQ](docs/FAQ_docker.md) if you have any questions.<br>
|
|
138
140
|
```bash
|
139
141
|
pip install maps4fs
|
140
142
|
```
|
141
|
-
And refer to the [Python package](#option-3-python-package) section to learn how to use it.<br>
|
143
|
+
And refer to the [Python package or run from the source](#option-3-python-package-or-source-code) section to learn how to use it.<br>
|
142
144
|
|
143
145
|
## Overview
|
144
146
|
The core idea is coming from the awesome [maps4cim](https://github.com/klamann/maps4cim) project.<br>
|
@@ -198,7 +200,7 @@ docker run -d -p 8501:8501 --name maps4fs iwatkot/maps4fs
|
|
198
200
|
4. Fill in the required fields and click on the `Generate` button.
|
199
201
|
5. When the map is generated click on the `Download` button to get the map.
|
200
202
|
|
201
|
-
### Option 3: Python package
|
203
|
+
### Option 3: Python package or source code
|
202
204
|
🔴 Recommended for developers.
|
203
205
|
🗺️ Supported map sizes: 2x2, 4x4, 8x8, 16x16 km and any custom size.
|
204
206
|
⚙️ Advanced settings: enabled.
|
@@ -209,11 +211,50 @@ You can use the Python package to generate maps. Follow these steps:
|
|
209
211
|
```bash
|
210
212
|
pip install maps4fs
|
211
213
|
```
|
214
|
+
|
215
|
+
Or clone the repository and install the package from the source code:
|
216
|
+
```bash
|
217
|
+
git clone https://github.com/iwatkot/maps4fs.git
|
218
|
+
cd maps4fs
|
219
|
+
dev/create_venv.ps1 # for Windows
|
220
|
+
sh dev/create_venv.sh # for Linux
|
221
|
+
|
222
|
+
# Activate the virtual environment.
|
223
|
+
./venv/scripts/activate # for Windows
|
224
|
+
source venv/bin/activate # for Linux
|
225
|
+
|
226
|
+
# Edit the demo.py file to set the parameters.
|
227
|
+
python demo.py
|
228
|
+
```
|
229
|
+
|
230
|
+
|
212
231
|
2. Import the Game class and create an instance of it:
|
213
232
|
```python
|
214
233
|
import maps4fs as mfs
|
215
234
|
|
216
|
-
|
235
|
+
game_code = "fs25"
|
236
|
+
game = mfs.Game.from_code(game_code)
|
237
|
+
|
238
|
+
dtm_provider = mfs.SRTM30Provider
|
239
|
+
dtm_provider_settings = mfs.SRTM30ProviderSettings(easy_mode=True, power_factor=0)
|
240
|
+
|
241
|
+
lat, lon = 45.28, 20.23
|
242
|
+
coordinates = (lat, lon)
|
243
|
+
size = 2048
|
244
|
+
rotation = 25
|
245
|
+
|
246
|
+
map_directory = "map_directory"
|
247
|
+
os.makedirs(map_directory, exist_ok=True)
|
248
|
+
|
249
|
+
mp = mfs.Map(
|
250
|
+
game,
|
251
|
+
dtm_provider,
|
252
|
+
dtm_provider_settings,
|
253
|
+
coordinates,
|
254
|
+
size,
|
255
|
+
rotation,
|
256
|
+
map_directory,
|
257
|
+
)
|
217
258
|
```
|
218
259
|
In this case, the library will use the default templates, which should be present in the `data` directory, which should be placed in the current working directory.<br>
|
219
260
|
Structure example:<br>
|
@@ -226,28 +267,17 @@ Structure example:<br>
|
|
226
267
|
|
227
268
|
So it's recommended to download the `data` directory from the repository and place it in the root of your project.<br>
|
228
269
|
|
229
|
-
3.
|
230
|
-
```python
|
231
|
-
import maps4fs as mfs
|
232
|
-
|
233
|
-
map = mfs.Map(
|
234
|
-
game,
|
235
|
-
(52.5200, 13.4050), # Latitude and longitude of the map center.
|
236
|
-
height=1024, # The height of the map in meters.
|
237
|
-
width=1024, # The width of the map in meters.
|
238
|
-
map_directory="path/to/your/map/directory", # The directory where the map will be saved.
|
239
|
-
)
|
240
|
-
```
|
241
|
-
|
242
|
-
4. Generate the map:
|
270
|
+
3. Launch the generation process.
|
243
271
|
The `generate` method returns a generator, which yields the active component of the map. You can use it to track the progress of the generation process.
|
244
272
|
```python
|
245
|
-
for
|
246
|
-
print(
|
273
|
+
for component_name in mp.generate():
|
274
|
+
print(f"Generating {component_name}...")
|
247
275
|
```
|
248
276
|
|
249
277
|
The map will be saved in the `map_directory` directory.
|
250
278
|
|
279
|
+
➡️ Check out the [demo.py](demo.py) file for a complete example.
|
280
|
+
|
251
281
|
## Modder Toolbox
|
252
282
|
The tool now has a Modder Toolbox, which is a set of tools to help you with various tasks. You can open the toolbox by switching to the `🧰 Modder Toolbox` tab in the StreamLit app.<br>
|
253
283
|
|
@@ -259,7 +289,12 @@ Tools are divided into categories, which are listed below.
|
|
259
289
|
#### For custom schemas
|
260
290
|
- **Tree Schema Editor** - allows you to view all the supported trees models and select the ones you need on your map. After it, you should click the Show updated schema button and copy the JSON schema to the clipboard. Then you can use it in the Expert settings to generate the map with the selected trees.
|
261
291
|
|
292
|
+
- **Texture Schema Editor** - allows you to view all the supported textures and edit their parameters, such as priority, OSM tags and so on. After editing, you should click the Show updated schema button and copy the JSON schema to the clipboard. Then you can use it in the Expert settings to generate the map with the updated textures.
|
293
|
+
|
262
294
|
#### For Textures and DEM
|
295
|
+
|
296
|
+
- **Fix custom OSM file** - this tool fixes the most common errors in the custom OSM file, but it can not guarantee that the file will be fixed completely if some non-common errors are present.
|
297
|
+
|
263
298
|
- **GeoTIFF windowing** - allows you to upload your GeoTIFF file and select the region of interest to extract it from the image. It's useful when you have high-resolution DEM data and want to create a height map using it.
|
264
299
|
|
265
300
|
#### For Background terrain
|
@@ -1,8 +1,8 @@
|
|
1
|
-
maps4fs/__init__.py,sha256=
|
1
|
+
maps4fs/__init__.py,sha256=TXqX7Ks_Kqt2fiXRt5zdVSLUHxP4cT_p7jgutYFdbo8,630
|
2
2
|
maps4fs/logger.py,sha256=B-NEYpMjPAAqlV4VpfTi6nbBFnEABVtQOaYe6nMpidg,1489
|
3
3
|
maps4fs/generator/__init__.py,sha256=zZMLEkGzb4z0xql650gOtGSvcgX58DnJ2yN3vC2daRk,43
|
4
4
|
maps4fs/generator/background.py,sha256=tV4UXvtkNN-OSvv6ujp4jFWRU1xGBgEvSakVGZ1H4nc,24877
|
5
|
-
maps4fs/generator/component.py,sha256=
|
5
|
+
maps4fs/generator/component.py,sha256=pbpGaWy5C0UzxpcJ72HPY2gMol98snDr-bvNZSX4yY0,20823
|
6
6
|
maps4fs/generator/config.py,sha256=0QmK052B8bxyHVhg3jzCORLfOBMMmqVfhhbqXKf6OMk,4383
|
7
7
|
maps4fs/generator/dem.py,sha256=20gx0dzX0LyO6ipvDitst-BwGfcKogFqgQf9Q2qMH5U,10933
|
8
8
|
maps4fs/generator/game.py,sha256=Nf5r2ubV4YVAVHGzJyhbF2GnOC0qV3HlHYIZBCWciHs,7992
|
@@ -11,17 +11,19 @@ maps4fs/generator/i3d.py,sha256=pUyHKWKcw43xVCf3Y8iabtbQba05LYxMHi8vziGksIA,2484
|
|
11
11
|
maps4fs/generator/map.py,sha256=a50KQEr1XZKjS_WKXywGwh4OC3gyjY6M8FTc0eNcxpg,10183
|
12
12
|
maps4fs/generator/qgis.py,sha256=Es8hLuqN_KH8lDfnJE6He2rWYbAKJ3RGPn-o87S6CPI,6116
|
13
13
|
maps4fs/generator/satellite.py,sha256=_7RcuNmR1mjxEJWMDsjnzKUIqWxnGUn50XtjB7HmSPg,3661
|
14
|
-
maps4fs/generator/settings.py,sha256=
|
15
|
-
maps4fs/generator/texture.py,sha256=
|
14
|
+
maps4fs/generator/settings.py,sha256=9vbXISQrE-aDY7ATpvZ7LVJMqjfwa3-gNl-huI8XLO0,5666
|
15
|
+
maps4fs/generator/texture.py,sha256=L_j5GTTJXbp7OCT4-TWGFcY_zyAI_fNzDFLvXYiyKPI,33921
|
16
16
|
maps4fs/generator/dtm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
17
|
-
maps4fs/generator/dtm/dtm.py,sha256=
|
18
|
-
maps4fs/generator/dtm/
|
19
|
-
maps4fs/generator/dtm/
|
17
|
+
maps4fs/generator/dtm/dtm.py,sha256=T2h7eP5kQEWTGllI8ZxcGCDW4czZSoPBgOUS8a7_Ym8,19105
|
18
|
+
maps4fs/generator/dtm/nrw.py,sha256=lJYZBZB4n5egUlX2iA7AhLmMIRKB7i_LVxCTohWsSmw,4612
|
19
|
+
maps4fs/generator/dtm/srtm.py,sha256=RsvVa7ErajPwXoetG7mO_rldji9GR97HFaazH-PkdHw,4399
|
20
|
+
maps4fs/generator/dtm/usgs.py,sha256=fWFR_kO_uLVjAJAL43YFvBaHwsXWI-00jMlp23Ue7Wo,5450
|
20
21
|
maps4fs/toolbox/__init__.py,sha256=zZMLEkGzb4z0xql650gOtGSvcgX58DnJ2yN3vC2daRk,43
|
21
22
|
maps4fs/toolbox/background.py,sha256=9BXWNqs_n3HgqDiPztWylgYk_QM4YgBpe6_ZNQAWtSc,2154
|
23
|
+
maps4fs/toolbox/custom_osm.py,sha256=X6ZlPqiOhNjkmdD_qVroIfdOl9Rb90cDwVSLDVYgx80,1892
|
22
24
|
maps4fs/toolbox/dem.py,sha256=z9IPFNmYbjiigb3t02ZenI3Mo8odd19c5MZbjDEovTo,3525
|
23
|
-
maps4fs-1.
|
24
|
-
maps4fs-1.
|
25
|
-
maps4fs-1.
|
26
|
-
maps4fs-1.
|
27
|
-
maps4fs-1.
|
25
|
+
maps4fs-1.7.5.dist-info/LICENSE.md,sha256=pTKD_oUexcn-yccFCTrMeLkZy0ifLRa-VNcDLqLZaIw,10749
|
26
|
+
maps4fs-1.7.5.dist-info/METADATA,sha256=ZccKMQWPuC1-c3PWO7MZUG52LwxsrnP9_cOZ4jeTza0,40436
|
27
|
+
maps4fs-1.7.5.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
28
|
+
maps4fs-1.7.5.dist-info/top_level.txt,sha256=Ue9DSRlejRQRCaJueB0uLcKrWwsEq9zezfv5dI5mV1M,8
|
29
|
+
maps4fs-1.7.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|