urbanopt-geojson 0.3.1 → 0.5.3

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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/pull_request_template.md +2 -2
  3. data/CHANGELOG.md +48 -4
  4. data/CONTRIBUTING.md +1 -1
  5. data/LICENSE.md +29 -17
  6. data/RDOC_MAIN.md +26 -22
  7. data/README.md +2 -2
  8. data/Rakefile +16 -6
  9. data/doc_templates/LICENSE.md +27 -17
  10. data/doc_templates/copyright_erb.txt +40 -30
  11. data/doc_templates/copyright_js.txt +1 -1
  12. data/doc_templates/copyright_ruby.txt +17 -7
  13. data/docs/.vuepress/components/InnerJsonSchema.vue +7 -11
  14. data/docs/.vuepress/config.js +11 -1
  15. data/docs/.vuepress/highlight.js +1 -1
  16. data/docs/.vuepress/json-schema-deref-loader.js +22 -0
  17. data/docs/README.md +3 -4
  18. data/docs/package-lock.json +5280 -6960
  19. data/docs/package.json +10 -8
  20. data/lib/measures/urban_geometry_creation/LICENSE.md +27 -17
  21. data/lib/measures/urban_geometry_creation/README.md +8 -0
  22. data/lib/measures/urban_geometry_creation/measure.rb +34 -9
  23. data/lib/measures/urban_geometry_creation/measure.xml +33 -14
  24. data/lib/measures/urban_geometry_creation_zoning/LICENSE.md +27 -17
  25. data/lib/measures/urban_geometry_creation_zoning/measure.rb +16 -8
  26. data/lib/measures/urban_geometry_creation_zoning/measure.xml +11 -11
  27. data/lib/urbanopt-geojson.rb +16 -6
  28. data/lib/urbanopt/geojson.rb +17 -6
  29. data/lib/urbanopt/geojson/building.rb +76 -15
  30. data/lib/urbanopt/geojson/derived_extension.rb +16 -6
  31. data/lib/urbanopt/geojson/district_system.rb +16 -6
  32. data/lib/urbanopt/geojson/feature.rb +102 -9
  33. data/lib/urbanopt/geojson/geo_file.rb +18 -8
  34. data/lib/urbanopt/geojson/helper.rb +52 -7
  35. data/lib/urbanopt/geojson/logging.rb +16 -6
  36. data/lib/urbanopt/geojson/mapper_classes.rb +16 -6
  37. data/lib/urbanopt/geojson/model.rb +1 -1
  38. data/lib/urbanopt/geojson/region.rb +1 -1
  39. data/lib/urbanopt/geojson/scale_area.rb +95 -0
  40. data/lib/urbanopt/geojson/schema/building_properties.json +57 -13
  41. data/lib/urbanopt/geojson/schema/electrical_connector_properties.json +24 -15
  42. data/lib/urbanopt/geojson/schema/thermal_connector_properties.json +1 -1
  43. data/lib/urbanopt/geojson/schema/thermal_junction_properties.json +1 -1
  44. data/lib/urbanopt/geojson/update_areas.rb +1 -1
  45. data/lib/urbanopt/geojson/validate_geojson.rb +1 -1
  46. data/lib/urbanopt/geojson/version.rb +2 -2
  47. data/lib/urbanopt/geojson/zoning.rb +21 -16
  48. data/urbanopt-geojson-gem.gemspec +4 -8
  49. metadata +12 -24
@@ -1,21 +1,31 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt™, Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
- #
4
+
5
5
  # Redistribution and use in source and binary forms, with or without modification,
6
6
  # are permitted provided that the following conditions are met:
7
- #
7
+
8
8
  # Redistributions of source code must retain the above copyright notice, this list
9
9
  # of conditions and the following disclaimer.
10
- #
10
+
11
11
  # Redistributions in binary form must reproduce the above copyright notice, this
12
12
  # list of conditions and the following disclaimer in the documentation and/or other
13
13
  # materials provided with the distribution.
14
- #
14
+
15
15
  # Neither the name of the copyright holder nor the names of its contributors may be
