voxcity 0.3.3__py3-none-any.whl → 0.3.4__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 voxcity might be problematic. Click here for more details.

voxcity/geo/utils.py CHANGED
@@ -177,16 +177,15 @@ def transform_coords(transformer, lon, lat):
177
177
  def create_polygon(vertices):
178
178
  """
179
179
  Create a Shapely polygon from vertices.
180
- Converts from (lat,lon) format to (lon,lat) format required by Shapely.
180
+ Input vertices are already in (lon,lat) format required by Shapely.
181
181
 
182
182
  Args:
183
- vertices (list): List of (lat, lon) coordinate pairs
183
+ vertices (list): List of (lon, lat) coordinate pairs
184
184
 
185
185
  Returns:
186
186
  Polygon: Shapely polygon object
187
187
  """
188
- flipped_vertices = [(lon, lat) for lat, lon in vertices]
189
- return Polygon(flipped_vertices)
188
+ return Polygon(vertices)
190
189
 
191
190
  def create_geodataframe(polygon, crs=4326):
192
191
  """
@@ -202,14 +201,14 @@ def create_geodataframe(polygon, crs=4326):
202
201
  """
203
202
  return gpd.GeoDataFrame({'geometry': [polygon]}, crs=from_epsg(crs))
204
203
 
205
- def haversine_distance(lat1, lon1, lat2, lon2):
204
+ def haversine_distance(lon1, lat1, lon2, lat2):
206
205
  """
207
206
  Calculate great-circle distance between two points using Haversine formula.
208
207
  This is an approximation that treats the Earth as a perfect sphere.
209
208
 
210
209
  Args:
211
- lat1, lon1 (float): Coordinates of first point
212
- lat2, lon2 (float): Coordinates of second point
210
+ lon1, lat1 (float): Coordinates of first point
211
+ lon2, lat2 (float): Coordinates of second point
213
212
 
214
213
  Returns:
215
214
  float: Distance in kilometers
@@ -323,15 +322,16 @@ def merge_geotiffs(geotiff_files, output_dir):
323
322
  def convert_format_lat_lon(input_coords):
324
323
  """
325
324
  Convert coordinate format and close polygon.
325
+ Input coordinates are already in [lon, lat] format.
326
326
 
327
327
  Args:
328
328
  input_coords (list): List of [lon, lat] coordinates
329
329
 
330
330
  Returns:
331
- list: List of [lat, lon] coordinates with first point repeated at end
331
+ list: List of [lon, lat] coordinates with first point repeated at end
332
332
  """
333
- # Swap lon/lat to lat/lon format and create list
334
- output_coords = [[coord[1], coord[0]] for coord in input_coords]
333
+ # Create list with coordinates in same order
334
+ output_coords = input_coords.copy()
335
335
  # Close polygon by repeating first point at end
336
336
  output_coords.append(output_coords[0])
337
337
  return output_coords
@@ -344,7 +344,7 @@ def get_coordinates_from_cityname(place_name):
344
344
  place_name (str): Name of city to geocode
345
345
 
346
346
  Returns:
347
- tuple: (latitude, longitude) or None if geocoding fails
347
+ tuple: (longitude, latitude) or None if geocoding fails
348
348
  """
349
349
  # Initialize geocoder with user agent
350
350
  geolocator = Nominatim(user_agent="my_geocoding_script")
@@ -366,16 +366,16 @@ def get_city_country_name_from_rectangle(coordinates):
366
366
  Get city and country name from rectangle coordinates.
367
367
 
368
368
  Args:
369
- coordinates (list): List of (lat, lon) coordinates defining rectangle
369
+ coordinates (list): List of (lon, lat) coordinates defining rectangle
370
370
 
371
371
  Returns:
372
372
  str: String in format "city/ country" or None if lookup fails
