forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			198 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			198 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
|  | import {Utils} from "../Utils"; | ||
|  | 
 | ||
|  | Utils.runningFromConsole = true; | ||
|  | import {equal} from "assert"; | ||
|  | import T from "./TestHelper"; | ||
|  | import {FromJSON} from "../Customizations/JSON/FromJSON"; | ||
|  | import Locale from "../UI/i18n/Locale"; | ||
|  | import Translations from "../UI/i18n/Translations"; | ||
|  | import {UIEventSource} from "../Logic/UIEventSource"; | ||
|  | import TagRenderingConfig from "../Customizations/JSON/TagRenderingConfig"; | ||
|  | import EditableTagRendering from "../UI/Popup/EditableTagRendering"; | ||
|  | import {Translation} from "../UI/i18n/Translation"; | ||
|  | import {OH, OpeningHour} from "../UI/OpeningHours/OpeningHours"; | ||
|  | import PublicHolidayInput from "../UI/OpeningHours/PublicHolidayInput"; | ||
|  | import {SubstitutedTranslation} from "../UI/SubstitutedTranslation"; | ||
|  | import {Tag} from "../Logic/Tags/Tag"; | ||
|  | import {And} from "../Logic/Tags/And"; | ||
|  | import * as Assert from "assert"; | ||
|  | import {GeoOperations} from "../Logic/GeoOperations"; | ||
|  | 
 | ||