16
16
  # used to endorse or promote products derived from this software without specific
17
17
  # prior written permission.
18
- #
18
+
19
+ # Redistribution of this software, without modification, must refer to the software
20
+ # by the same designation. Redistribution of a modified version of this software
21
+ # (i) may not refer to the modified version by the same designation, or by any
22
+ # confusingly similar designation, and (ii) must refer to the underlying software
23
+ # originally provided by Alliance as “URBANopt”. Except to comply with the foregoing,
24
+ # the term “URBANopt”, or any confusingly similar designation may not be used to
25
+ # refer to any modified version of this software or any modified version of the
26
+ # underlying software originally provided by Alliance without the prior written
27
+ # consent of Alliance.
28
+
19
29
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
30
  # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
31
  # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
@@ -39,3 +49,4 @@ require 'urbanopt/geojson/zoning'
39
49
  require 'urbanopt/geojson/model'
40
50
  require 'urbanopt/geojson/derived_extension'
41
51
  require 'urbanopt/geojson/logging'
52
+ require 'urbanopt/geojson/scale_area'
@@ -1,21 +1,31 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt™, Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
- #
4
+
5
5
  # Redistribution and use in source and binary forms, with or without modification,
6
6
  # are permitted provided that the following conditions are met:
7
- #
7
+
8
8
  # Redistributions of source code must retain the above copyright notice, this list
9
9
  # of conditions and the following disclaimer.
10
- #
10
+
11
11
  # Redistributions in binary form must reproduce the above copyright notice, this
12
12
  # list of conditions and the following disclaimer in the documentation and/or other
13
13
  # materials provided with the distribution.
14
- #
14
+
15
15
  # Neither the name of the copyright holder nor the names of its contributors may be
16
16
  # used to endorse or promote products derived from this software without specific
17
17
  # prior written permission.
18
- #
18
+
19
+ # Redistribution of this software, without modification, must refer to the software
20
+ # by the same designation. Redistribution of a modified version of this software
21
+ # (i) may not refer to the modified version by the same designation, or by any
22
+ # confusingly similar designation, and (ii) must refer to the underlying software
23
+ # originally provided by Alliance as “URBANopt”. Except to comply with the foregoing,
24
+ # the term “URBANopt”, or any confusingly similar designation may not be used to
25
+ # refer to any modified version of this software or any modified version of the
26
+ # underlying software originally provided by Alliance without the prior written
27
+ # consent of Alliance.
28
+
19
29
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
30
  # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
31
  # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
@@ -87,9 +97,11 @@ module URBANopt
87
97
  # * +origin_lat_lon+ - _Type:Float_ - An instance of +OpenStudio::PointLatLon+ indicating the latitude and longitude of the origin.
88
98
  # * +runner+ - _Type:String_ - An instance of +OpenStudio::Measure::OSRunner+ for the measure run.
89
99
  # * +zoning+ - _Type:Boolean_ - Value is +true+ if utilizing detailed zoning, else
90
- # +false+. Zoning is set to False by default.
100
+ # +false+ Zoning is set to False by default.
101
+ # * +scaled_footprint_area+ - Used to scale the footprint area using the floor area. 0 by
102
+ # default (no scaling).
91
103
  # * +other_building+ - _Type:URBANopt::GeoJSON::Feature - Optional, allow the user to pass in a different building to process. This is used for creating the other buildings for shading.
92
- def create_building(create_method, model, origin_lat_lon, runner, zoning = false, other_building = @feature_json)
104
+ def create_building(create_method, model, origin_lat_lon, runner, zoning = false, scaled_footprint_area = 0, other_building = @feature_json)
93
105
  number_of_stories = other_building[:properties][:number_of_stories]
94
106
  number_of_stories_above_ground = other_building[:properties][:number_of_stories_above_ground]
95
107
  number_of_stories_below_ground = other_building[:properties][:number_of_stories_below_ground]
@@ -128,7 +140,7 @@ module URBANopt
128
140
  spaces = []
129
141
  if create_method == :space_per_floor || create_method == :spaces_per_floor