373
373
  """
374
374
  # Calculate center point of rectangle
375
- latitudes = [coord[0] for coord in coordinates]
376
- longitudes = [coord[1] for coord in coordinates]
377
- center_lat = sum(latitudes) / len(latitudes)
375
+ longitudes = [coord[0] for coord in coordinates]
376
+ latitudes = [coord[1] for coord in coordinates]
378
377
  center_lon = sum(longitudes) / len(longitudes)
378
+ center_lat = sum(latitudes) / len(latitudes)
379
379
  center_coord = (center_lat, center_lon)
380
380
 
381
381
  # Initialize geocoder with rate limiting to avoid hitting API limits
@@ -401,17 +401,16 @@ def get_timezone_info(rectangle_coords):
401
401
  Get timezone and central meridian info for a location.
402
402
 
403
403
  Args:
404
- rectangle_coords (list): List of (lat, lon) coordinates defining rectangle
404
+ rectangle_coords (list): List of (lon, lat) coordinates defining rectangle
405
405
 
406
406
  Returns:
407
407
  tuple: (timezone string, central meridian longitude string)
408
408
  """
409
409
  # Calculate center point of rectangle
410
- latitudes = [coord[0] for coord in rectangle_coords]
411
- longitudes = [coord[1] for coord in rectangle_coords]
412
- center_lat = sum(latitudes) / len(latitudes)
410
+ longitudes = [coord[0] for coord in rectangle_coords]
411
+ latitudes = [coord[1] for coord in rectangle_coords]
413
412
  center_lon = sum(longitudes) / len(longitudes)
414
- center_coord = (center_lat, center_lon)
413
+ center_lat = sum(latitudes) / len(latitudes)
415
414
 
416
415
  # Find timezone at center coordinates
417
416
  tf = TimezoneFinder()
