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.

@@ -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 in UTM format
339
+ - minimum and maximum coordinates
340
340
  - map dimensions in meters
341
341
  - map coefficients (meters per pixel)
342
342
  """
343
- north, south, east, west = self.get_bbox(project_utm=True)
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
- cv2.fillPoly(layer_image, [polygon], color=255) # type: ignore
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 get_relative_x(self, x: float) -> int:
580
- """Converts UTM X coordinate to relative X coordinate in map image.
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
- x (float): UTM X coordinate.
583
+ lat (float): Latitude.
584
+ lon (float): Longitude.
584
585
 
585
586
  Returns:
586
- int: Relative X coordinate in map image.
587
+ tuple[int, int]: Pixel coordinates.
587
588
  """
588
- return int(self.map_rotated_size * (x - self.minimum_x) / (self.maximum_x - self.minimum_x))
589
-
590
- def get_relative_y(self, y: float) -> int:
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
- xs, ys = geometry.exterior.coords.xy
627
- xs = [int(self.get_relative_x(x)) for x in xs.tolist()]
628
- ys = [int(self.get_relative_y(y)) for y in ys.tolist()]
629
- pairs = list(zip(xs, ys))
630
- return np.array(pairs, dtype=np.int32).reshape((-1, 1, 2))
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
- objects_utm = ox.projection.project_gdf(objects, to_latlong=False)
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(objects_utm, width, is_fieds)
734
+ yield from method(objects, width, is_fieds)
733
735
 
734
736
  def linestrings_generator(
735
- self, objects_utm: pd.core.frame.DataFrame, *args, **kwargs
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
- objects_utm (pd.core.frame.DataFrame): Dataframe with OSM objects in UTM format.
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 objects_utm.iterrows():
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, objects_utm: pd.core.frame.DataFrame, width: int | None, is_fieds: bool
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
- objects_utm (pd.core.frame.DataFrame): Dataframe with OSM objects in UTM format.
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 objects_utm.iterrows():
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(-self.map.texture_settings.fields_padding)
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
1
+ Metadata-Version: 2.2
2
2
  Name: maps4fs
3
- Version: 1.6.91
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 🆕<br>
71
+ 🔄 Support map rotation<br>
73
72
  🌐 Supports custom [DTM Providers](#DTM-Providers) 🆕<br>
74
- 🌾 Automatically generates fields 🆕<br>
75
- 🌽 Automatically generates farmlands 🆕<br>
76
- 🌿 Automatically generates decorative foliage 🆕<br>
77
- 🌲 Automatically generates forests 🆕<br>
78
- 🌊 Automatically generates water planes 🆕<br>
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
- game = mfs.Game.from_code("FS25")
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. Create an instance of the Map class:
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 active_component in map.generate():
246
- print(active_component)
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=LrWSsyWaU28Dzcs7sRycywO_LvM-j34UvtafyBhvdx4,490
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=vn_ThQw3OTcloqYuJWC7vghAvIAnwJsybEm7qMwvsZk,21356
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=3ASf3hW1nkGt8_3IOvKIKNUd6XAHYTAA8FquuhpSUlU,5668
15
- maps4fs/generator/texture.py,sha256=gIXCHU1vT3evbkaXAV9gLUrgI1wH3xJLgWAtZgFruj0,34013
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=nCQKQygARLxaz4HkREQQd0Yb03oKOf1Iav5_VoZsFWI,9819
18
- maps4fs/generator/dtm/srtm.py,sha256=2-pX6bWrJX6gr8IM7ueX6mm_PW7_UQ58MtdzDHae2OQ,9030
19
- maps4fs/generator/dtm/usgs.py,sha256=hwVjoSNTNRU6hwnfwJ2d3rOdtOjadCmx2QESA2REn6s,14493
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.6.91.dist-info/LICENSE.md,sha256=pTKD_oUexcn-yccFCTrMeLkZy0ifLRa-VNcDLqLZaIw,10749
24
- maps4fs-1.6.91.dist-info/METADATA,sha256=1yIT5j9FOyB83FGk2lNExtLmEA3w-V1yeKiobQEbn40,39161
25
- maps4fs-1.6.91.dist-info/WHEEL,sha256=A3WOREP4zgxI0fKrHUG8DC8013e3dK3n7a6HDbcEIwE,91
26
- maps4fs-1.6.91.dist-info/top_level.txt,sha256=Ue9DSRlejRQRCaJueB0uLcKrWwsEq9zezfv5dI5mV1M,8
27
- maps4fs-1.6.91.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.7.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5