| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.lucene.spatial3d.geom; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| |
| import org.junit.Test; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertTrue; |
| |
| /** |
| * Check relationship between polygon and GeoShapes of basic polygons. Normally we construct |
| * the convex, concave counterpart and the convex polygon as a complex polygon. |
| */ |
| public class SimpleGeoPolygonRelationshipsTest { |
| |
| /** |
| * Test with two shapes with no crossing edges and no points in common in convex case. |
| */ |
| @Test |
| public void testGeoSimplePolygon1() { |
| |
| //POLYGON ((19.845091 -60.452631, 20.119948 -61.655652, 23.207901 -61.453298, 22.820804 -60.257713, 19.845091 -60.452631)) disjoint |
| GeoPolygon originalConvexPol = buildConvexGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| GeoPolygon originalConcavePol = buildConcaveGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| GeoPolygon originalComplexPol = buildComplexGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| GeoPolygon polConvex = buildConvexGeoPolygon(20.0, -60.4, |
| 20.1, -60.4, |
| 20.1, -60.3, |
| 20.0, -60.3); |
| |
| GeoPolygon polConcave = buildConcaveGeoPolygon(20.0, -60.4, |
| 20.1, -60.4, |
| 20.1, -60.3, |
| 20.0, -60.3); |
| |
| |
| //Convex |
| int rel = originalConvexPol.getRelationship(polConvex); |
| assertEquals(GeoArea.DISJOINT, rel); |
| rel = polConvex.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.DISJOINT, rel); |
| |
| rel = originalConvexPol.getRelationship(polConcave); |
| assertEquals(GeoArea.CONTAINS, rel); |
| rel = polConcave.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.WITHIN, rel);//Check |
| |
| //Concave |
| rel = originalConcavePol.getRelationship(polConvex); |
| assertEquals(GeoArea.WITHIN, rel); |
| rel = polConvex.getRelationship(originalConcavePol); |
| assertEquals(GeoArea.CONTAINS, rel); |
| |
| rel = originalConcavePol.getRelationship(polConcave); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(originalConcavePol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| //Complex |
| rel = originalComplexPol.getRelationship(polConvex); |
| assertEquals(GeoArea.DISJOINT, rel); |
| rel = polConvex.getRelationship(originalComplexPol); |
| assertEquals(GeoArea.DISJOINT, rel); |
| |
| rel = originalComplexPol.getRelationship(polConcave); |
| assertEquals(GeoArea.CONTAINS, rel); |
| rel = polConcave.getRelationship(originalComplexPol); |
| assertEquals(GeoArea.WITHIN, rel); |
| } |
| |
| |
| /** |
| * Test with two shapes with crossing edges and some points inside in convex case. |
| */ |
| @Test |
| public void testGeoSimplePolygon2() { |
| |
| //POLYGON ((19.845091 -60.452631, 20.119948 -61.655652, 23.207901 -61.453298, 22.820804 -60.257713, 19.845091 -60.452631)) disjoint |
| GeoPolygon originalConvexPol = buildConvexGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| GeoPolygon originalConcavePol = buildConcaveGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| GeoPolygon originalComplexPol = buildComplexGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| //POLYGON ((20.0 -60.4, 23.1 -60.4, 23.1 -60.3, 20.0 -60.3,20.0 -60.4)) |
| GeoPolygon polConvex = buildConvexGeoPolygon(20.0, -60.4, |
| 23.1, -60.4, |
| 23.1, -60.3, |
| 20.0, -60.3); |
| |
| GeoPolygon polConcave = buildConcaveGeoPolygon(20.0, -60.4, |
| 23.1, -60.4, |
| 23.1, -60.3, |
| 20.0, -60.3); |
| |
| //Convex |
| int rel = originalConvexPol.getRelationship(polConvex); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConvex.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| rel = originalConvexPol.getRelationship(polConcave); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| //Concave |
| rel = originalConcavePol.getRelationship(polConcave); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(originalConcavePol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| |
| rel = originalConcavePol.getRelationship(polConvex); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConvex.getRelationship(originalConcavePol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| //Complex |
| rel = originalComplexPol.getRelationship(polConcave); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(originalComplexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| |
| rel = originalComplexPol.getRelationship(polConvex); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConvex.getRelationship(originalComplexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| } |
| |
| /** |
| * Test with two shapes with no crossing edges and all points inside in convex case. |
| */ |
| @Test |
| public void testGeoSimplePolygon3() { |
| |
| //POLYGON ((19.845091 -60.452631, 20.119948 -61.655652, 23.207901 -61.453298, 22.820804 -60.257713, 19.845091 -60.452631)) disjoint |
| GeoPolygon originalConvexPol = buildConvexGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| GeoPolygon originalConcavePol = buildConcaveGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| GeoPolygon originalComplexPol = buildComplexGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| //POLYGON ((20.0 -61.1, 20.1 -61.1, 20.1 -60.5, 20.0 -60.5,20.0 -61.1)) |
| GeoPolygon polConvex = buildConvexGeoPolygon(20.0, -61.1, |
| 20.1, -61.1, |
| 20.1, -60.5, |
| 20.0, -60.5); |
| |
| GeoPolygon polConcave = buildConcaveGeoPolygon(20.0, -61.1, |
| 20.1, -61.1, |
| 20.1, -60.5, |
| 20.0, -60.5); |
| |
| //Convex |
| int rel = originalConvexPol.getRelationship(polConvex); |
| assertEquals(GeoArea.WITHIN, rel); |
| rel = polConvex.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.CONTAINS, rel); |
| |
| rel = originalConvexPol.getRelationship(polConcave); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| //Concave |
| rel = originalConcavePol.getRelationship(polConcave); |
| assertEquals(GeoArea.CONTAINS, rel); |
| rel = polConcave.getRelationship(originalConcavePol); |
| assertEquals(GeoArea.WITHIN, rel);//check |
| |
| rel = originalConcavePol.getRelationship(polConvex); |
| assertEquals(GeoArea.DISJOINT, rel); |
| rel = polConvex.getRelationship(originalConcavePol); |
| assertEquals(GeoArea.DISJOINT, rel); |
| |
| //Complex |
| rel = originalComplexPol.getRelationship(polConvex); |
| assertEquals(GeoArea.WITHIN, rel); |
| rel = polConvex.getRelationship(originalComplexPol); |
| assertEquals(GeoArea.CONTAINS, rel); |
| |
| rel = originalComplexPol.getRelationship(polConcave); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(originalComplexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| } |
| |
| /** |
| * Test with two shapes with crossing edges and no points inside in convex case. |
| */ |
| @Test |
| public void testGeoSimplePolygon4() { |
| //POLYGON ((19.845091 -60.452631, 20.119948 -61.655652, 23.207901 -61.453298, 22.820804 -60.257713, 19.845091 -60.452631)) disjoint |
| GeoPolygon originalConvexPol = buildConvexGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| GeoPolygon originalConcavePol = buildConcaveGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| GeoPolygon originalComplexPol = buildComplexGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| //POLYGON ((20.0 -62.4, 20.1 -62.4, 20.1 -60.3, 20.0 -60.3,20.0 -62.4)) intersects no points inside |
| GeoPolygon polConvex = buildConvexGeoPolygon(20.0, -62.4, |
| 20.1, -62.4, |
| 20.1, -60.3, |
| 20.0, -60.3); |
| |
| GeoPolygon polConcave = buildConcaveGeoPolygon(20.0, -62.4, |
| 20.1, -62.4, |
| 20.1, -60.3, |
| 20.0, -60.3); |
| |
| //Convex |
| int rel = originalConvexPol.getRelationship(polConvex); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConvex.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| rel = originalConvexPol.getRelationship(polConcave); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| //concave |
| rel = originalConcavePol.getRelationship(polConcave); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(originalConcavePol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| rel = originalConcavePol.getRelationship(polConvex); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConvex.getRelationship(originalConcavePol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| //Complex |
| rel = originalComplexPol.getRelationship(polConvex); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConvex.getRelationship(originalComplexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| rel = originalComplexPol.getRelationship(polConcave); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(originalComplexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| } |
| |
| /** |
| * Test with two shapes with no crossing edges and polygon in hole in convex case. |
| */ |
| @Test |
| public void testGeoSimplePolygonWithHole1() { |
| //POLYGON((-135 -31, -135 -30, -137 -30, -137 -31, -135 -31),(-135.5 -30.7, -135.5 -30.4, -136.5 -30.4, -136.5 -30.7, -135.5 -30.7)) |
| GeoPolygon hole = buildConcaveGeoPolygon(-135.5, -30.7, |
| -135.5, -30.4, |
| -136.5, -30.4, |
| -136.5, -30.7); |
| GeoPolygon originalConvexPol = buildConvexGeoPolygonWithHole(-135, -31, |
| -135, -30, |
| -137, -30, |
| -137, -31, hole); |
| |
| GeoPolygon holeInv = buildConvexGeoPolygon(-135, -31, |
| -135, -30, |
| -137, -30, |
| -137, -31); |
| |
| GeoPolygon originalConvexPolInv = buildConcaveGeoPolygonWithHole(-135.5, -30.7, |
| -135.5, -30.4, |
| -136.5, -30.4, |
| -136.5, -30.7, holeInv); |
| |
| //POLYGON((-135.7 -30.6, -135.7 -30.45, -136 -30.45, -136 -30.6, -135.7 -30.6)) in the hole |
| GeoPolygon polConvex = buildConvexGeoPolygon(-135.7, -30.6, |
| -135.7, -30.45, |
| -136, -30.45, |
| -136, -30.6); |
| |
| GeoPolygon polConcave = buildConcaveGeoPolygon(-135.7, -30.6, |
| -135.7, -30.45, |
| -136, -30.45, |
| -136, -30.6); |
| |
| int rel = originalConvexPol.getRelationship(polConvex); |
| assertEquals(GeoArea.DISJOINT, rel); |
| rel = polConvex.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.DISJOINT, rel); |
| |
| rel = originalConvexPol.getRelationship(polConcave); |
| assertEquals(GeoArea.CONTAINS, rel); |
| rel = polConcave.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.WITHIN, rel); |
| |
| rel = originalConvexPolInv.getRelationship(polConvex); |
| assertEquals(GeoArea.DISJOINT, rel); |
| rel = polConvex.getRelationship(originalConvexPolInv); |
| assertEquals(GeoArea.DISJOINT, rel); |
| |
| rel = originalConvexPolInv.getRelationship(polConcave); |
| assertEquals(GeoArea.CONTAINS, rel); |
| rel = polConcave.getRelationship(originalConvexPolInv); |
| assertEquals(GeoArea.WITHIN, rel); |
| } |
| |
| /** |
| * Test with two shapes with crossing edges in hole and some points inside in convex case. |
| */ |
| @Test |
| public void testGeoSimplePolygonWithHole2() { |
| //POLYGON((-135 -31, -135 -30, -137 -30, -137 -31, -135 -31),(-135.5 -30.7, -135.5 -30.4, -136.5 -30.4, -136.5 -30.7, -135.5 -30.7)) |
| GeoPolygon hole = buildConcaveGeoPolygon(-135.5, -30.7, |
| -135.5, -30.4, |
| -136.5, -30.4, |
| -136.5, -30.7); |
| GeoPolygon originalConvexPol = buildConvexGeoPolygonWithHole(-135, -31, |
| -135, -30, |
| -137, -30, |
| -137, -31, hole); |
| |
| GeoPolygon holeInv = buildConvexGeoPolygon(-135, -31, |
| -135, -30, |
| -137, -30, |
| -137, -31); |
| |
| GeoPolygon originalConvexPolInv = buildConcaveGeoPolygonWithHole(-135.5, -30.7, |
| -135.5, -30.4, |
| -136.5, -30.4, |
| -136.5, -30.7, holeInv); |
| |
| //POLYGON((-135.5 -31.2, -135.5 -30.8, -136 -30.8, -136 -31.2, -135.5 -31.2)) intersects the hole |
| GeoPolygon polConvex = buildConvexGeoPolygon(-135.5, -30.2, |
| -135.5, -30.8, |
| -136, -30.8, |
| -136, -30.2); |
| |
| GeoPolygon polConcave = buildConcaveGeoPolygon(-135.5, -30.2, |
| -135.5, -30.8, |
| -136, -30.8, |
| -136, -30.2); |
| |
| int rel = originalConvexPol.getRelationship(polConvex); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConvex.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| rel = originalConvexPol.getRelationship(polConcave); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| rel = originalConvexPolInv.getRelationship(polConvex); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConvex.getRelationship(originalConvexPolInv); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| rel = originalConvexPolInv.getRelationship(polConcave); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(originalConvexPolInv); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| } |
| |
| /** |
| * Test with two shapes with crossing edges and some points inside in convex case. |
| */ |
| @Test |
| public void testGeoSimplePolygonWithHole3() { |
| //POLYGON((-135 -31, -135 -30, -137 -30, -137 -31, -135 -31),(-135.5 -30.7, -135.5 -30.4, -136.5 -30.4, -136.5 -30.7, -135.5 -30.7)) |
| GeoPolygon hole = buildConcaveGeoPolygon(-135.5, -30.7, |
| -135.5, -30.4, |
| -136.5, -30.4, |
| -136.5, -30.7); |
| GeoPolygon originalConvexPol = buildConvexGeoPolygonWithHole(-135, -31, |
| -135, -30, |
| -137, -30, |
| -137, -31, hole); |
| |
| GeoPolygon holeInv = buildConvexGeoPolygon(-135, -31, |
| -135, -30, |
| -137, -30, |
| -137, -31); |
| |
| GeoPolygon originalConvexPolInv = buildConcaveGeoPolygonWithHole(-135.5, -30.7, |
| -135.5, -30.4, |
| -136.5, -30.4, |
| -136.5, -30.7, holeInv); |
| |
| //POLYGON((-135.2 -30.8, -135.2 -30.2, -136.8 -30.2, -136.8 -30.8, -135.2 -30.8)) inside the polygon covering the hole |
| GeoPolygon polConvex = buildConvexGeoPolygon(-135.2, -30.8, |
| -135.2, -30.3, |
| -136.8, -30.2, |
| -136.8, -30.8); |
| |
| GeoPolygon polConcave = buildConcaveGeoPolygon(-135.2, -30.8, |
| -135.2, -30.3, |
| -136.8, -30.2, |
| -136.8, -30.8); |
| |
| int rel = originalConvexPol.getRelationship(polConvex); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConvex.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| rel = originalConvexPol.getRelationship(polConcave); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| rel = originalConvexPolInv.getRelationship(polConvex); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConvex.getRelationship(originalConvexPolInv); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| rel = originalConvexPolInv.getRelationship(polConcave); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(originalConvexPolInv); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| } |
| |
| /** |
| * Test with two shapes with no crossing edges and all points inside in convex case. |
| */ |
| @Test |
| public void testGeoSimplePolygonWithHole4() { |
| //POLYGON((-135 -31, -135 -30, -137 -30, -137 -31, -135 -31),(-135.5 -30.7, -135.5 -30.4, -136.5 -30.4, -136.5 -30.7, -135.5 -30.7)) |
| GeoPolygon hole = buildConcaveGeoPolygon(-135.5, -30.7, |
| -135.5, -30.4, |
| -136.5, -30.4, |
| -136.5, -30.7); |
| GeoPolygon originalConvexPol = buildConvexGeoPolygonWithHole(-135, -31, |
| -135, -30, |
| -137, -30, |
| -137, -31, hole); |
| |
| GeoPolygon holeInv = buildConvexGeoPolygon(-135, -31, |
| -135, -30, |
| -137, -30, |
| -137, -31); |
| |
| GeoPolygon originalConvexPolInv = buildConcaveGeoPolygonWithHole(-135.5, -30.7, |
| -135.5, -30.4, |
| -136.5, -30.4, |
| -136.5, -30.7, holeInv); |
| |
| // POLYGON((-135.7 -30.3, -135.7 -30.2, -136 -30.2, -136 -30.3, -135.7 -30.3))inside the polygon |
| GeoPolygon polConvex = buildConvexGeoPolygon(-135.7, -30.3, |
| -135.7, -30.2, |
| -136, -30.2, |
| -136, -30.3); |
| |
| GeoPolygon polConcave = buildConcaveGeoPolygon(-135.7, -30.3, |
| -135.7, -30.2, |
| -136, -30.2, |
| -136, -30.3); |
| |
| int rel = originalConvexPol.getRelationship(polConvex); |
| assertEquals(GeoArea.WITHIN, rel); |
| rel = polConvex.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.CONTAINS, rel); |
| |
| rel = originalConvexPol.getRelationship(polConcave); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| rel = originalConvexPolInv.getRelationship(polConvex); |
| assertEquals(GeoArea.WITHIN, rel); |
| rel = polConvex.getRelationship(originalConvexPolInv); |
| assertEquals(GeoArea.CONTAINS, rel); |
| |
| rel = originalConvexPolInv.getRelationship(polConcave); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(originalConvexPolInv); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| } |
| |
| @Test |
| public void testGeoSimplePolygonWithCircle() { |
| //POLYGON ((19.845091 -60.452631, 20.119948 -61.655652, 23.207901 -61.453298, 22.820804 -60.257713, 19.845091 -60.452631)) disjoint |
| GeoPolygon originalConvexPol = buildConvexGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| GeoPolygon originalConcavePol = buildConcaveGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| GeoPolygon originalComplexPol = buildComplexGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| GeoCircle outCircle = GeoCircleFactory.makeGeoCircle(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-70), Geo3DUtil.fromDegrees(23), Geo3DUtil.fromDegrees(1)); |
| int rel = originalConvexPol.getRelationship(outCircle); |
| assertEquals(GeoArea.DISJOINT, rel); |
| rel = originalConcavePol.getRelationship(outCircle); |
| assertEquals(GeoArea.WITHIN, rel); |
| rel = originalComplexPol.getRelationship(outCircle); |
| assertEquals(GeoArea.DISJOINT, rel); |
| |
| GeoCircle overlapCircle = GeoCircleFactory.makeGeoCircle(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-61.5), Geo3DUtil.fromDegrees(20), Geo3DUtil.fromDegrees(1)); |
| rel = originalConvexPol.getRelationship(overlapCircle); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = originalConcavePol.getRelationship(overlapCircle); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = originalComplexPol.getRelationship(overlapCircle); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| GeoCircle inCircle = GeoCircleFactory.makeGeoCircle(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-61), Geo3DUtil.fromDegrees(21), Geo3DUtil.fromDegrees(0.1)); |
| rel = originalConvexPol.getRelationship(inCircle); |
| assertEquals(GeoArea.WITHIN, rel); |
| rel = originalConcavePol.getRelationship(inCircle); |
| assertEquals(GeoArea.DISJOINT, rel); |
| rel = originalComplexPol.getRelationship(inCircle); |
| assertEquals(GeoArea.WITHIN, rel); |
| |
| GeoCircle onCircle = GeoCircleFactory.makeGeoCircle(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-61), Geo3DUtil.fromDegrees(21), Geo3DUtil.fromDegrees(10.)); |
| rel = originalConvexPol.getRelationship(onCircle); |
| assertEquals(GeoArea.CONTAINS, rel); |
| rel = originalConcavePol.getRelationship(onCircle); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = originalComplexPol.getRelationship(onCircle); |
| assertEquals(GeoArea.CONTAINS, rel); |
| } |
| |
| @Test |
| public void testGeoSimplePolygonWithBBox() { |
| //POLYGON ((19.845091 -60.452631, 20.119948 -61.655652, 23.207901 -61.453298, 22.820804 -60.257713, 19.845091 -60.452631)) disjoint |
| GeoPolygon originalConvexPol = buildConvexGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| GeoPolygon originalConcavePol = buildConcaveGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| GeoPolygon originalComplexPol = buildComplexGeoPolygon(19.84509, -60.452631, |
| 20.119948, -61.655652, |
| 23.207901, -61.453298, |
| 22.820804, -60.257713); |
| |
| GeoBBox outRectangle = GeoBBoxFactory.makeGeoBBox(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-69), |
| Geo3DUtil.fromDegrees(-70), |
| Geo3DUtil.fromDegrees(22), |
| Geo3DUtil.fromDegrees(23)); |
| int rel = originalConvexPol.getRelationship(outRectangle); |
| assertEquals(GeoArea.DISJOINT, rel); |
| rel = outRectangle.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.DISJOINT, rel); |
| rel = originalConcavePol.getRelationship(outRectangle); |
| assertEquals(GeoArea.WITHIN, rel); |
| rel = originalComplexPol.getRelationship(outRectangle); |
| assertEquals(GeoArea.DISJOINT, rel); |
| |
| GeoBBox overlapRectangle = GeoBBoxFactory.makeGeoBBox(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-61), |
| Geo3DUtil.fromDegrees(-62), |
| Geo3DUtil.fromDegrees(22), |
| Geo3DUtil.fromDegrees(23)); |
| rel = originalConvexPol.getRelationship(overlapRectangle); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = overlapRectangle.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = originalConcavePol.getRelationship(overlapRectangle); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = originalComplexPol.getRelationship(overlapRectangle); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| GeoBBox inRectangle = GeoBBoxFactory.makeGeoBBox(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-61), |
| Geo3DUtil.fromDegrees(-61.1), |
| Geo3DUtil.fromDegrees(22.5), |
| Geo3DUtil.fromDegrees(23)); |
| rel = originalConvexPol.getRelationship(inRectangle); |
| assertEquals(GeoArea.WITHIN, rel); |
| rel = inRectangle.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.CONTAINS, rel); |
| rel = originalConcavePol.getRelationship(inRectangle); |
| assertEquals(GeoArea.DISJOINT, rel); |
| rel = originalComplexPol.getRelationship(inRectangle); |
| assertEquals(GeoArea.WITHIN, rel); |
| |
| GeoBBox onRectangle = GeoBBoxFactory.makeGeoBBox(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-59), |
| Geo3DUtil.fromDegrees(-64.1), |
| Geo3DUtil.fromDegrees(18.5), |
| Geo3DUtil.fromDegrees(27)); |
| rel = originalConvexPol.getRelationship(onRectangle); |
| assertEquals(GeoArea.CONTAINS, rel); |
| rel = onRectangle.getRelationship(originalConvexPol); |
| assertEquals(GeoArea.WITHIN, rel); |
| rel = originalConcavePol.getRelationship(onRectangle); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = originalComplexPol.getRelationship(onRectangle); |
| assertEquals(GeoArea.CONTAINS, rel); |
| |
| } |
| |
| @Test |
| public void testGeoSimplePolygonWithComposite() { |
| GeoShape shape = getCompositeShape(); |
| |
| //POLYGON((-145.8555 -5.13, -145.8540 -5.13, -145.8540 -5.12, -145.8555 -5.12, -145.8555 -5.13)) |
| GeoPolygon polConvex = buildConvexGeoPolygon(-145.8555, -5.13, |
| -145.8540, -5.13, |
| -145.8540, -5.12, |
| -145.8555, -5.12); |
| |
| GeoPolygon polConcave = buildConcaveGeoPolygon(-145.8555, -5.13, |
| -145.8540, -5.13, |
| -145.8540, -5.12, |
| -145.8555, -5.12); |
| |
| int rel = polConvex.getRelationship(shape); |
| assertEquals(GeoArea.DISJOINT, rel); |
| rel = polConcave.getRelationship(shape); |
| assertEquals(GeoArea.WITHIN, rel); |
| |
| //POLYGON((-145.8555 -5.13, -145.85 -5.13, -145.85 -5.12, -145.8555 -5.12, -145.8555 -5.13)) |
| polConvex = buildConvexGeoPolygon(-145.8555, -5.13, |
| -145.85, -5.13, |
| -145.85, -5.12, |
| -145.8555, -5.12); |
| |
| polConcave = buildConcaveGeoPolygon(-145.8555, -5.13, |
| -145.85, -5.13, |
| -145.85, -5.12, |
| -145.8555, -5.12); |
| |
| rel = polConvex.getRelationship(shape); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(shape); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| //POLYGON((-146 -5.18, -145.854 -5.18, -145.854 -5.11, -146 -5.11, -146 -5.18)) |
| //Case overlaping on of the shapes |
| polConvex = buildConvexGeoPolygon(-146, -5.18, |
| -145.854, -5.18, |
| -145.854, -5.11, |
| -146, -5.11); |
| |
| polConcave = buildConcaveGeoPolygon(-146, -5.18, |
| -145.854, -5.18, |
| -145.854, -5.11, |
| -146, -5.11); |
| |
| rel = polConvex.getRelationship(shape); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = polConcave.getRelationship(shape); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| |
| //POLYGON((-145.88 -5.13, -145.87 -5.13, -145.87 -5.12, -145.88 -5.12, -145.88 -5.13)) |
| polConvex = buildConvexGeoPolygon(-145.88, -5.13, |
| -145.87, -5.13, |
| -145.87, -5.12, |
| -145.88, -5.12); |
| |
| polConcave = buildConcaveGeoPolygon(-145.88, -5.13, |
| -145.87, -5.13, |
| -145.87, -5.12, |
| -145.88, -5.12); |
| |
| rel = polConvex.getRelationship(shape); |
| assertEquals(GeoArea.CONTAINS, rel); |
| rel = polConcave.getRelationship(shape); |
| assertEquals(GeoArea.OVERLAPS, rel); |
| } |
| |
| @Test |
| public void testDegeneratedPointIntersectShape(){ |
| GeoBBox bBox1 = GeoBBoxFactory.makeGeoBBox(PlanetModel.SPHERE, 1,0,0,1); |
| GeoBBox bBox2 = GeoBBoxFactory.makeGeoBBox(PlanetModel.SPHERE, 1,1,1,1); |
| int rel = bBox1.getRelationship(bBox2); |
| //OVERLAPS instead of WITHIN. In this case the degenerated point lies on the edge of the shape. |
| //intersects() returns true for one plane of the BBox and hence method return OVERLAPS. |
| assertEquals(GeoArea.OVERLAPS, rel); |
| rel = bBox2.getRelationship(bBox1); |
| // The degenerated point cannot compute if it is on the edge. Uses WITHIN that is true |
| // and therefore CONTAINS |
| assertEquals(GeoArea.CONTAINS, rel); |
| } |
| |
| @Test |
| public void testDegeneratedPointInPole(){ |
| GeoBBox bBox1 = GeoBBoxFactory.makeGeoBBox(PlanetModel.SPHERE, Math.PI*0.5, Math.PI*0.5, 0, 0); |
| GeoPoint point = new GeoPoint(PlanetModel.SPHERE, Math.PI*0.5, Math.PI); |
| System.out.println("bbox1 = "+bBox1+"; point = "+point); |
| assertTrue(bBox1.isWithin(point)); |
| } |
| |
| @Test |
| public void testDegeneratePathShape(){ |
| GeoPoint point1 = new GeoPoint(PlanetModel.SPHERE, 0, 0); |
| GeoPoint point2 = new GeoPoint(PlanetModel.SPHERE, 0, 1); |
| GeoPoint[] pointPath1 = new GeoPoint[] {point1, point2}; |
| GeoPath path1 = GeoPathFactory.makeGeoPath(PlanetModel.SPHERE, 0, pointPath1); |
| GeoPath path2 = GeoPathFactory.makeGeoPath(PlanetModel.SPHERE, 1, pointPath1); |
| int rel = path1.getRelationship(path2); |
| //if an end point is inside the shape it will always return intersects |
| assertEquals(GeoArea.CONTAINS, rel); //should be contains? |
| rel = path2.getRelationship(path1); |
| assertEquals(GeoArea.WITHIN, rel); |
| } |
| |
| |
| private GeoPolygon buildConvexGeoPolygon(double lon1, double lat1, |
| double lon2, double lat2, |
| double lon3, double lat3, |
| double lon4, double lat4) { |
| GeoPoint point1 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat1), Geo3DUtil.fromDegrees(lon1)); |
| GeoPoint point2 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat2), Geo3DUtil.fromDegrees(lon2)); |
| GeoPoint point3 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat3), Geo3DUtil.fromDegrees(lon3)); |
| GeoPoint point4 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat4), Geo3DUtil.fromDegrees(lon4)); |
| final List<GeoPoint> points = new ArrayList<>(); |
| points.add(point1); |
| points.add(point2); |
| points.add(point3); |
| points.add(point4); |
| return GeoPolygonFactory.makeGeoPolygon(PlanetModel.SPHERE, points); |
| } |
| |
| private GeoPolygon buildConcaveGeoPolygon(double lon1, double lat1, |
| double lon2, double lat2, |
| double lon3, double lat3, |
| double lon4, double lat4) { |
| GeoPoint point1 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat1), Geo3DUtil.fromDegrees(lon1)); |
| GeoPoint point2 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat2), Geo3DUtil.fromDegrees(lon2)); |
| GeoPoint point3 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat3), Geo3DUtil.fromDegrees(lon3)); |
| GeoPoint point4 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat4), Geo3DUtil.fromDegrees(lon4)); |
| final List<GeoPoint> points = new ArrayList<>(); |
| points.add(point1); |
| points.add(point2); |
| points.add(point3); |
| points.add(point4); |
| return GeoPolygonFactory.makeGeoConcavePolygon(PlanetModel.SPHERE, points); |
| } |
| |
| private GeoPolygon buildComplexGeoPolygon(double lon1, double lat1, |
| double lon2, double lat2, |
| double lon3, double lat3, |
| double lon4, double lat4) { |
| GeoPoint point1 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat1), Geo3DUtil.fromDegrees(lon1)); |
| GeoPoint point2 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat2), Geo3DUtil.fromDegrees(lon2)); |
| GeoPoint point3 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat3), Geo3DUtil.fromDegrees(lon3)); |
| GeoPoint point4 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat4), Geo3DUtil.fromDegrees(lon4)); |
| final List<GeoPoint> points = new ArrayList<>(); |
| points.add(point1); |
| points.add(point2); |
| points.add(point3); |
| points.add(point4); |
| GeoPolygonFactory.PolygonDescription pd = new GeoPolygonFactory.PolygonDescription(points); |
| return GeoPolygonFactory.makeLargeGeoPolygon(PlanetModel.SPHERE, Collections.singletonList(pd)); |
| } |
| |
| private GeoPolygon buildConvexGeoPolygonWithHole(double lon1, double lat1, |
| double lon2, double lat2, |
| double lon3, double lat3, |
| double lon4, double lat4, |
| GeoPolygon hole) { |
| GeoPoint point1 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat1), Geo3DUtil.fromDegrees(lon1)); |
| GeoPoint point2 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat2), Geo3DUtil.fromDegrees(lon2)); |
| GeoPoint point3 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat3), Geo3DUtil.fromDegrees(lon3)); |
| GeoPoint point4 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat4), Geo3DUtil.fromDegrees(lon4)); |
| final List<GeoPoint> points = new ArrayList<>(); |
| points.add(point1); |
| points.add(point2); |
| points.add(point3); |
| points.add(point4); |
| //return new GeoConvexPolygon(PlanetModel.SPHERE,points, Collections.singletonList(hole)); |
| return GeoPolygonFactory.makeGeoPolygon(PlanetModel.SPHERE, points, Collections.singletonList(hole)); |
| } |
| |
| private GeoPolygon buildConcaveGeoPolygonWithHole(double lon1, double lat1, |
| double lon2, double lat2, |
| double lon3, double lat3, |
| double lon4, double lat4, |
| GeoPolygon hole) { |
| GeoPoint point1 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat1), Geo3DUtil.fromDegrees(lon1)); |
| GeoPoint point2 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat2), Geo3DUtil.fromDegrees(lon2)); |
| GeoPoint point3 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat3), Geo3DUtil.fromDegrees(lon3)); |
| GeoPoint point4 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(lat4), Geo3DUtil.fromDegrees(lon4)); |
| final List<GeoPoint> points = new ArrayList<>(); |
| points.add(point1); |
| points.add(point2); |
| points.add(point3); |
| points.add(point4); |
| return GeoPolygonFactory.makeGeoConcavePolygon(PlanetModel.SPHERE, points, Collections.singletonList(hole)); |
| } |
| |
| private GeoShape getCompositeShape(){ |
| //MULTIPOLYGON(((-145.790967486 -5.17543698881, -145.790854979 -5.11348060995, -145.853073512 -5.11339421216, -145.853192037 -5.17535061936, -145.790967486 -5.17543698881)), |
| //((-145.8563923 -5.17527125408, -145.856222168 -5.11332154814, -145.918433943 -5.11317773171, -145.918610092 -5.17512738429, -145.8563923 -5.17527125408))) |
| GeoPoint point1 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-5.17543698881), Geo3DUtil.fromDegrees(-145.790967486)); |
| GeoPoint point2 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-5.11348060995), Geo3DUtil.fromDegrees(-145.790854979)); |
| GeoPoint point3 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-5.11339421216), Geo3DUtil.fromDegrees(-145.853073512)); |
| GeoPoint point4 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-5.17535061936), Geo3DUtil.fromDegrees(-145.853192037)); |
| final List<GeoPoint> points1 = new ArrayList<>(); |
| points1.add(point1); |
| points1.add(point2); |
| points1.add(point3); |
| points1.add(point4); |
| GeoPolygon pol1 = GeoPolygonFactory.makeGeoPolygon(PlanetModel.SPHERE,points1); |
| GeoPoint point5 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-5.17527125408), Geo3DUtil.fromDegrees(-145.8563923)); |
| GeoPoint point6 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-5.11332154814), Geo3DUtil.fromDegrees(-145.856222168)); |
| GeoPoint point7 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-5.11317773171), Geo3DUtil.fromDegrees(-145.918433943)); |
| GeoPoint point8 = new GeoPoint(PlanetModel.SPHERE, Geo3DUtil.fromDegrees(-5.17512738429), Geo3DUtil.fromDegrees(-145.918610092)); |
| final List<GeoPoint> points2 = new ArrayList<>(); |
| points2.add(point5); |
| points2.add(point6); |
| points2.add(point7); |
| points2.add(point8); |
| GeoPolygon pol2 = GeoPolygonFactory.makeGeoPolygon(PlanetModel.SPHERE, points2); |
| GeoCompositeMembershipShape composite = new GeoCompositeMembershipShape(PlanetModel.SPHERE); |
| composite.addShape(pol1); |
| composite.addShape(pol2); |
| return composite; |
| } |
| } |