@@ -475,6 +474,7 @@ def create_building_polygons(filtered_buildings):
475
474
  """
476
475
  building_polygons = []
477
476
  idx = index.Index()
477
+ valid_count = 0
478
478
  count = 0
479
479
 
480
480
  # Find highest existing ID to avoid duplicates
@@ -487,63 +487,76 @@ def create_building_polygons(filtered_buildings):
487
487
  else:
488
488
  id_count = 1
489
489
 
490
- for i, building in enumerate(filtered_buildings):
491
- # Create polygon from coordinates
492
- polygon = Polygon(building['geometry']['coordinates'][0])
493
-
494
- # Extract height information from various possible property fields
495
- height = building['properties'].get('height')
496
- levels = building['properties'].get('levels')
497
- floors = building['properties'].get('num_floors')
498
- min_height = building['properties'].get('min_height')
499
- min_level = building['properties'].get('min_level')
500
- min_floor = building['properties'].get('min_floor')
501
-
502
- # Calculate height if not directly specified
503
- if (height is None) or (height<=0):
504
- if levels is not None:
505
- height = floor_height * levels
506
- elif floors is not None:
507
- height = floor_height * floors
508
- else:
509
- count += 1
510
- height = np.nan
511
-
512
- # Calculate minimum height if not directly specified
513
- if (min_height is None) or (min_height<=0):
514
- if min_level is not None:
515
- min_height = floor_height * float(min_level)
516
- elif min_floor is not None:
517
- min_height = floor_height * float(min_floor)
490
+ for building in filtered_buildings:
491
+ try:
492
+ # Handle potential nested coordinate tuples
493
+ coords = building['geometry']['coordinates'][0]
494
+ # Flatten coordinates if they're nested tuples
495
+ if isinstance(coords[0], tuple):
496
+ coords = [list(c) for c in coords]
497
+ elif isinstance(coords[0][0], tuple):
498
+ coords = [list(c[0]) for c in coords]
499
+
500
+ # Create polygon from coordinates
501
+ polygon = Polygon(coords)
502
+
503
+ # Skip invalid geometries
504
+ if not polygon.is_valid:
505
+ print(f"Warning: Skipping invalid polygon geometry")
506
+ continue
507
+
508
+ height = building['properties'].get('height')
509
+ levels = building['properties'].get('levels')
510
+ floors = building['properties'].get('num_floors')
511
+ min_height = building['properties'].get('min_height')
512
+ min_level = building['properties'].get('min_level')
513
+ min_floor = building['properties'].get('min_floor')
514
+
515
+ if (height is None) or (height<=0):
516
+ if levels is not None:
517
+ height = floor_height * levels
518
+ elif floors is not None:
519
+ height = floor_height * floors
520
+ else:
521
+ count += 1
522
+ height = np.nan
523
+
524
+ if (min_height is None) or (min_height<=0):
525
+ if min_level is not None:
526
+ min_height = floor_height * float(min_level)
527
+ elif min_floor is not None:
528
+ min_height = floor_height * float(min_floor)
529
+ else:
530
+ min_height = 0
531
+
532
+ if building['properties'].get('id') is not None:
533
+ feature_id = building['properties']['id']
518
534
  else:
519
- min_height = 0
535
+ feature_id = id_count
536
+ id_count += 1
520
537
 
521
- # Get or assign building ID
522
- if building['properties'].get('id') is not None:
523
- feature_id = building['properties']['id']
524
- else:
525
- feature_id = id_count
526
- id_count += 1
527
-
528
- # Check if building is inner part of another building
529
- if building['properties'].get('is_inner') is not None:
530
- is_inner = building['properties']['is_inner']
531
- else:
532
- is_inner = False
538
+ if building['properties'].get('is_inner') is not None:
539
+ is_inner = building['properties']['is_inner']
540
+ else:
541
+ is_inner = False
533
542
 
534
- # Store polygon with all properties and add to spatial index
535
- building_polygons.append((polygon, height, min_height, is_inner, feature_id))
536
- idx.insert(i, polygon.bounds)
543
+ building_polygons.append((polygon, height, min_height, is_inner, feature_id))
544
+ idx.insert(valid_count, polygon.bounds)
545
+ valid_count += 1
546
+
547
+ except Exception as e:
548
+ print(f"Warning: Skipping invalid building geometry: {e}")
549
+ continue
537
550
 
538
551
  return building_polygons, idx
539
552
 
540
- def get_country_name(lat, lon):
553
+ def get_country_name(lon, lat):
541
554
  """
542
555
  Get country name from coordinates using reverse geocoding.
543
556
 
544
557
  Args:
545
- lat (float): Latitude
546
558
  lon (float): Longitude
559
+ lat (float): Latitude
547
560
 
548
561
  Returns:
549
562
  str: Country name or None if lookup fails
