forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			197 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			197 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)
 | 
						|
            }]
 | 
						|
    ]
 | 
						|
    )
 | 
						|
        
 | 
						|
    }
 | 
						|
}
 |