130
142
  (-number_of_stories_below_ground + 1..number_of_stories_above_ground).each do |story_number|
131
- new_spaces = create_space_per_floor(story_number, floor_to_floor_height, model, origin_lat_lon, runner, zoning)
143
+ new_spaces = create_space_per_floor(story_number, floor_to_floor_height, model, origin_lat_lon, runner, zoning, scaled_footprint_area)
132
144
  spaces.concat(new_spaces)
133
145
  end
134
146
  elsif create_method == :space_per_building
@@ -248,9 +260,50 @@ module URBANopt
248
260
  end
249
261
 
250
262
  ##
251
- # Convert to a Hash equivalent for JSON serialization
263
+ # Used to calculate the perimeter from the floor polygon of a Feature. Returns the perimeter
264
+ # value.
265
+ #
266
+ # [Parameters]
267
+ # * +feature+ - An instance of URBANopt::GeoJSON::Feature
268
+ #
269
+ def calculate_perimeter(feature)
270
+ model = OpenStudio::Model::Model.new
271
+ runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
272
+ origin_lat_lon = nil
273
+ origin_lat_lon = feature.create_origin_lat_lon(runner)
274
+ spaces = feature.create_building(:space_per_building, model, origin_lat_lon, runner)
275
+ surfaces = spaces[0].surfaces
276
+ ground_surface = nil
277
+ surfaces.each do |surface|
278
+ boundary_condition = surface.outsideBoundaryCondition
279
+ if boundary_condition == 'Ground'
280
+ ground_surface = surface
281
+ end
282
+ end
283
+ vertices = ground_surface.vertices
284
+ n = vertices.size
285
+ perimeter = 0
286
+ for i in (0..n - 1) do i
287
+ vertex_1 = nil
288
+ vertex_2 = nil
289
+ if i == n - 1
290
+ vertex_1 = vertices[n - 1]
291
+ vertex_2 = vertices[0]
292
+ else
293
+ vertex_1 = vertices[i]
294
+ vertex_2 = vertices[i + 1]
295
+ end
296
+ length = OpenStudio::Vector3d.new(vertex_2 - vertex_1).length
297
+ perimeter += length
298
+ end
299
+ perimeter = OpenStudio.convert(perimeter, 'm', 'ft').get
300
+ perimeter = perimeter.round(4)
301
+ return perimeter
302
+ end
303
+
252
304
  ##
253
- # - Exclude attributes with nil values.
305
+ # Convert to a Hash equivalent for JSON serialization.
306
+ # Excludes attributes with nil value.
254
307
  ##
255
308
  def to_hash
256
309
  result = {}
@@ -354,10 +407,18 @@ module URBANopt
354
407
  # * +zoning+ - _Type:Boolean_ - Value is +true+ if utilizing detailed zoning, else
355
408
  # +false+. Zoning is set to False by default.
356
409
  # rubocop:disable Style/CommentedKeyword
357
- def create_space_per_floor(story_number, floor_to_floor_height, model, origin_lat_lon, runner, zoning = false) #:doc:
410
+ def create_space_per_floor(story_number, floor_to_floor_height, model, origin_lat_lon, runner, zoning = false, scaled_footprint_area) #:doc:
358
411
  # rubocop:enable Style/CommentedKeyword
359
- geometry = @feature_json[:geometry]
360
- properties = @feature_json[:properties]
412
+ begin
413
+ if other_building
414
+ geometry = other_building[:geometry]
415
+ properties = other_building[:properties]
416
+ else
417
+ geometry = @feature_json[:geometry]
418
+ properties = @feature_json[:properties]
419
+ end
420
+ rescue StandardError
421
+ end
361
422
  floor_prints = []
362
423
  multi_polygons = get_multi_polygons
363
424
  multi_polygons.each do |multi_polygon|
@@ -366,7 +427,7 @@ module URBANopt
366
427
  end
367
428
  multi_polygon.each do |polygon|
368
429
  elevation = (story_number - 1) * floor_to_floor_height