voxcity/sim/solar.py CHANGED
@@ -374,7 +374,7 @@ def get_global_solar_irradiance_map(
374
374
 
375
375
  return global_map
376
376
 
377
- def get_solar_positions_astral(times, lat, lon):
377
+ def get_solar_positions_astral(times, lon, lat):
378
378
  """
379
379
  Compute solar azimuth and elevation using Astral for given times and location.
380
380
 
@@ -385,8 +385,8 @@ def get_solar_positions_astral(times, lat, lon):
385
385
 
386
386
  Args:
387
387
  times (DatetimeIndex): Array of timezone-aware datetime objects.
388
- lat (float): Latitude in degrees.
389
388
  lon (float): Longitude in degrees.
389
+ lat (float): Latitude in degrees.
390
390
 
391
391
  Returns:
392
392
  DataFrame: DataFrame with columns 'azimuth' and 'elevation' containing solar positions.
@@ -406,7 +406,7 @@ def get_solar_positions_astral(times, lat, lon):
406
406
  def get_cumulative_global_solar_irradiance(
407
407
  voxel_data,
408
408
  meshsize,
409
- df, lat, lon, tz,
409
+ df, lon, lat, tz,
410
410
  direct_normal_irradiance_scaling=1.0,
411
411
  diffuse_irradiance_scaling=1.0,
412
412
  **kwargs
@@ -424,8 +424,8 @@ def get_cumulative_global_solar_irradiance(
424
424
  voxel_data (ndarray): 3D array of voxel values.
425
425
  meshsize (float): Size of each voxel in meters.
426
426
  df (DataFrame): EPW weather data.
427
- lat (float): Latitude in degrees.
428
427
  lon (float): Longitude in degrees.
428
+ lat (float): Latitude in degrees.
429
429
  tz (float): Timezone offset in hours.
430
430
  direct_normal_irradiance_scaling (float): Scaling factor for direct normal irradiance.
431
431
  diffuse_irradiance_scaling (float): Scaling factor for diffuse horizontal irradiance.
@@ -498,7 +498,7 @@ def get_cumulative_global_solar_irradiance(
498
498
  df_period_utc = df_period_local.tz_convert(pytz.UTC)
499
499
 
500
500
  # Compute solar positions for period
501
- solar_positions = get_solar_positions_astral(df_period_utc.index, lat, lon)
501
+ solar_positions = get_solar_positions_astral(df_period_utc.index, lon, lat)
502
502
 
503
503
  # Create kwargs for diffuse calculation
504
504
  diffuse_kwargs = kwargs.copy()
voxcity/sim/view.py CHANGED
@@ -78,7 +78,7 @@ def calculate_transmittance(length, tree_k=0.6, tree_lad=1.0):
78
78
  def trace_ray_generic(voxel_data, origin, direction, hit_values, meshsize, tree_k, tree_lad, inclusion_mode=True):
79
79
  """Trace a ray through a voxel grid and check for hits with specified values.
80
80
 
81
- Uses DDA (Digital Differential Analyzer) algorithm for efficient ray traversal.
81
+ Uses DDA algorithm to efficiently traverse voxels along ray path.
82
82
  Handles tree transmittance using Beer-Lambert law.
83
83
 
84
84
  The DDA algorithm:
@@ -749,11 +749,11 @@ def get_landmark_visibility_map(voxcity_grid_ori, building_id_grid, building_geo
749
749
  return None
750
750
 
751
751
  # Calculate center point of rectangle
752
- lats = [coord[0] for coord in rectangle_vertices]
753
- lons = [coord[1] for coord in rectangle_vertices]
754
- center_lat = (min(lats) + max(lats)) / 2
752
+ lons = [coord[0] for coord in rectangle_vertices]
753
+ lats = [coord[1] for coord in rectangle_vertices]
755
754
  center_lon = (min(lons) + max(lons)) / 2
756
- target_point = (center_lat, center_lon)
755
+ center_lat = (min(lats) + max(lats)) / 2
756
+ target_point = (center_lon, center_lat)
757
757
 
758
758
  # Find buildings at center point
759
759
  landmark_ids = find_building_containing_point(features, target_point)
voxcity/utils/weather.py CHANGED
@@ -163,14 +163,14 @@ def process_epw(epw_path: Union[str, Path]) -> Tuple[pd.DataFrame, Dict]:
163
163
 
164
164
  return df, headers
165
165
 
166
- def get_nearest_epw_from_climate_onebuilding(latitude: float, longitude: float, output_dir: str = "./", max_distance: Optional[float] = None,
166
+ def get_nearest_epw_from_climate_onebuilding(longitude: float, latitude: float, output_dir: str = "./", max_distance: Optional[float] = None,
167
167
  extract_zip: bool = True, load_data: bool = True) -> Tuple[Optional[str], Optional[pd.DataFrame], Optional[Dict]]:
168
168
  """
169
169
  Download and process EPW weather file from Climate.OneBuilding.Org based on coordinates.
170
170
 
171
171
  Args:
172
- latitude (float): Latitude of the location
173
172
  longitude (float): Longitude of the location
173
+ latitude (float): Latitude of the location
174
174
  output_dir (str): Directory to save the EPW file (defaults to current directory)
175
175
  max_distance (float, optional): Maximum distance in kilometers to search for stations
176
176
  extract_zip (bool): Whether to extract the ZIP file (default True)
@@ -222,7 +222,7 @@ def get_nearest_epw_from_climate_onebuilding(latitude: float, longitude: float,
222
222
  content = re.sub(r'[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\xFF]', '', content)
223
223
  return content
224
224
 
225
- def haversine_distance(lat1: float, lon1: float, lat2: float, lon2: float) -> float:
225
+ def haversine_distance(lon1: float, lat1: float, lon2: float, lat2: float) -> float:
226
226
  """Calculate the great circle distance between two points on Earth."""
227
227
  R = 6371 # Earth's radius in kilometers
228
228
 
@@ -281,8 +281,8 @@ def get_nearest_epw_from_climate_onebuilding(latitude: float, longitude: float,
281
281
 
282
282
  metadata = {
283
283
  'url': url,
284
- 'latitude': lat,
285
284
  'longitude': lon,
285
+ 'latitude': lat,
286
286
  'elevation': int(extract_value(r'Elevation <b>(-?\d+)</b>', '0')),
287
287
  'name': extract_value(r'<b>(.*?)</b>'),
288
288
  'wmo': extract_value(r'WMO <b>(\d+)</b>'),
@@ -370,7 +370,7 @@ def get_nearest_epw_from_climate_onebuilding(latitude: float, longitude: float,
370
370
 
371
371
  # Calculate distances and find nearest station
372
372
  stations_with_distances = [
373
- (station, haversine_distance(latitude, longitude, station['latitude'], station['longitude']))
373
+ (station, haversine_distance(longitude, latitude, station['longitude'], station['latitude']))
374
374
  for station in all_stations
375
375
  ]
376
376
 
@@ -445,7 +445,7 @@ def get_nearest_epw_from_climate_onebuilding(latitude: float, longitude: float,
445
445
  # Print station information
446
446
  print(f"\nDownloaded EPW file for {nearest_station['name']}")
447
447
  print(f"Distance: {distance:.2f} km")
448
- print(f"Station coordinates: {nearest_station['latitude']}, {nearest_station['longitude']}")
448
+ print(f"Station coordinates: {nearest_station['longitude']}, {nearest_station['latitude']}")
449
449
  if nearest_station['wmo']:
450
450
  print(f"WMO: {nearest_station['wmo']}")
451
451
  if nearest_station['climate_zone']:
@@ -520,4 +520,4 @@ def read_epw_for_solar_simulation(epw_file_path):
520
520
  df = pd.DataFrame(data, columns=['time', 'DNI', 'DHI']).set_index('time')
521
521
  df = df.sort_index()
522
522
 
523
- return df, lat, lon, tz, elevation_m
523
+ return df, lon, lat, tz, elevation_m
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: voxcity
3
- Version: 0.3.3
3
+ Version: 0.3.4
4
4
  Summary: voxcity is an easy and one-stop tool to output 3d city models for microclimate simulation by integrating multiple geospatial open-data
5
5
  Author-email: Kunihiko Fujiwara <kunihiko@nus.edu.sg>
6
6
  Maintainer-email: Kunihiko Fujiwara <kunihiko@nus.edu.sg>
@@ -164,10 +164,10 @@ Define the target area by directly specifying the coordinates of the rectangle v
164
164
 
165
165
  ```python
166
166
  rectangle_vertices = [
167
- (47.59830044521263, -122.33587348582083), # Southwest corner (latitude, longitude)
168
- (47.60279755390168, -122.33587348582083), # Northwest corner (latitude, longitude)
169
- (47.60279755390168, -122.32922451417917), # Northeast corner (latitude, longitude)
170
- (47.59830044521263, -122.32922451417917) # Southeast corner (latitude, longitude)
167
+ (-122.33587348582083, 47.59830044521263), # Southwest corner (longitude, latitude)
168
+ (-122.33587348582083, 47.60279755390168), # Northwest corner (longitude, latitude)
169
+ (-122.32922451417917, 47.60279755390168), # Northeast corner (longitude, latitude)
170
+ (-122.32922451417917, 47.59830044521263) # Southeast corner (longitude, latitude)
171
171
  ]
172
172
  ```
173
173
 
@@ -0,0 +1,34 @@
1
+ voxcity/__init__.py,sha256=HJM0D2Mv9qpk4JdVzt2SRAAk-hA1D_pCO0ezZH9F7KA,248
2
+ voxcity/voxcity.py,sha256=ewwSxA_lMIkQ5yiLZutq4UCLfnUm0r5f2Jiy-q6cFm0,32256
3
+ voxcity/download/__init__.py,sha256=OgGcGxOXF4tjcEL6DhOnt13DYPTvOigUelp5xIpTqM0,171
4
+ voxcity/download/eubucco.py,sha256=e1JXBuUfBptSDvNznSGckRs5Xgrj_SAFxk445J_o4KY,14854
5
+ voxcity/download/gee.py,sha256=j7jmzp44T3M6j_4DwhU9Y8Y6gqbZo1zFIlduQPc0jvk,14339
6
+ voxcity/download/mbfp.py,sha256=aQOGKP0pV6J6MCBXG9J6kQX04_S31rMjJEVvgrgOPg4,3942
7
+ voxcity/download/oemj.py,sha256=YlCuWBQfi40gfmwQcGDeHiPOs4Pk_jLZq65d5R3IGMU,7886
8
+ voxcity/download/omt.py,sha256=EjzimZMFXcjWNRlUEwPIjeTmE4rPh_9bjsgZyro8_mo,8819
9
+ voxcity/download/osm.py,sha256=HHSuj6jiQrThrfyJMWHE2nQ0Rqkx4UsXopk8AoNZS6Q,26536
10
+ voxcity/download/overture.py,sha256=daOvsySC2KIcTcMJUSA7XdbMELJuyLAIM2vr1DRLGp0,7714
11
+ voxcity/download/utils.py,sha256=z6MdPxM96FWQVqvZW2Eg5pMewVHVysUP7F6ueeCwMfI,1375
12
+ voxcity/file/__init_.py,sha256=cVyNyE6axEpSd3CT5hGuMOAlOyU1p8lVP4jkF1-0Ad8,94
13
+ voxcity/file/envimet.py,sha256=SPVoSyYTMNyDRDFWsI0YAsIsb6yt_SXZeDUlhyqlEqY,24282
14
+ voxcity/file/geojson.py,sha256=G8jG5Ffh86uhNZBLmr_hgyU9FwGab_tJBePET5DUQYk,24188
15
+ voxcity/file/magicavoxel.py,sha256=Fsv7yGRXeKmp82xcG3rOb0t_HtoqltNq2tHl08xVlqY,7500
16
+ voxcity/file/obj.py,sha256=oW-kPoZj53nfmO9tXP3Wvizq6Kkjh-QQR8UBexRuMiI,21609
17
+ voxcity/geo/__init_.py,sha256=rsj0OMzrTNACccdvEfmf632mb03BRUtKLuecppsxX40,62
18
+ voxcity/geo/draw.py,sha256=roljWXyqYdsWYkmb-5_WNxrJrfV5lnAt8uZblCCo_3Q,13555
19
+ voxcity/geo/grid.py,sha256=YgAityV3KaBsng9R_aDQKRFkdEssv5Yzn5wKCIOJQOQ,34243
20
+ voxcity/geo/utils.py,sha256=1BRHp-DDeOA8HG8jplY7Eo75G3oXkVGL6DGONL4BA8A,19815
21
+ voxcity/sim/__init_.py,sha256=APdkcdaovj0v_RPOaA4SBvFUKT2RM7Hxuuz3Sux4gCo,65
22
+ voxcity/sim/solar.py,sha256=7waUoUMzDBf_Van3qghSG019TrgHgNj-TcVRVf0StuU,31306
23
+ voxcity/sim/utils.py,sha256=sEYBB2-hLJxTiXQps1_-Fi7t1HN3-1OPOvBCWtgIisA,130
24
+ voxcity/sim/view.py,sha256=oq6G-f0Tn-KT0vjYNJfucmOIrv1GNjljhA-zvU4nNoA,36668
25
+ voxcity/utils/__init_.py,sha256=xjEadXQ9wXTw0lsx0JTbyTqASWw0GJLfT6eRr0CyQzw,71
26
+ voxcity/utils/lc.py,sha256=RwPd-VY3POV3gTrBhM7TubgGb9MCd3nVah_G8iUEF7k,11562
27
+ voxcity/utils/visualization.py,sha256=GVERj0noHAvJtDT0fV3K6w7pTfuAUfwKez-UMuEakEg,42214
28
+ voxcity/utils/weather.py,sha256=fJ2p5susoMgYSBlrmlTlZVUDe9kpQwmLuyv1TgcOnDM,21482
29
+ voxcity-0.3.4.dist-info/AUTHORS.rst,sha256=m82vkI5QokEGdcHof2OxK39lf81w1P58kG9ZNNAKS9U,175
30
+ voxcity-0.3.4.dist-info/LICENSE,sha256=-hGliOFiwUrUSoZiB5WF90xXGqinKyqiDI2t6hrnam8,1087
31
+ voxcity-0.3.4.dist-info/METADATA,sha256=wi1ziMnMN8UpySzEQZpGN6SrUW2ZSkY-gOd4kQ9de0U,23608
32
+ voxcity-0.3.4.dist-info/WHEEL,sha256=A3WOREP4zgxI0fKrHUG8DC8013e3dK3n7a6HDbcEIwE,91
33
+ voxcity-0.3.4.dist-info/top_level.txt,sha256=00b2U-LKfDllt6RL1R33MXie5MvxzUFye0NGD96t_8I,8
34
+ voxcity-0.3.4.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (75.7.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,34 +0,0 @@
1
- voxcity/__init__.py,sha256=HJM0D2Mv9qpk4JdVzt2SRAAk-hA1D_pCO0ezZH9F7KA,248
2
- voxcity/voxcity.py,sha256=ewwSxA_lMIkQ5yiLZutq4UCLfnUm0r5f2Jiy-q6cFm0,32256
3
- voxcity/download/__init__.py,sha256=OgGcGxOXF4tjcEL6DhOnt13DYPTvOigUelp5xIpTqM0,171
4
- voxcity/download/eubucco.py,sha256=vd-LoWwUk1A1WC1cSeJTVRFPlAiU04NyQj3RMjohx4M,15149
5
- voxcity/download/gee.py,sha256=mHrG8mMhhOAvA6wASurZvUPpCKCcg75GriD6VN8VbCM,14297
6
- voxcity/download/mbfp.py,sha256=pa5eCw1ANzNIzr1bTcrfzttRtNUjUDS808nDAXEHAag,3942
7
- voxcity/download/oemj.py,sha256=sJ32-hTIo68Vov7Jqxc-n-6oGOF5LcWc8amwZhgZagc,7886
8
- voxcity/download/omt.py,sha256=x_oKPLWA0YhhC5BRsiGl5sHPFVG5io9w_-0Uafhihm8,8898
9
- voxcity/download/osm.py,sha256=h5K2ZWeVBpbN_BeWgujWOiyO6gYysylXvzHE3Kk0zEw,26272
10
- voxcity/download/overture.py,sha256=R6XtC2iP6Xp6e2Otop4FXs97gCW_bAuFQ_RCOPiHbjo,8079
11
- voxcity/download/utils.py,sha256=z6MdPxM96FWQVqvZW2Eg5pMewVHVysUP7F6ueeCwMfI,1375
12
- voxcity/file/__init_.py,sha256=cVyNyE6axEpSd3CT5hGuMOAlOyU1p8lVP4jkF1-0Ad8,94
13
- voxcity/file/envimet.py,sha256=s3qw3kI8sO5996xdnB0MgPCCL0PvICoY1NfrtCz51Sw,24182
14
- voxcity/file/geojson.py,sha256=tlkE_strKYTB2xCdZmtAUQjqnTqHYKhpylyi4E8yi0A,25205
15
- voxcity/file/magicavoxel.py,sha256=Fsv7yGRXeKmp82xcG3rOb0t_HtoqltNq2tHl08xVlqY,7500
16
- voxcity/file/obj.py,sha256=oW-kPoZj53nfmO9tXP3Wvizq6Kkjh-QQR8UBexRuMiI,21609
17
- voxcity/geo/__init_.py,sha256=rsj0OMzrTNACccdvEfmf632mb03BRUtKLuecppsxX40,62
18
- voxcity/geo/draw.py,sha256=tCWg2kPTbZP3wXyGGywB2Hj4viifaG554VDSjMfFWJg,13728
19
- voxcity/geo/grid.py,sha256=l9iqi2OCmtJixCc3Y3RthF403pdrx6sB0565wZ1uHgM,40042
20
- voxcity/geo/utils.py,sha256=sR9InBHxV76XjlGPLD7blg_6EjbM0MG5DOyJffhBjWk,19372
21
- voxcity/sim/__init_.py,sha256=APdkcdaovj0v_RPOaA4SBvFUKT2RM7Hxuuz3Sux4gCo,65
22
- voxcity/sim/solar.py,sha256=VJCWWHxrKSAg-YgajzY1B9bbnBzKybMm7Tw7dBwvoGI,31306
23
- voxcity/sim/utils.py,sha256=sEYBB2-hLJxTiXQps1_-Fi7t1HN3-1OPOvBCWtgIisA,130
24
- voxcity/sim/view.py,sha256=xab2B7mKDTufJnE7UN0aPAvkhoGQuduIXZOkJTuS5fU,36682
25
- voxcity/utils/__init_.py,sha256=xjEadXQ9wXTw0lsx0JTbyTqASWw0GJLfT6eRr0CyQzw,71
26
- voxcity/utils/lc.py,sha256=RwPd-VY3POV3gTrBhM7TubgGb9MCd3nVah_G8iUEF7k,11562
27
- voxcity/utils/visualization.py,sha256=GVERj0noHAvJtDT0fV3K6w7pTfuAUfwKez-UMuEakEg,42214
28
- voxcity/utils/weather.py,sha256=Qwnr0paGdRQstwD0A9q2QfJIV-aQUyxH-6viRwXOuwM,21482
29
- voxcity-0.3.3.dist-info/AUTHORS.rst,sha256=m82vkI5QokEGdcHof2OxK39lf81w1P58kG9ZNNAKS9U,175
30
- voxcity-0.3.3.dist-info/LICENSE,sha256=-hGliOFiwUrUSoZiB5WF90xXGqinKyqiDI2t6hrnam8,1087
31
- voxcity-0.3.3.dist-info/METADATA,sha256=F5jlTMuhl1a3-SfpO60KbdhCZ-Ke85BDA7w1OpGD8jM,23607
32
- voxcity-0.3.3.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
33
- voxcity-0.3.3.dist-info/top_level.txt,sha256=00b2U-LKfDllt6RL1R33MXie5MvxzUFye0NGD96t_8I,8
34
- voxcity-0.3.3.dist-info/RECORD,,