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
         |