|  | export default class GeoOperationsSpec extends T { | ||
|  | 
 | ||
|  |     private static polygon = { | ||
|  |         "type": "Feature", | ||
|  |         "properties": {}, | ||
|  |         "geometry": { | ||
|  |             "type": "Polygon", | ||
|  |             "coordinates": [ | ||
|  |                 [ | ||
|  |                     [ | ||
|  |                         1.8017578124999998, | ||
|  |                         50.401515322782366 | ||
|  |                     ], | ||
|  |                     [ | ||
|  |                         -3.1640625, | ||
|  |                         46.255846818480315 | ||
|  |                     ], | ||
|  |                     [ | ||
|  |                         5.185546875, | ||
|  |                         44.74673324024678 | ||
|  |                     ], | ||
|  |                     [ | ||
|  |                         1.8017578124999998, | ||
|  |                         50.401515322782366 | ||
|  |                     ] | ||
|  |                 ] | ||
|  |             ] | ||
|  |         } | ||
|  |     }; | ||
|  |     private static multiPolygon = { | ||
|  |         "type": "Feature", | ||
|  |         "properties": {}, | ||
|  |         "geometry": { | ||
|  |             "type": "MultiPolygon", | ||
|  |             "coordinates": [[ | ||
|  |                 [ | ||
|  |                     [ | ||
|  |                         1.8017578124999998, | ||
|  |                         50.401515322782366 | ||
|  |                     ], | ||
|  |                     [ | ||
|  |                         -3.1640625, | ||
|  |                         46.255846818480315 | ||
|  |                     ], | ||
|  |                     [ | ||
|  |                         5.185546875, | ||
|  |                         44.74673324024678 | ||
|  |                     ], | ||
|  |                     [ | ||
|  |                         1.8017578124999998, | ||
|  |                         50.401515322782366 | ||
|  |                     ] | ||
|  |                 ], | ||
|  |                 [ | ||
|  |                     [ | ||
|  |                         1.0107421875, | ||
|  |                         48.821332549646634 | ||
|  |                     ], | ||
|  |                     [ | ||
|  |                         1.329345703125, | ||
|  |                         48.25394114463431 | ||
|  |                     ], | ||
|  |                     [ | ||
|  |                         1.988525390625, | ||
|  |                         48.71271258145237 | ||
|  |                     ], | ||
|  |                     [ | ||
|  |                         0.999755859375, | ||
|  |                         48.86471476180277 | ||
|  |                     ], | ||
|  |                     [ | ||
|  |                         1.0107421875, | ||
|  |                         48.821332549646634 | ||
|  |                     ] | ||
|  |                 ] | ||
|  |             ]] | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     private static inHole = [1.42822265625, 48.61838518688487] | ||
|  |     private static inMultiPolygon = [2.515869140625, 47.37603463349758] | ||
|  |     private static outsidePolygon = [4.02099609375, 47.81315451752768] | ||
|  | 
 | ||
|  |     constructor() { | ||
|  |         super( | ||
|  |             "GeoOperationsSpec", [ | ||
|  |                 ["Point out of polygon", () => { | ||
|  |                     GeoOperationsSpec.isFalse(GeoOperations.inside([ | ||
|  |                         3.779296875, | ||
|  |                         48.777912755501845 | ||
|  |                     ], GeoOperationsSpec.polygon), "Point is outside of the polygon"); | ||
|  |                 } | ||
|  | 
 | ||
|  |                 ], | ||
|  |                 ["Point inside of polygon", () => { | ||
|  | 
 | ||
|  |                     GeoOperationsSpec.isTrue(GeoOperations.inside([ | ||
|  |                         1.23046875, | ||
|  |                         47.60616304386874 | ||
|  |                     ], GeoOperationsSpec.polygon), "Point is inside of the polygon"); | ||
|  |                 } | ||
|  |                 ], | ||
|  |                 ["MultiPolygonTest", () => { | ||
|  | 
 | ||
|  |                     const isTrue = GeoOperationsSpec.isTrue; | ||
|  |                     const isFalse = GeoOperationsSpec.isFalse; | ||
|  |                      | ||
|  |                     isFalse(GeoOperations.inside(GeoOperationsSpec.inHole, GeoOperationsSpec.multiPolygon), "InHole was detected as true"); | ||
|  |                     isTrue(GeoOperations.inside(GeoOperationsSpec.inMultiPolygon, GeoOperationsSpec.multiPolygon), "InMultiPolgyon was not detected as true"); | ||
|  |                     isFalse(GeoOperations.inside(GeoOperationsSpec.outsidePolygon, GeoOperationsSpec.multiPolygon), "OutsideOfPolygon was detected as true"); | ||
|  | 
 | ||
|  |                 }], | ||
|  |             ["Intersection between a line and a polygon", () => { | ||
|  |                 const line = { | ||
|  |                     "type": "Feature", | ||
|  |                     "properties": {}, | ||
|  |                     "geometry": { | ||
|  |                         "type": "LineString", | ||
|  |                         "coordinates": [ | ||
|  |                             [ | ||
|  |                                 3.779296875, | ||
|  |                                 48.777912755501845 | ||
|  |                             ], | ||
|  |                             [ | ||
|  |                                 1.23046875, | ||
|  |                                 47.60616304386874 | ||
|  |                             ] | ||
|  |                         ] | ||
|  |                     } | ||
|  |                 }; | ||
|  | 
 | ||
|  |                 const overlap = GeoOperations.calculateOverlap(line, [GeoOperationsSpec.polygon]); | ||
|  |                 Assert.equal(1, overlap.length) | ||
|  |             }], | ||
|  |             ["Fully enclosed", () => { | ||
|  |                 const line = { | ||
|  |                     "type": "Feature", | ||
|  |                     "properties": {}, | ||
|  |                     "geometry": { | ||
|  |                         "type": "LineString", | ||
|  |                         "coordinates": [ | ||
|  |                             [ | ||
|  |                                 0.0439453125, | ||
|  |                                 47.31648293428332 | ||
|  |                             ], | ||
|  |                             [ | ||
|  |                                 0.6591796875, | ||
|  |                                 46.77749276376827 | ||
|  |                             ] | ||
|  |                         ] | ||
|  |                     } | ||
|  |                 }; | ||
|  | 
 | ||
|  |                 const overlap = GeoOperations.calculateOverlap(line, [GeoOperationsSpec.polygon]); | ||
|  |                 Assert.equal(1, overlap.length) | ||
|  |             }], | ||
|  |             ["overlapWith matches points too", () => { | ||
|  |                 const point = { | ||
|  |                     "type": "Feature", | ||
|  |                     "properties": {}, | ||
|  |                     "geometry": { | ||
|  |                         "type": "Point", | ||
|  |                         "coordinates": [ | ||
|  |                             2.274169921875, | ||
|  |                             46.76244305208004 | ||
|  |                         ] | ||
|  |                     } | ||
|  |                 }; | ||
|  | 
 | ||
|  |                 const overlap = GeoOperations.calculateOverlap(point, [GeoOperationsSpec.polygon]); | ||
|  |                 Assert.equal(1, overlap.length) | ||
|  |             }] | ||
|  |     ] | ||
|  |     ) | ||
|  |          | ||
|  |     } | ||
|  | } |