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/download/eubucco.py +9 -17
- voxcity/download/gee.py +4 -3
- voxcity/download/mbfp.py +7 -7
- voxcity/download/oemj.py +22 -22
- voxcity/download/omt.py +10 -10
- voxcity/download/osm.py +23 -21
- voxcity/download/overture.py +7 -15
- voxcity/file/envimet.py +4 -4
- voxcity/file/geojson.py +25 -39
- voxcity/geo/draw.py +41 -45
- voxcity/geo/grid.py +9 -143
- voxcity/geo/utils.py +79 -66
- voxcity/sim/solar.py +5 -5
- voxcity/sim/view.py +5 -5
- voxcity/utils/weather.py +7 -7
- {voxcity-0.3.3.dist-info → voxcity-0.3.4.dist-info}/METADATA +5 -5
- voxcity-0.3.4.dist-info/RECORD +34 -0
- {voxcity-0.3.3.dist-info → voxcity-0.3.4.dist-info}/WHEEL +1 -1
- voxcity-0.3.3.dist-info/RECORD +0 -34
- {voxcity-0.3.3.dist-info → voxcity-0.3.4.dist-info}/AUTHORS.rst +0 -0
- {voxcity-0.3.3.dist-info → voxcity-0.3.4.dist-info}/LICENSE +0 -0
- {voxcity-0.3.3.dist-info → voxcity-0.3.4.dist-info}/top_level.txt +0 -0
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
|
-
|
|
180
|
+
Input vertices are already in (lon,lat) format required by Shapely.
|
|
181
181
|
|
|
182
182
|
Args:
|
|
183
|
-
vertices (list): List of (
|
|
183
|
+
vertices (list): List of (lon, lat) coordinate pairs
|
|
184
184
|
|
|
185
185
|
Returns:
|
|
186
186
|
Polygon: Shapely polygon object
|
|
187
187
|
"""
|
|
188
|
-
|
|
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,
|
|
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
|
-
|
|
212
|
-
|
|
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 [
|
|
331
|
+
list: List of [lon, lat] coordinates with first point repeated at end
|
|
332
332
|
"""
|
|
333
|
-
#
|
|
334
|
-
output_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: (
|
|
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 (
|
|
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
|
-
|
|
376
|
-
|
|
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 (
|
|
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
|
-
|
|
411
|
-
|
|
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
|
-
|
|
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
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
if
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
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
|
-
|
|
535
|
+
feature_id = id_count
|
|
536
|
+
id_count += 1
|
|
520
537
|
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
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
|
-
|
|
535
|
-
|
|
536
|
-
|
|
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(
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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
|
-
|
|
753
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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['
|
|
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,
|
|
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
|
+
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
|
-
(
|
|
168
|
-
(
|
|
169
|
-
(
|
|
170
|
-
(
|
|
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,,
|
voxcity-0.3.3.dist-info/RECORD
DELETED
|
@@ -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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|