blob: b1cbbd360c9efd40f2406cf1b3eae57b419fcf58 [file] [log] [blame]
# 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.
import pytest
import shapely
from shapely import wkt
from shapely.geometry import Point
from sedona.spark.core.geom.circle import Circle
from sedona.spark.core.geom.envelope import Envelope
class TestCircle:
def test_get_center(self):
point = Point(0.0, 0.0)
circle = Circle(point, 0.1)
assert circle.centerGeometry.x == pytest.approx(
point.x, 1e-6
) and circle.centerGeometry.y == pytest.approx(point.y, 1e-6)
def test_get_radius(self):
point = Point(0.0, 0.0)
circle = Circle(point, 0.1)
assert circle.getRadius() == pytest.approx(0.1, 0.01)
@pytest.mark.skipif(
shapely.__version__.startswith("2."),
reason="Circle is immutable when working with Shapely 2.0",
)
def test_set_radius(self):
point = Point(0.0, 0.0)
circle = Circle(point, 0.1)
circle.setRadius(0.1)
assert circle.getRadius() == pytest.approx(0.1, 0.01)
def test_get_envelope_internal(self):
point = Point(0.0, 0.0)
circle = Circle(point, 0.1)
assert Envelope(-0.1, 0.1, -0.1, 0.1) == circle.getEnvelopeInternal()
def test_covers(self):
circle = Circle(Point(0.0, 0.0), 0.5)
assert circle.covers(Point(0.0, 0.0))
assert circle.covers(Point(0.1, 0.2))
assert not circle.covers(Point(0.4, 0.4))
assert not circle.covers(Point(-1, 0.4))
assert circle.covers(wkt.loads("MULTIPOINT ((0.1 0.1), (0.2 0.4))"))
assert not circle.covers(wkt.loads("MULTIPOINT ((0.1 0.1), (1.2 0.4))"))
assert not circle.covers(wkt.loads("MULTIPOINT ((1.1 0.1), (0.2 1.4))"))
assert circle.covers(
wkt.loads("POLYGON ((-0.1 0.1, 0 0.4, 0.1 0.2, -0.1 0.1))")
)
assert circle.covers(wkt.loads("POLYGON ((-0.5 0, 0 0.5, 0.5 0, -0.5 0))"))
assert not circle.covers(wkt.loads("POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))"))
assert not circle.covers(
wkt.loads("POLYGON ((0.4 0.4, 0.4 0.45, 0.45 0.45, 0.45 0.4, 0.4 0.4))")
)
assert circle.covers(
wkt.loads(
"MULTIPOLYGON (((-0.1 0.1, 0 0.4, 0.1 0.2, -0.1 0.1)),((-0.5 0, 0 0.5, 0.5 0, -0.5 0)))"
)
)
assert not circle.covers(
wkt.loads(
"MULTIPOLYGON (((-0.1 0.1, 0 0.4, 0.1 0.2, -0.1 0.1)),((0 0, 0 1, 1 1, 1 0, 0 0)))"
)
)
assert not circle.covers(
wkt.loads(
"MULTIPOLYGON (((0.4 0.4, 0.4 0.45, 0.45 0.45, 0.45 0.4, 0.4 0.4)),((0 0, 0 1, 1 1, 1 0, 0 0)))"
)
)
assert circle.covers(wkt.loads("LINESTRING (-0.1 0, 0.2 0.3)"))
assert circle.covers(wkt.loads("LINESTRING (-0.5 0, 0 0.5, 0.5 0)"))
assert not circle.covers(wkt.loads("LINESTRING (-0.1 0, 0 1)"))
assert not circle.covers(wkt.loads("LINESTRING (0.4 0.4, 0.45 0.45)"))
assert circle.covers(
wkt.loads("MULTILINESTRING ((-0.1 0, 0.2 0.3), (-0.5 0, 0 0.5, 0.5 0))")
)
assert not circle.covers(
wkt.loads("MULTILINESTRING ((-0.1 0, 0.2 0.3), (-0.1 0, 0 1))")
)
assert not circle.covers(
wkt.loads("MULTILINESTRING ((0.4 0.4, 0.45 0.45), (-0.1 0, 0 1))")
)
def test_intersects(self):
circle = Circle(Point(0.0, 0.0), 0.5)
assert circle.intersects(Point(0, 0))
assert circle.intersects(Point(0.1, 0.2))
assert not (circle.intersects(Point(0.4, 0.4)))
assert not (circle.intersects(Point(-1, 0.4)))
assert circle.intersects(wkt.loads("MULTIPOINT ((0.1 0.1), (0.2 0.4))"))
assert circle.intersects(wkt.loads("MULTIPOINT ((0.1 0.1), (1.2 0.4))"))
assert not circle.intersects(wkt.loads("MULTIPOINT ((1.1 0.1), (0.2 1.4))"))
assert circle.intersects(
wkt.loads("POLYGON ((-0.1 0.1, 0 0.4, 0.1 0.2, -0.1 0.1))")
)
assert circle.intersects(wkt.loads("POLYGON ((-0.5 0, 0 0.5, 0.5 0, -0.5 0))"))
assert circle.intersects(wkt.loads("POLYGON ((0 0, 1 1, 1 0, 0 0))"))
assert circle.intersects(
wkt.loads("POLYGON ((-1 -1, -1 1, 1 1, 1.5 0.5, 1 -1, -1 -1))")
)
assert circle.intersects(
wkt.loads(
"POLYGON ((-1 -1, -1 1, 1 1, 1 -1, -1 -1),(-0.1 -0.1, 0.1 -0.1, 0.1 0.1, -0.1 0.1, -0.1 -0.1))"
)
)
assert not circle.intersects(
wkt.loads("POLYGON ((0.4 0.4, 0.4 0.45, 0.45 0.45, 0.45 0.4, 0.4 0.4))")
)
assert not circle.intersects(
wkt.loads("POLYGON ((-1 0, -1 1, 0 1, 0 2, -1 2, -1 0))")
)
assert not circle.intersects(
wkt.loads(
"POLYGON ((-1 -1, -1 1, 1 1, 1 -1, -1 -1),(-0.6 -0.6, 0.6 -0.6, 0.6 0.6, -0.6 0.6, -0.6 -0.6))"
)
)
assert circle.intersects(
wkt.loads(
"MULTIPOLYGON (((-0.1 0.1, 0 0.4, 0.1 0.2, -0.1 0.1)),((-0.5 0, 0 0.5, 0.5 0, -0.5 0)))"
)
)
assert circle.intersects(
wkt.loads(
"MULTIPOLYGON (((-0.1 0.1, 0 0.4, 0.1 0.2, -0.1 0.1)), ((-1 0, -1 1, 0 1, 0 2, -1 2, -1 0)))"
)
)
assert not circle.intersects(
wkt.loads(
"MULTIPOLYGON (((0.4 0.4, 0.4 0.45, 0.45 0.45, 0.45 0.4, 0.4 0.4)),((-1 0, -1 1, 0 1, 0 2, -1 2, -1 0)))"
)
)
assert circle.intersects(wkt.loads("LINESTRING (-1 -1, 1 1)"))
assert circle.intersects(wkt.loads("LINESTRING (-1 0.5, 1 0.5)"))
assert circle.intersects(wkt.loads("LINESTRING (0 0, 0.1 0.2)"))
assert not circle.intersects(wkt.loads("LINESTRING (0.4 0.4, 1 1)"))
assert not circle.intersects(wkt.loads("LINESTRING (-0.4 -0.4, -2 -3.2)"))
assert not circle.intersects(wkt.loads("LINESTRING (0.1 0.5, 1 0.5)"))
assert circle.intersects(
wkt.loads("MULTILINESTRING ((-1 -1, 1 1), (-1 0.5, 1 0.5))")
)
assert circle.intersects(
wkt.loads("MULTILINESTRING ((-1 -1, 1 1), (0.4 0.4, 1 1))")
)
assert not circle.intersects(
wkt.loads("MULTILINESTRING ((0.1 0.5, 1 0.5), (0.4 0.4, 1 1))")
)
def test_equality(self):
assert Circle(Point(-112.574945, 45.987772), 0.01) == Circle(
Point(-112.574945, 45.987772), 0.01
)
assert Circle(Point(-112.574945, 45.987772), 0.01) == Circle(
Point(-112.574945, 45.987772), 0.01
)
def test_radius(self):
polygon = wkt.loads(
"POLYGON ((-1 -1, -1 1, 1 1, 1 -1, -1 -1),(-0.6 -0.6, 0.6 -0.6, 0.6 0.6, -0.6 0.6, -0.6 -0.6))"
)
circle = Circle(polygon, 1.0)
pytest.approx(circle.radius, 1.414213, 0.001)
pytest.approx(circle.MBR.minx, -1.414213, 0.001)
pytest.approx(circle.MBR.maxx, 1.414213, 0.001)
pytest.approx(circle.MBR.miny, -1.414213, 0.001)
pytest.approx(circle.MBR.maxy, 1.414213, 0.001)