import importlib.util import sys import unittest from pathlib import Path ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT / '.tools/terrain')) spec = importlib.util.spec_from_file_location('building_data', ROOT / 'scripts/prepare-vworld-buildings.py') module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) def feature(identity, x=126.99, properties=None): return {'type': 'Feature', 'id': identity, 'properties': properties or {}, 'geometry': { 'type': 'Polygon', 'coordinates': [[[x, 37.43], [x+.0001, 37.43], [x+.0001, 37.4301], [x, 37.4301], [x, 37.43]]]}} class VWorldBuildingsTest(unittest.TestCase): def test_selection_uses_only_official_features_and_prefers_measured_height(self): empty = feature('vworld/a', properties={'source:geometry': 'VWorld'}) measured = feature('vworld/b', properties={'height': '12', 'source:geometry': 'VWorld'}) separate = feature('vworld/c', 126.992, properties={'source:geometry': 'VWorld'}) separate['geometry']['coordinates'].append([[126.99202,37.43002], [126.99202,37.43004], [126.99204,37.43004], [126.99204,37.43002], [126.99202,37.43002]]) result, report = module.select_buildings([empty, measured, separate]) self.assertEqual([f['id'] for f in result], ['vworld/b', 'vworld/c']) self.assertEqual(result[0]['properties']['height'], '12') self.assertEqual(len(result[1]['geometry']['coordinates']), 2) self.assertEqual(report['officialOverlapsSkipped'], ['vworld/a']) self.assertTrue(all(f['properties']['source:geometry'] == 'VWorld' for f in result)) def test_official_zero_and_overflow_are_missing_and_multipart_is_preserved(self): raw = feature('archive:1', properties={'A1':'123', 'A16':'0', 'A26':'*********', 'A9':'공동주택'}) raw['geometry'] = {'type':'MultiPolygon', 'coordinates':[raw['geometry']['coordinates'], feature('other',126.992)['geometry']['coordinates']]} result = module.official_features([raw]) self.assertEqual(len(result), 2) self.assertNotEqual(result[0]['id'], result[1]['id']) self.assertTrue(all('height' not in f['properties'] and 'building:levels' not in f['properties'] for f in result)) if __name__ == '__main__': unittest.main()