forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			219 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			219 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | import T from "./TestHelper"; | ||
|  | import CreateMultiPolygonWithPointReuseAction from "../Logic/Osm/Actions/CreateMultiPolygonWithPointReuseAction"; | ||
|  | import { Tag } from "../Logic/Tags/Tag"; | ||
|  | import FeaturePipelineState from "../Logic/State/FeaturePipelineState"; | ||
|  | import { Changes } from "../Logic/Osm/Changes"; | ||
|  | import {ChangesetHandler} from "../Logic/Osm/ChangesetHandler"; | ||
|  | import * as Assert from "assert"; | ||
|  | 
 | ||
|  | export default class ImportMultiPolygonSpec extends T { | ||
|  |      | ||
|  |     constructor() { | ||
|  |         super([ | ||
|  |             ["Correct changeset", | ||
|  |             async () => { | ||
|  | 
 | ||
|  |                 const feature = { | ||
|  |                     "type": "Feature", | ||
|  |                     "properties": { | ||
|  |                         "osm_id": "41097039", | ||
|  |                         "size_grb_building": "1374.89", | ||
|  |                         "addr:housenumber": "53", | ||
|  |                         "addr:street": "Startelstraat", | ||
|  |                         "building": "house", | ||
|  |                         "source:geometry:entity": "Gbg", | ||
|  |                         "source:geometry:date": "2014-04-28", | ||
|  |                         "source:geometry:oidn": "150044", | ||
|  |                         "source:geometry:uidn": "5403181", | ||
|  |                         "H_DTM_MIN": "50.35", | ||
|  |                         "H_DTM_GEM": "50.97", | ||
|  |                         "H_DSM_MAX": "59.40", | ||
|  |                         "H_DSM_P99": "59.09", | ||
|  |                         "HN_MAX": "8.43", | ||
|  |                         "HN_P99": "8.12", | ||
|  |                         "detection_method": "derived from OSM landuse: farmyard", | ||
|  |                         "auto_target_landuse": "farmyard", | ||
|  |                         "size_source_landuse": "8246.28", | ||
|  |                         "auto_building": "farm", | ||
|  |                         "id": "41097039", | ||
|  |                         "_lat": "50.84633355000016", | ||
|  |                         "_lon": "5.262964150000011", | ||
|  |                         "_layer": "grb", | ||
|  |                         "_length": "185.06002152312757", | ||
|  |                         "_length:km": "0.2", | ||
|  |                         "_now:date": "2022-02-22", | ||
|  |                         "_now:datetime": "2022-02-22 10:15:51", | ||
|  |                         "_loaded:date": "2022-02-22", | ||
|  |                         "_loaded:datetime": "2022-02-22 10:15:51", | ||
|  |                         "_geometry:type": "Polygon", | ||
|  |                         "_intersects_with_other_features": "", | ||
|  |                         "_country": "be", | ||
|  |                         "_overlaps_with_buildings": "[]", | ||
|  |                         "_overlap_percentage": "null", | ||
|  |                         "_grb_date": "2014-04-28", | ||
|  |                         "_grb_ref": "Gbg/150044", | ||
|  |                         "_building:min_level": "", | ||
|  |                         "_surface": "548.1242491529038", | ||
|  |                         "_surface:ha": "0", | ||
|  |                         "_reverse_overlap_percentage": "null", | ||
|  |                         "_imported_osm_object_found": "false", | ||
|  |                         "_imported_osm_still_fresh": "false", | ||
|  |                         "_target_building_type": "house" | ||
|  |                     }, | ||
|  |                     "geometry": { | ||
|  |                         "type": "Polygon", | ||
|  |                         "coordinates": <[number, number][][]>[ | ||
|  |                             [ | ||
|  |                                 [ | ||
|  |                                     5.262684300000043, | ||
|  |                                     50.84624409999995 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.262777500000024, | ||
|  |                                     50.84620759999988 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.262798899999998, | ||
|  |                                     50.84621390000019 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.262999799999994, | ||
|  |                                     50.84619519999999 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.263107500000007, | ||
|  |                                     50.84618920000014 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.263115, | ||
|  |                                     50.84620990000026 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.26310279999998, | ||
|  |                                     50.84623050000014 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.263117999999977, | ||
|  |                                     50.846247400000166 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.263174599999989, | ||
|  |                                     50.84631019999971 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.263166999999989, | ||
|  |                                     50.84631459999995 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.263243999999979, | ||
|  |                                     50.84640239999989 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.2631607000000065, | ||
|  |                                     50.84643459999996 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.26313309999997, | ||
|  |                                     50.84640089999985 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.262907499999996, | ||
|  |                                     50.84647790000018 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.2628939999999576, | ||
|  |                                     50.846463699999774 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.262872100000033, | ||
|  |                                     50.846440700000294 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.262784699999991, | ||
|  |                                     50.846348899999924 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.262684300000043, | ||
|  |                                     50.84624409999995 | ||
|  |                                 ] | ||
|  |                             ], | ||
|  |                             [ | ||
|  |                                 [ | ||
|  |                                     5.262801899999976, | ||
|  |                                     50.84623269999982 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.2629535000000285, | ||
|  |                                     50.84638830000012 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.263070700000018, | ||
|  |                                     50.84634720000008 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.262998000000025, | ||
|  |                                     50.84626279999982 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.263066799999966, | ||
|  |                                     50.84623959999975 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.263064000000004, | ||
|  |                                     50.84623330000007 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.263009599999997, | ||
|  |                                     50.84623730000026 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.263010199999956, | ||
|  |                                     50.84621629999986 | ||
|  |                                 ], | ||
|  |                                 [ | ||
|  |                                     5.262801899999976, | ||
|  |                                     50.84623269999982 | ||
|  |                                 ] | ||
|  |                             ] | ||
|  |                         ] | ||
|  |                     }, | ||
|  |                 } | ||
|  | 
 | ||
|  |                 const innerRings = [...feature.geometry.coordinates] | ||
|  |                 innerRings.splice(0, 1) | ||
|  | 
 | ||
|  |                 const action = new CreateMultiPolygonWithPointReuseAction( | ||
|  |                     [new Tag("building", "yes")], | ||
|  |                     feature.geometry.coordinates[0], | ||
|  |                     innerRings, | ||
|  |                     undefined, | ||
|  |                     [], | ||
|  |                     "import" | ||
|  |                 ) | ||
|  |                 const descriptions = await action.Perform(new Changes()) | ||
|  | 
 | ||
|  |                 function getCoor(id: number): {lat: number, lon:number} { | ||
|  |                     return <any> descriptions.find(d => d.type === "node" && d.id === id).changes | ||
|  |                 } | ||
|  |                  | ||
|  |                 const ways= descriptions.filter(d => d.type === "way") | ||
|  |                 T.isTrue(ways[0].id == -18, "unexpected id") | ||
|  |                 T.isTrue(ways[1].id == -27, "unexpected id") | ||
|  |                 const outer = ways[0].changes["coordinates"] | ||
|  |                 const outerExpected =    [[5.262684300000043,50.84624409999995],[5.262777500000024,50.84620759999988],[5.262798899999998,50.84621390000019],[5.262999799999994,50.84619519999999],[5.263107500000007,50.84618920000014],[5.263115,50.84620990000026],[5.26310279999998,50.84623050000014],[5.263117999999977,50.846247400000166],[5.263174599999989,50.84631019999971],[5.263166999999989,50.84631459999995],[5.263243999999979,50.84640239999989],[5.2631607000000065,50.84643459999996],[5.26313309999997,50.84640089999985],[5.262907499999996,50.84647790000018],[5.2628939999999576,50.846463699999774],[5.262872100000033,50.846440700000294],[5.262784699999991,50.846348899999924],[5.262684300000043,50.84624409999995]] | ||
|  |                 T.listIdentical(feature.geometry.coordinates[0], outer) | ||
|  |                 const inner = ways[1].changes["coordinates"] | ||
|  |                 T.listIdentical(feature.geometry.coordinates[1], inner) | ||
|  |                 const members = <{type: string, role: string, ref: number}[]> descriptions.find(d => d.type === "relation").changes["members"] | ||
|  |                 T.isTrue(members[0].role == "outer", "incorrect role") | ||
|  |                 T.isTrue(members[1].role == "inner", "incorrect role") | ||
|  |                 T.isTrue(members[0].type == "way", "incorrect type") | ||
|  |                 T.isTrue(members[1].type == "way", "incorrect type") | ||
|  |                 T.isTrue(members[0].ref == -18, "incorrect id") | ||
|  |                 T.isTrue(members[1].ref == -27, "incorrect id") | ||
|  |         }] | ||
|  |         ]); | ||
|  |     } | ||
|  |      | ||
|  |      | ||
|  | } |