369
- floor_print = URBANopt::GeoJSON::Helper.floor_print_from_polygon(polygon, elevation, origin_lat_lon, runner, zoning)
430
+ floor_print = URBANopt::GeoJSON::Helper.floor_print_from_polygon(polygon, elevation, origin_lat_lon, runner, zoning, scaled_footprint_area)
370
431
  if floor_print
371
432
  if zoning
372
433
  this_floor_prints = URBANopt::GeoJSON::Zoning.divide_floor_print(floor_print, 4.0, runner)
@@ -1,21 +1,31 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt™, Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
- #
4
+
5
5
  # Redistribution and use in source and binary forms, with or without modification,
6
6
  # are permitted provided that the following conditions are met:
7
- #
7
+
8
8
  # Redistributions of source code must retain the above copyright notice, this list
9
9
  # of conditions and the following disclaimer.
10
- #
10
+
11
11
  # Redistributions in binary form must reproduce the above copyright notice, this
12
12
  # list of conditions and the following disclaimer in the documentation and/or other
13
13
  # materials provided with the distribution.
14
- #
14
+
15
15
  # Neither the name of the copyright holder nor the names of its contributors may be
16
16
  # used to endorse or promote products derived from this software without specific
17
17
  # prior written permission.
18
- #
18
+
19
+ # Redistribution of this software, without modification, must refer to the software
20
+ # by the same designation. Redistribution of a modified version of this software
21
+ # (i) may not refer to the modified version by the same designation, or by any
22
+ # confusingly similar designation, and (ii) must refer to the underlying software
23
+ # originally provided by Alliance as “URBANopt”. Except to comply with the foregoing,
24
+ # the term “URBANopt”, or any confusingly similar designation may not be used to
25
+ # refer to any modified version of this software or any modified version of the
26
+ # underlying software originally provided by Alliance without the prior written
27
+ # consent of Alliance.
28
+
19
29
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
30
  # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
31
  # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
@@ -1,21 +1,31 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt™, Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
- #
4
+
5
5
  # Redistribution and use in source and binary forms, with or without modification,
6
6
  # are permitted provided that the following conditions are met:
7
- #
7
+
8
8
  # Redistributions of source code must retain the above copyright notice, this list
9
9
  # of conditions and the following disclaimer.
10
- #
10
+
11
11
  # Redistributions in binary form must reproduce the above copyright notice, this
12
12
  # list of conditions and the following disclaimer in the documentation and/or other
13
13
  # materials provided with the distribution.
14
- #
14
+
15
15
  # Neither the name of the copyright holder nor the names of its contributors may be
16
16
  # used to endorse or promote products derived from this software without specific
17
17
  # prior written permission.
18
- #
18
+
19
+ # Redistribution of this software, without modification, must refer to the software
20
+ # by the same designation. Redistribution of a modified version of this software
21
+ # (i) may not refer to the modified version by the same designation, or by any
22
+ # confusingly similar designation, and (ii) must refer to the underlying software
23
+ # originally provided by Alliance as “URBANopt”. Except to comply with the foregoing,
24
+ # the term “URBANopt”, or any confusingly similar designation may not be used to
25
+ # refer to any modified version of this software or any modified version of the
26
+ # underlying software originally provided by Alliance without the prior written
27
+ # consent of Alliance.
28
+
19
29
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
30
  # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
31
  # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
@@ -1,21 +1,31 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt™, Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
- #
4
+
5
5
  # Redistribution and use in source and binary forms, with or without modification,
6
6
  # are permitted provided that the following conditions are met:
7
- #
7
+
8
8
  # Redistributions of source code must retain the above copyright notice, this list
9
9
  # of conditions and the following disclaimer.
10
- #
10
+
11
11
  # Redistributions in binary form must reproduce the above copyright notice, this
12
12
  # list of conditions and the following disclaimer in the documentation and/or other
13
13
  # materials provided with the distribution.
14
- #
14
+
15
15
  # Neither the name of the copyright holder nor the names of its contributors may be
16
16
  # used to endorse or promote products derived from this software without specific
17
17
  # prior written permission.
