urbanopt-geojson 0.11.1 → 0.11.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/LICENSE.md +1 -1
- data/lib/measures/urban_geometry_creation/LICENSE.md +1 -1
- data/lib/measures/urban_geometry_creation/measure.rb +1 -1
- data/lib/measures/urban_geometry_creation/measure.xml +3 -3
- data/lib/measures/urban_geometry_creation_zoning/LICENSE.md +1 -1
- data/lib/measures/urban_geometry_creation_zoning/measure.rb +3 -2
- data/lib/measures/urban_geometry_creation_zoning/measure.xml +3 -3
- data/lib/urbanopt/geojson/building.rb +5 -6
- data/lib/urbanopt/geojson/district_system.rb +0 -4
- data/lib/urbanopt/geojson/feature.rb +7 -8
- data/lib/urbanopt/geojson/geo_file.rb +19 -17
- data/lib/urbanopt/geojson/helper.rb +10 -6
- data/lib/urbanopt/geojson/logging.rb +1 -1
- data/lib/urbanopt/geojson/mapper_classes.rb +4 -3
- data/lib/urbanopt/geojson/model.rb +1 -0
- data/lib/urbanopt/geojson/region.rb +0 -3
- data/lib/urbanopt/geojson/scale_area.rb +6 -14
- data/lib/urbanopt/geojson/schema/building_properties.json +13 -1
- data/lib/urbanopt/geojson/schema/site_properties.json +16 -4
- data/lib/urbanopt/geojson/update_areas.rb +3 -2
- data/lib/urbanopt/geojson/validate_geojson.rb +9 -8
- data/lib/urbanopt/geojson/version.rb +1 -1
- data/lib/urbanopt/geojson/zoning.rb +3 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 566987c365d84a289682ac42258d4feddbb68bfc24525179cb963ace27a71017
|
4
|
+
data.tar.gz: a647418e27a8a0a92813646811e79183dcbe6d2ef24384dde7d2ab00ddf557a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 01f0c79e94c2fb950319e44d2a68d3b23124bc5007c7748957ded2744a46361dbafc52fb9ce81b4ec19061734fae6c5626ffabbc60633a2a876e431549737717
|
7
|
+
data.tar.gz: 48bcaf433af03988fde0448c70ee707e572ab008f1c4bf5608c6e29c8d2795a65b5a204b7b32495abcec63e510e35f55d2c88738ad34d3e7e7fd04b8bed9ea86
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# URBANopt GeoJSON Gem
|
2
2
|
|
3
|
+
## Version 0.11.2
|
4
|
+
* Allow null for some optional fields by @vtnate in https://github.com/urbanopt/urbanopt-geojson-gem/pull/273
|
5
|
+
* Added UO-ResStock connection variable to the site properties schema by @rawadelkontar in https://github.com/urbanopt/urbanopt-geojson-gem/pull/270
|
6
|
+
|
7
|
+
|
8
|
+
**Full Changelog**: https://github.com/urbanopt/urbanopt-geojson-gem/compare/v0.11.1...v0.11.2
|
9
|
+
|
3
10
|
## Version 0.11.1
|
4
11
|
Date Range: 01/09/24
|
5
12
|
|
data/LICENSE.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
URBANopt (tm), Copyright (c) 2019-
|
1
|
+
URBANopt (tm), Copyright (c) 2019-2024, Alliance for Sustainable Energy, LLC, and other
|
2
2
|
contributors. All rights reserved.
|
3
3
|
|
4
4
|
Redistribution and use in source and binary forms, with or without modification,
|
@@ -1,4 +1,4 @@
|
|
1
|
-
URBANopt (tm), Copyright (c) 2019-
|
1
|
+
URBANopt (tm), Copyright (c) 2019-2024, Alliance for Sustainable Energy, LLC, and other
|
2
2
|
contributors. All rights reserved.
|
3
3
|
|
4
4
|
Redistribution and use in source and binary forms, with or without modification,
|
@@ -121,7 +121,7 @@ class UrbanGeometryCreation < OpenStudio::Measure::ModelMeasure
|
|
121
121
|
if scale_footprint_area_by_floor_area
|
122
122
|
building_hash = feature.to_hash
|
123
123
|
if building_hash[:number_of_stories] && building_hash[:floor_area]
|
124
|
-
scaled_footprint_area = building_hash[:floor_area].to_f / building_hash[:number_of_stories]
|
124
|
+
scaled_footprint_area = building_hash[:floor_area].to_f / building_hash[:number_of_stories]
|
125
125
|
@runner.registerInfo("Desired footprint area in ft2: #{scaled_footprint_area}")
|
126
126
|
end
|
127
127
|
end
|
@@ -3,8 +3,8 @@
|
|
3
3
|
<schema_version>3.1</schema_version>
|
4
4
|
<name>urban_geometry_creation</name>
|
5
5
|
<uid>5ab85d6b-c9af-4361-8ab9-613ee99a5666</uid>
|
6
|
-
<version_id>
|
7
|
-
<version_modified>
|
6
|
+
<version_id>114e5a3f-0e66-47f2-aa96-299f71b4ef0f</version_id>
|
7
|
+
<version_modified>2024-06-25T21:15:26Z</version_modified>
|
8
8
|
<xml_checksum>D254E772</xml_checksum>
|
9
9
|
<class_name>UrbanGeometryCreation</class_name>
|
10
10
|
<display_name>UrbanGeometryCreation</display_name>
|
@@ -108,7 +108,7 @@
|
|
108
108
|
<filename>LICENSE.md</filename>
|
109
109
|
<filetype>md</filetype>
|
110
110
|
<usage_type>license</usage_type>
|
111
|
-
<checksum>
|
111
|
+
<checksum>3C275955</checksum>
|
112
112
|
</file>
|
113
113
|
<file>
|
114
114
|
<filename>README.md</filename>
|
@@ -1,4 +1,4 @@
|
|
1
|
-
URBANopt (tm), Copyright (c) 2019-
|
1
|
+
URBANopt (tm), Copyright (c) 2019-2024, Alliance for Sustainable Energy, LLC, and other
|
2
2
|
contributors. All rights reserved.
|
3
3
|
|
4
4
|
Redistribution and use in source and binary forms, with or without modification,
|
@@ -110,7 +110,8 @@ class UrbanGeometryCreationZoning < OpenStudio::Measure::ModelMeasure
|
|
110
110
|
@runner.registerWarning("Surface elevation not set for building '#{name}'")
|
111
111
|
end
|
112
112
|
|
113
|
-
|
113
|
+
case feature.type
|
114
|
+
when 'Building'
|
114
115
|
# make requested building, zoning is set to true
|
115
116
|
spaces = feature.create_building(:spaces_per_floor, model, @origin_lat_lon, @runner, true)
|
116
117
|
if spaces.nil? || spaces.empty?
|
@@ -157,7 +158,7 @@ class UrbanGeometryCreationZoning < OpenStudio::Measure::ModelMeasure
|
|
157
158
|
URBANopt::GeoJSON::Helper.convert_to_shading_surface_group(space)
|
158
159
|
end
|
159
160
|
|
160
|
-
|
161
|
+
when 'District System'
|
161
162
|
district_system_type = feature[:properties][:district_system_type]
|
162
163
|
if district_system_type == 'Community Photovoltaic'
|
163
164
|
shading_surfaces = URBANopt::GeoJSON::Helper.create_photovoltaics(feature, 0, model, @origin_lat_lon, @runner)
|
@@ -3,8 +3,8 @@
|
|
3
3
|
<schema_version>3.1</schema_version>
|
4
4
|
<name>urban_geometry_creation_zoning</name>
|
5
5
|
<uid>96ea1317-76ac-4670-b51d-71ee3f4fdd65</uid>
|
6
|
-
<version_id>
|
7
|
-
<version_modified>
|
6
|
+
<version_id>8b2f1d05-725a-4f06-bcac-1fb685f12f89</version_id>
|
7
|
+
<version_modified>2024-06-25T21:15:28Z</version_modified>
|
8
8
|
<xml_checksum>D254E772</xml_checksum>
|
9
9
|
<class_name>UrbanGeometryCreationZoning</class_name>
|
10
10
|
<display_name>UrbanGeometryCreationZoning</display_name>
|
@@ -89,7 +89,7 @@
|
|
89
89
|
<filename>LICENSE.md</filename>
|
90
90
|
<filetype>md</filetype>
|
91
91
|
<usage_type>license</usage_type>
|
92
|
-
<checksum>
|
92
|
+
<checksum>3C275955</checksum>
|
93
93
|
</file>
|
94
94
|
<file>
|
95
95
|
<filename>README.md</filename>
|
@@ -103,12 +103,13 @@ module URBANopt
|
|
103
103
|
end
|
104
104
|
|
105
105
|
spaces = []
|
106
|
-
|
106
|
+
case create_method
|
107
|
+
when :space_per_floor, :spaces_per_floor
|
107
108
|
(-number_of_stories_below_ground + 1..number_of_stories_above_ground).each do |story_number|
|
108
109
|
new_spaces = create_space_per_floor(story_number, floor_to_floor_height, model, origin_lat_lon, runner, zoning, scaled_footprint_area)
|
109
110
|
spaces.concat(new_spaces)
|
110
111
|
end
|
111
|
-
|
112
|
+
when :space_per_building
|
112
113
|
spaces = create_space_per_building(-number_of_stories_below_ground * floor_to_floor_height, number_of_stories_above_ground * floor_to_floor_height, model, origin_lat_lon, runner, zoning, other_building)
|
113
114
|
end
|
114
115
|
return spaces
|
@@ -417,10 +418,8 @@ module URBANopt
|
|
417
418
|
space = space.get
|
418
419
|
space.setName("Building Story #{story_number} Space")
|
419
420
|
space.surfaces.each do |surface|
|
420
|
-
if surface.surfaceType == 'Wall'
|
421
|
-
|
422
|
-
surface.setOutsideBoundaryCondition('Ground')
|
423
|
-
end
|
421
|
+
if surface.surfaceType == 'Wall' && (story_number < 1)
|
422
|
+
surface.setOutsideBoundaryCondition('Ground')
|
424
423
|
end
|
425
424
|
end
|
426
425
|
spaces << space
|
@@ -8,10 +8,6 @@ require 'urbanopt/geojson/feature'
|
|
8
8
|
module URBANopt
|
9
9
|
module GeoJSON # :nodoc: all
|
10
10
|
class DistrictSystem < Feature
|
11
|
-
def initialize(feature)
|
12
|
-
super(feature)
|
13
|
-
end
|
14
|
-
|
15
11
|
##
|
16
12
|
# Used to describe the feature type using the base method from the Feature class.
|
17
13
|
def feature_type
|
@@ -19,9 +19,7 @@ module URBANopt
|
|
19
19
|
@feature_json = validate_feat(feature)
|
20
20
|
end
|
21
21
|
|
22
|
-
# rubocop:disable Style/MethodMissing
|
23
22
|
def method_missing(name, *args, &blk)
|
24
|
-
# rubocop:enable Style/MethodMissing
|
25
23
|
if @feature_json[:properties].keys.map(&:to_sym).include? name.to_sym
|
26
24
|
|
27
25
|
return @feature_json[:properties][name.to_sym]
|
@@ -196,10 +194,11 @@ module URBANopt
|
|
196
194
|
def get_multi_polygons(json = @feature_json)
|
197
195
|
geometry_type = json[:geometry][:type]
|
198
196
|
multi_polygons = []
|
199
|
-
|
197
|
+
case geometry_type
|
198
|
+
when 'Polygon'
|
200
199
|
polygons = json[:geometry][:coordinates]
|
201
200
|
multi_polygons = [polygons]
|
202
|
-
|
201
|
+
when 'MultiPolygon'
|
203
202
|
multi_polygons = json[:geometry][:coordinates]
|
204
203
|
end
|
205
204
|
return multi_polygons
|
@@ -256,8 +255,7 @@ module URBANopt
|
|
256
255
|
central_latitude = Math.atan2(z, central_square_root)
|
257
256
|
|
258
257
|
[central_longitude * 180 / Math::PI,
|
259
|
-
|
260
|
-
|
258
|
+
central_latitude * 180 / Math::PI]
|
261
259
|
end
|
262
260
|
|
263
261
|
private
|
@@ -292,8 +290,9 @@ module URBANopt
|
|
292
290
|
end
|
293
291
|
|
294
292
|
geometry_type = feature[:geometry][:type]
|
295
|
-
|
296
|
-
|
293
|
+
case geometry_type
|
294
|
+
when 'Polygon'
|
295
|
+
when 'MultiPolygon'
|
297
296
|
else
|
298
297
|
raise("Unknown geometry type '#{geometry_type}'")
|
299
298
|
return false
|
@@ -47,7 +47,6 @@ module URBANopt
|
|
47
47
|
symbolize_names: true
|
48
48
|
)
|
49
49
|
|
50
|
-
|
51
50
|
# validate geojson file against schema
|
52
51
|
geojson_errors = validate(@@geojson_schema, geojson_file)
|
53
52
|
unless geojson_errors.empty?
|
@@ -83,6 +82,7 @@ module URBANopt
|
|
83
82
|
if feature[:properties][:name].nil?
|
84
83
|
raise('No name found for Building Feature')
|
85
84
|
end
|
85
|
+
|
86
86
|
if feature[:properties][:number_of_stories].nil?
|
87
87
|
@@logger.warn("Number of stories is required to calculate shading using the UrbanGeometryCreation measure.\n" \
|
88
88
|
"Not validating #{feature[:properties][:id]} against schema and ignoring in shading calculations")
|
@@ -96,6 +96,7 @@ module URBANopt
|
|
96
96
|
if feature[:properties][:name].nil?
|
97
97
|
raise('No name found for Building Feature')
|
98
98
|
end
|
99
|
+
|
99
100
|
@@logger.warn("OS-HPXML files may not conform to schema, which is usually ok.\n" \
|
100
101
|
"Not validating #{feature[:properties][:id]} against schema")
|
101
102
|
# Else validate for all required properties in the schema
|
@@ -196,16 +197,17 @@ module URBANopt
|
|
196
197
|
{ site: :electricity_emissions_annual_historical_subregion, feature: :electricity_emissions_annual_historical_subregion },
|
197
198
|
{ site: :electricity_emissions_future_year, feature: :electricity_emissions_future_year },
|
198
199
|
{ site: :electricity_emissions_hourly_historical_year, feature: :electricity_emissions_hourly_historical_year },
|
199
|
-
{ site: :electricity_emissions_annual_historical_year, feature: :electricity_emissions_annual_historical_year }
|
200
|
+
{ site: :electricity_emissions_annual_historical_year, feature: :electricity_emissions_annual_historical_year },
|
201
|
+
{ site: :characterize_residential_buildings_from_buildstock_csv, feature: :characterize_residential_buildings_from_buildstock_csv },
|
202
|
+
{ site: :resstock_buildstock_csv_path, feature: :resstock_buildstock_csv_path },
|
203
|
+
{ site: :uo_buildstock_mapping_csv_path, feature: :uo_buildstock_mapping_csv_path }
|
200
204
|
]
|
201
205
|
|
202
206
|
add_props.each do |prop|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
feature[:properties][prop[:feature]] = project[prop[:site]]
|
208
|
-
end
|
207
|
+
# property exists in site
|
208
|
+
if project.key?(prop[:site]) && project[prop[:site]] && (!feature[:properties].key?(prop[:feature]) || feature[:properties][prop[:feature]].nil? || feature[:properties][prop[:feature]].to_s.empty?)
|
209
|
+
# property does not exist in feature or is nil: add site property (don't overwrite)
|
210
|
+
feature[:properties][prop[:feature]] = project[prop[:site]]
|
209
211
|
end
|
210
212
|
end
|
211
213
|
|
@@ -226,7 +228,7 @@ module URBANopt
|
|
226
228
|
result = nil
|
227
229
|
if @@geojson_schema.nil?
|
228
230
|
@@schema_file_lock.synchronize do
|
229
|
-
File.open(File.dirname(__FILE__)
|
231
|
+
File.open("#{File.dirname(__FILE__)}/schema/geojson_schema.json") do |f|
|
230
232
|
result = JSON.parse(f.read, symbolize_names: true)
|
231
233
|
end
|
232
234
|
end
|
@@ -236,7 +238,7 @@ module URBANopt
|
|
236
238
|
|
237
239
|
def self.get_building_schema(strict)
|
238
240
|
result = nil
|
239
|
-
File.open(File.dirname(__FILE__)
|
241
|
+
File.open("#{File.dirname(__FILE__)}/schema/building_properties.json") do |f|
|
240
242
|
result = JSON.parse(f.read)
|
241
243
|
end
|
242
244
|
if strict
|
@@ -249,7 +251,7 @@ module URBANopt
|
|
249
251
|
|
250
252
|
def self.get_district_system_schema(strict)
|
251
253
|
result = nil
|
252
|
-
File.open(File.dirname(__FILE__)
|
254
|
+
File.open("#{File.dirname(__FILE__)}/schema/district_system_properties.json") do |f|
|
253
255
|
result = JSON.parse(f.read)
|
254
256
|
end
|
255
257
|
if strict
|
@@ -262,7 +264,7 @@ module URBANopt
|
|
262
264
|
|
263
265
|
def self.get_region_schema(strict)
|
264
266
|
result = nil
|
265
|
-
File.open(File.dirname(__FILE__)
|
267
|
+
File.open("#{File.dirname(__FILE__)}/schema/region_properties.json") do |f|
|
266
268
|
result = JSON.parse(f.read)
|
267
269
|
end
|
268
270
|
if strict
|
@@ -275,7 +277,7 @@ module URBANopt
|
|
275
277
|
|
276
278
|
def self.get_site_schema(strict)
|
277
279
|
result = nil
|
278
|
-
File.open(File.dirname(__FILE__)
|
280
|
+
File.open("#{File.dirname(__FILE__)}/schema/site_properties.json") do |f|
|
279
281
|
result = JSON.parse(f.read)
|
280
282
|
end
|
281
283
|
if strict
|
@@ -288,7 +290,7 @@ module URBANopt
|
|
288
290
|
|
289
291
|
def self.get_electrical_connector_schema(strict)
|
290
292
|
result = nil
|
291
|
-
File.open(File.dirname(__FILE__)
|
293
|
+
File.open("#{File.dirname(__FILE__)}/schema/electrical_connector_properties.json") do |f|
|
292
294
|
result = JSON.parse(f.read)
|
293
295
|
end
|
294
296
|
if strict
|
@@ -301,7 +303,7 @@ module URBANopt
|
|
301
303
|
|
302
304
|
def self.get_electrical_junction_schema(strict)
|
303
305
|
result = nil
|
304
|
-
File.open(File.dirname(__FILE__)
|
306
|
+
File.open("#{File.dirname(__FILE__)}/schema/electrical_junction_properties.json") do |f|
|
305
307
|
result = JSON.parse(f.read)
|
306
308
|
end
|
307
309
|
if strict
|
@@ -314,7 +316,7 @@ module URBANopt
|
|
314
316
|
|
315
317
|
def self.get_thermal_connector_schema(strict)
|
316
318
|
result = nil
|
317
|
-
File.open(File.dirname(__FILE__)
|
319
|
+
File.open("#{File.dirname(__FILE__)}/schema/thermal_connector_properties.json") do |f|
|
318
320
|
result = JSON.parse(f.read)
|
319
321
|
end
|
320
322
|
if strict
|
@@ -327,7 +329,7 @@ module URBANopt
|
|
327
329
|
|
328
330
|
def self.get_thermal_junction_schema(strict)
|
329
331
|
result = nil
|
330
|
-
File.open(File.dirname(__FILE__)
|
332
|
+
File.open("#{File.dirname(__FILE__)}/schema/thermal_junction_properties.json") do |f|
|
331
333
|
result = JSON.parse(f.read)
|
332
334
|
end
|
333
335
|
if strict
|
@@ -242,6 +242,7 @@ module URBANopt
|
|
242
242
|
other_buildings[:features].each do |other_building|
|
243
243
|
other_id = other_building[:properties][:id]
|
244
244
|
next if other_id == building.id
|
245
|
+
|
245
246
|
# Consider building, if other building type is ShadingOnly and other id is not equal to building id
|
246
247
|
if other_building_type == 'ShadingOnly' && other_id != building.id
|
247
248
|
# Checks if any building point is shaded by any other building point.
|
@@ -277,6 +278,7 @@ module URBANopt
|
|
277
278
|
runner.registerInfo("Feature #{other_building[:properties][:id]} is acting as shading object for #{building.id}")
|
278
279
|
end
|
279
280
|
next unless shadowed
|
281
|
+
|
280
282
|
new_building = building.create_other_building(:space_per_building, model, origin_lat_lon, runner, zoning, 0, other_building)
|
281
283
|
if new_building.nil? || new_building.empty?
|
282
284
|
runner.registerWarning("Failed to create spaces for other building '#{name}'")
|
@@ -321,6 +323,7 @@ module URBANopt
|
|
321
323
|
if is_shaded(min_pair[:building_point], min_pair[:other_building_point], origin_lat_lon)
|
322
324
|
return true
|
323
325
|
end
|
326
|
+
|
324
327
|
return false
|
325
328
|
end
|
326
329
|
|
@@ -339,7 +342,8 @@ module URBANopt
|
|
339
342
|
if distance < 1
|
340
343
|
return true
|
341
344
|
end
|
342
|
-
|
345
|
+
|
346
|
+
elevation_angle = 2.5 # not sure of best value maybe allow as project level argument
|
343
347
|
height = vector.z
|
344
348
|
apparent_angle_rad = Math.atan2(height, distance)
|
345
349
|
apparent_angle = OpenStudio.radToDeg(apparent_angle_rad)
|
@@ -351,9 +355,9 @@ module URBANopt
|
|
351
355
|
return result
|
352
356
|
end
|
353
357
|
|
354
|
-
|
355
|
-
|
356
|
-
end
|
357
|
-
end
|
358
|
-
end
|
358
|
+
class << self
|
359
|
+
private :is_shaded
|
359
360
|
end
|
361
|
+
end
|
362
|
+
end
|
363
|
+
end
|
@@ -46,15 +46,16 @@ module URBANopt
|
|
46
46
|
feature_file = scenario.feature_file
|
47
47
|
feature = feature_file.get_feature_by_id(feature_id)
|
48
48
|
raise "Cannot find feature '#{feature_id}' in '#{scenario.geometry_file}'" if feature.nil?
|
49
|
+
|
49
50
|
# deep clone of @@osw before we configure it #:nodoc:
|
50
51
|
osw = Marshal.load(Marshal.dump(@@osw))
|
51
52
|
osw[:name] = feature_name
|
52
53
|
osw[:description] = feature_name
|
53
|
-
|
54
|
+
end
|
54
55
|
# rubocop:disable Lint/ReturnInVoidContext
|
55
56
|
return osw
|
56
|
-
|
57
|
-
|
57
|
+
# rubocop:enable Lint/ReturnInVoidContext
|
58
|
+
end
|
58
59
|
end
|
59
60
|
end
|
60
61
|
end
|
@@ -10,9 +10,6 @@ module URBANopt
|
|
10
10
|
class Region < Feature
|
11
11
|
##
|
12
12
|
# Used to initialize the feature. This method is inherited from the Feature class.
|
13
|
-
def initialize(feature)
|
14
|
-
super(feature)
|
15
|
-
end
|
16
13
|
|
17
14
|
##
|
18
15
|
# Used to describe the Region feature type using the base method from the Feature class.
|
@@ -30,6 +30,7 @@ module URBANopt
|
|
30
30
|
@vertices = vertices
|
31
31
|
@centroid = OpenStudio.getCentroid(vertices)
|
32
32
|
raise "Cannot compute centroid for '#{vertices}'" if @centroid.empty?
|
33
|
+
|
33
34
|
@centroid = @centroid.get
|
34
35
|
@desired_area = desired_area
|
35
36
|
@new_vertices = vertices
|
@@ -41,15 +42,7 @@ module URBANopt
|
|
41
42
|
@eps = eps
|
42
43
|
end
|
43
44
|
|
44
|
-
attr_reader :zero
|
45
|
-
|
46
|
-
attr_reader :one
|
47
|
-
|
48
|
-
attr_reader :two
|
49
|
-
|
50
|
-
attr_reader :ten
|
51
|
-
|
52
|
-
attr_reader :eps
|
45
|
+
attr_reader :zero, :one, :two, :ten, :eps, :new_vertices
|
53
46
|
|
54
47
|
##
|
55
48
|
# Used to determine new scaled vertices, by iteratively passing in the perimeter distance to
|
@@ -59,12 +52,11 @@ module URBANopt
|
|
59
52
|
@new_vertices = URBANopt::GeoJSON::Zoning.divide_floor_print(@vertices, x[0].to_f, @runner, scale = true)
|
60
53
|
new_area = OpenStudio.getArea(@new_vertices)
|
61
54
|
raise "Cannot compute area for '#{@new_vertices}'" if new_area.empty?
|
55
|
+
|
62
56
|
new_area = new_area.get
|
63
57
|
|
64
58
|
return [new_area - @desired_area]
|
65
59
|
end
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
end # GeoJSON
|
70
|
-
end # URBANopt
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -283,6 +283,18 @@
|
|
283
283
|
"ev_curtailment_frac": {
|
284
284
|
"description": "Fraction between 0 and 1 that denotes curtailment of EV charging load to better align EV charging with expected energy production from a solar PV system",
|
285
285
|
"type": "number"
|
286
|
+
},
|
287
|
+
"characterize_residential_buildings_from_buildstock_csv":{
|
288
|
+
"description" : "Enable UO and ResStock connection to characterize residential buildings by matching them (and their properties) with building from the BuildStock CSV. Optional for residential buildings.",
|
289
|
+
"type": "boolean"
|
290
|
+
},
|
291
|
+
"resstock_buildstock_csv_path":{
|
292
|
+
"description" : "Path to the buildstock CSV that the users want to sample from to find the closest match to their UO residential buildings features. Optional for residential buildings.",
|
293
|
+
"type": "string"
|
294
|
+
},
|
295
|
+
"uo_buildstock_mapping_csv_path":{
|
296
|
+
"description" : "Path to the uo_buildstock mapping CSV. IN this CSV users can set a match of the UO features with a buildstock building and its characteristics and the feature will run with the assigned buildstock characteristics. Optional for residential buildings.",
|
297
|
+
"type": "string"
|
286
298
|
}
|
287
299
|
},
|
288
300
|
"required": [
|
@@ -515,4 +527,4 @@
|
|
515
527
|
]
|
516
528
|
}
|
517
529
|
}
|
518
|
-
}
|
530
|
+
}
|
@@ -77,15 +77,15 @@
|
|
77
77
|
},
|
78
78
|
"underground_cables_ratio": {
|
79
79
|
"description": "Ratio of overall cables that are underground vs. overhead for RNM analysis.",
|
80
|
-
"type": "number"
|
80
|
+
"type": ["number", "null"]
|
81
81
|
},
|
82
82
|
"only_lv_consumers": {
|
83
83
|
"description": "If true, only low voltage consumers will be considered in the RNM analysis.",
|
84
|
-
"type": "boolean"
|
84
|
+
"type": ["boolean", "null"]
|
85
85
|
},
|
86
86
|
"max_number_of_lv_nodes_per_building": {
|
87
87
|
"description": "Maximum number of low voltage nodes to represent a single building.",
|
88
|
-
"type": "number"
|
88
|
+
"type": ["number", "null"]
|
89
89
|
},
|
90
90
|
"emissions": {
|
91
91
|
"description": "Should be set to true to calculate electricity emissions for the associated building.",
|
@@ -211,9 +211,21 @@
|
|
211
211
|
"2018",
|
212
212
|
"2019"
|
213
213
|
]
|
214
|
+
},
|
215
|
+
"characterize_residential_buildings_from_buildstock_csv":{
|
216
|
+
"description" : "Enable UO and ResStock connection to characterize residential buildings by matching them (and their properties) with building from the BuildStock CSV.",
|
217
|
+
"type": "boolean"
|
218
|
+
},
|
219
|
+
"resstock_buildstock_csv_path":{
|
220
|
+
"description" : "Path to the buildstock CSV that the users want to sample from to find the closest match to their UO residential buildings features.",
|
221
|
+
"type": "string"
|
222
|
+
},
|
223
|
+
"uo_buildstock_mapping_csv_path":{
|
224
|
+
"description" : "Path to the uo_buildstock mapping CSV. IN this CSV users can set a match of the UO features with a buildstock building and its characteristics and the feature will run with the assigned buildstock characteristics",
|
225
|
+
"type": "string"
|
214
226
|
}
|
215
227
|
},
|
216
228
|
"required": [
|
217
229
|
],
|
218
230
|
"additionalProperties": false
|
219
|
-
}
|
231
|
+
}
|
@@ -25,10 +25,11 @@ geojson[:features].each do |feature|
|
|
25
25
|
# end
|
26
26
|
|
27
27
|
multi_polygons = nil
|
28
|
-
|
28
|
+
case geometry[:type]
|
29
|
+
when 'Polygon'
|
29
30
|
polygons = geometry[:coordinates]
|
30
31
|
multi_polygons = [polygons]
|
31
|
-
|
32
|
+
when 'MultiPolygon'
|
32
33
|
multi_polygons = geometry[:coordinates]
|
33
34
|
end
|
34
35
|
|
@@ -8,7 +8,7 @@ require 'json-schema'
|
|
8
8
|
|
9
9
|
def get_building_schema(strict)
|
10
10
|
result = nil
|
11
|
-
File.open(File.dirname(__FILE__)
|
11
|
+
File.open("#{File.dirname(__FILE__)}/../schema/building_properties.json") do |f|
|
12
12
|
result = JSON.parse(f.read)
|
13
13
|
end
|
14
14
|
if strict
|
@@ -21,7 +21,7 @@ end
|
|
21
21
|
|
22
22
|
def get_taxlot_schema(strict)
|
23
23
|
result = nil
|
24
|
-
File.open(File.dirname(__FILE__)
|
24
|
+
File.open("#{File.dirname(__FILE__)}/../schema/taxlot_properties.json") do |f|
|
25
25
|
result = JSON.parse(f.read)
|
26
26
|
end
|
27
27
|
if strict
|
@@ -34,7 +34,7 @@ end
|
|
34
34
|
|
35
35
|
def get_district_system_schema(strict)
|
36
36
|
result = nil
|
37
|
-
File.open(File.dirname(__FILE__)
|
37
|
+
File.open("#{File.dirname(__FILE__)}/../schema/district_system_properties.json") do |f|
|
38
38
|
result = JSON.parse(f.read)
|
39
39
|
end
|
40
40
|
if strict
|
@@ -47,7 +47,7 @@ end
|
|
47
47
|
|
48
48
|
def get_region_schema(strict)
|
49
49
|
result = nil
|
50
|
-
File.open(File.dirname(__FILE__)
|
50
|
+
File.open("#{File.dirname(__FILE__)}/../schema/region_properties.json") do |f|
|
51
51
|
result = JSON.parse(f.read)
|
52
52
|
end
|
53
53
|
if strict
|
@@ -95,13 +95,14 @@ Dir.glob('denver_district*.geojson').each do |p|
|
|
95
95
|
type = data['type']
|
96
96
|
errors = []
|
97
97
|
|
98
|
-
|
98
|
+
case type
|
99
|
+
when /building/i
|
99
100
|
errors = validate(building_schema, data)
|
100
|
-
|
101
|
+
when /district system/i
|
101
102
|
errors = validate(district_system_schema, data)
|
102
|
-
|
103
|
+
when /taxlot/i
|
103
104
|
errors = validate(taxlot_schema, data)
|
104
|
-
|
105
|
+
when /region/i
|
105
106
|
errors = validate(region_schema, data)
|
106
107
|
else
|
107
108
|
raise("Unknown type: '#{type}'")
|
@@ -28,11 +28,12 @@ module URBANopt
|
|
28
28
|
vertex_1 = nil
|
29
29
|
vertex_2 = nil
|
30
30
|
vertex_3 = nil
|
31
|
-
|
31
|
+
case i
|
32
|
+
when 0
|
32
33
|
vertex_1 = vertices[n - 1]
|
33
34
|
vertex_2 = vertices[i]
|
34
35
|
vertex_3 = vertices[i + 1]
|
35
|
-
|
36
|
+
when n - 1
|
36
37
|
vertex_1 = vertices[i - 1]
|
37
38
|
vertex_2 = vertices[i]
|
38
39
|
vertex_3 = vertices[0]
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: urbanopt-geojson
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tanushree Charan
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2024-
|
13
|
+
date: 2024-06-25 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|