18
- #
18
+
19
+ # Redistribution of this software, without modification, must refer to the software
20
+ # by the same designation. Redistribution of a modified version of this software
21
+ # (i) may not refer to the modified version by the same designation, or by any
22
+ # confusingly similar designation, and (ii) must refer to the underlying software
23
+ # originally provided by Alliance as “URBANopt”. Except to comply with the foregoing,
24
+ # the term “URBANopt”, or any confusingly similar designation may not be used to
25
+ # refer to any modified version of this software or any modified version of the
26
+ # underlying software originally provided by Alliance without the prior written
27
+ # consent of Alliance.
28
+
19
29
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
30
  # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
31
  # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
@@ -48,7 +58,7 @@ module URBANopt
48
58
  def method_missing(name, *args, &blk)
49
59
  # rubocop:enable Style/MethodMissing
50
60
  if @feature_json[:properties].keys.map(&:to_sym).include? name.to_sym
51
- # rubocop:enable Style/GuardClause
61
+
52
62
  return @feature_json[:properties][name.to_sym]
53
63
  else
54
64
  super
@@ -98,6 +108,89 @@ module URBANopt
98
108
  return @@feature_schema[feature_type]
99
109
  end
100
110
 
111
+ ##
112
+ # Used to calculate the aspect ratio for a given floor polygon.
113
+ #
114
+ def calculate_aspect_ratio
115
+ multi_polygons = get_multi_polygons(@feature_json)
116
+ rad_per_deg = 0.017453293
117
+
118
+ multi_polygons.each do |multi_polygon|
119
+ if multi_polygon.size > 1
120
+ runner.registerWarning('Ignoring holes in polygon')
121
+ end
122
+ multi_polygon.each do |polygon|
123
+ n = polygon.size
124
+ length = 0
125
+ north = 0
126
+ east = 0
127
+ south = 0
128
+ west = 0
129
+ aspect_ratio = 0
130
+
131
+ for i in (0..n - 2) do i
132
+ vertex_1 = nil
133
+ vertex_2 = nil
134
+ if i == n - 2
135
+ vertex_1 = polygon[n - 2]
136
+ vertex_2 = polygon[0]
137
+ else
138
+ vertex_1 = polygon[i]
139
+ vertex_2 = polygon[i + 1]
140
+ end
141
+ x_1 = vertex_1[0]
142
+ y_1 = vertex_1[1]
143
+ x_2 = vertex_2[0]
144
+ y_2 = vertex_2[1]
145
+
146
+ dist = (x_2 - x_1)**2 + (y_2 - y_1)**2
147
+
148
+ length = Math.sqrt(dist)
149
+
150
+ # delta latitude
151
+ dlat = x_2 - x_1
152
+ # delta longitude
153
+ dlon = y_2 - y_1
154
+
155
+ # convert radian to degree
156
+ sin_angle = Math.asin(dlon / length) * (1 / rad_per_deg)
157
+ sin_angle = sin_angle.round(4)
158
+
159
+ cos_angle = Math.acos(dlat / length) * (1 / rad_per_deg)
160
+ cos_angle = cos_angle.round(4)
161
+
162
+ if cos_angle >= 45 && cos_angle <= 135 && sin_angle >= 45 && sin_angle <= 90
163
+ north += length
164
+ elsif cos_angle >= 0 && cos_angle < 45 && sin_angle > -45 && sin_angle < 45
165
+ east += length
166
+ elsif cos_angle >= 45 && cos_angle <= 135 && sin_angle >= -90 && sin_angle <= -45
167
+ south += length
168
+ elsif cos_angle > 135 && cos_angle <= 180 && sin_angle > -45 && sin_angle < 45
169
+ west += length
170
+ end
171
+
172
+ if east + west != 0
173
+ aspect_ratio = (north + south) / (east + west)
174
+ else
175
+ aspect_ratio = 1
176
+ end
177
+
178
+ end
179
+
180
+ aspect_ratio = aspect_ratio.round(4)
181
+ return aspect_ratio
182
+ end
183
+ end
184
+ end
185
+
186
+ ##
187
+ # Used to calculate the perimeter multiplier given the aspect ratio, original perimeter and area.
188
+ def get_perimeter_multiplier(area, aspect_ratio, perimeter_original)
189
+ perimeter_new = 2 * (Math.sqrt(area * aspect_ratio) + Math.sqrt(area / aspect_ratio))
190
+ perimeter_ratio = perimeter_original / perimeter_new
191
+ return perimeter_ratio
192
+ end
193
+
101
194
  ##
102
195
  # Returns coordinate with the minimum longitute and latitude within a given +building_json+ .
103
196
  def get_min_lon_lat
@@ -179,8 +272,8 @@ module URBANopt
179
272
 
180
273
  x = y = z = 0.0
181
274
  vertices.each do |station|
182
- latitude = station[0] * Math::PI / 180
183
- longitude = station[1] * Math::PI / 180
275
+ latitude = station[1] * Math::PI / 180
276
+ longitude = station[0] * Math::PI / 180
184
277
 
185
278
  x += Math.cos(latitude) * Math.cos(longitude)
186
279
  y += Math.cos(latitude) * Math.sin(longitude)
@@ -1,21 +1,31 @@
1
1
  # *********************************************************************************
2
- # URBANopt, Copyright (c) 2019-2020, Alliance for Sustainable Energy, LLC, and other
2
+ # URBANopt™, Copyright (c) 2019-2021, Alliance for Sustainable Energy, LLC, and other
3
3
  # contributors. All rights reserved.
4
- #
4
+
5
5
  # Redistribution and use in source and binary forms, with or without modification,
6
6
  # are permitted provided that the following conditions are met:
7
- #
7
+
8
8
  # Redistributions of source code must retain the above copyright notice, this list
9
9
  # of conditions and the following disclaimer.
10
- #
10
+
11
11
  # Redistributions in binary form must reproduce the above copyright notice, this
12
12
  # list of conditions and the following disclaimer in the documentation and/or other
13
13
  # materials provided with the distribution.
14
- #
14
+
15
15
  # Neither the name of the copyright holder nor the names of its contributors may be
16
16
  # used to endorse or promote products derived from this software without specific
17
17
  # prior written permission.
18
- #
18
+
19
+ # Redistribution of this software, without modification, must refer to the software
20
+ # by the same designation. Redistribution of a modified version of this software
21
+ # (i) may not refer to the modified version by the same designation, or by any
22
+ # confusingly similar designation, and (ii) must refer to the underlying software
23
+ # originally provided by Alliance as “URBANopt”. Except to comply with the foregoing,
24
+ # the term “URBANopt”, or any confusingly similar designation may not be used to
25
+ # refer to any modified version of this software or any modified version of the
26
+ # underlying software originally provided by Alliance without the prior written
27
+ # consent of Alliance.
28
+
19
29
  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20
30
  # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21
31
  # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
@@ -162,7 +172,7 @@ module URBANopt
162
172
  # merge site origin properties
163
173
  f = merge_site_properties(f)
164
174
  if f[:properties][:type] == 'Building'
165
- # rubocop:enable Style/GuardClause
175
+
166
176
  return URBANopt::GeoJSON::Building.new(f)
167
177
  elsif f[:properties] && f[:properties][:type] == 'District System'
168
178
  return URBANopt::GeoJSON::DistrictSystem.new(f)
@@ -199,7 +209,7 @@ module URBANopt
199
209
  add_props.each do |prop|
200
210
  if project.key?(prop[:site]) && project[prop[:site]]
201
211
  # property exists in site
202
- if !feature[:properties].key?(prop[:feature]) || feature[:properties][prop[:feature]].nil? || feature[:properties][prop[:feature]].empty?
212
+ if !feature[:properties].key?(prop[:feature]) || feature[:properties][prop[:feature]].nil? || feature[:properties][prop[:feature]].to_s.empty?
203
213
  # property does not exist in feature or is nil: add site property (don't overwrite)
204
214
  feature[:properties][prop[:feature]] = project[prop[:site]]
205
215
  end