import random
import unittest
from qgis.core import QgsGeometry
from catatom2osm.geo import Point
[docs]class TestPoint(unittest.TestCase):
[docs] def test_init(self):
p = Point(1, 2)
q = Point(p)
r = Point((1, 2))
self.assertEqual(q.x(), r.x())
self.assertEqual(q.y(), r.y())
[docs] def test_boundigBox(self):
radius = random.uniform(0, 100)
point = Point(random.uniform(0, 100), random.uniform(0, 100))
r = point.boundingBox(radius)
self.assertEqual(round(r.center().x() * 100), round(point.x() * 100))
self.assertEqual(round(r.center().y() * 100), round(point.y() * 100))
self.assertEqual(round(r.width() * 100), round(radius * 200))
self.assertEqual(round(r.height() * 100), round(radius * 200))
[docs] def test_get_corner_context(self):
square = QgsGeometry.fromPolygonXY(
[
[
Point(0, 0),
Point(50, 0.6), # dist > 0.5, angle < 5
Point(100, 0),
Point(105, 50), # dist > 0.5, angle > 5
Point(100, 100),
Point(2, 100.3), # dist < 0.5, angle > 5
Point(0, 100),
Point(0.3, 50), # dist < 0.5, angle < 5
Point(0, 1),
Point(-50, 0), # acute
Point(0, 0),
]
]
)
acute_thr = 10
straight_thr = 5
cath_thr = 0.5
(a, is_acute, is_corner, c) = Point(50, 0.4).get_corner_context(
square, acute_thr, straight_thr, cath_thr
)
self.assertFalse(is_acute)
self.assertFalse(is_corner, "%f %s %s %f" % (a, is_acute, is_corner, c))
(a, is_acute, is_corner, c) = Point(105, 51).get_corner_context(
square, acute_thr, straight_thr, cath_thr
)
self.assertTrue(is_corner, "%f %s %s %f" % (a, is_acute, is_corner, c))
(a, is_acute, is_corner, c) = Point(5.1, 100).get_corner_context(
square, acute_thr, straight_thr, cath_thr
)
self.assertFalse(is_corner, "%f %s %s %f" % (a, is_acute, is_corner, c))
(a, is_acute, is_corner, c) = Point(0.4, 50).get_corner_context(
square, acute_thr, straight_thr, cath_thr
)
self.assertFalse(is_corner, "%f %s %s %f" % (a, is_acute, is_corner, c))
(a, is_acute, is_corner, c) = Point(-51, 0).get_corner_context(
square, acute_thr, straight_thr, cath_thr
)
self.assertTrue(is_acute)
[docs] def test_get_spike_context(self):
square = QgsGeometry.fromPolygonXY(
[
[
Point(0, 50), # spike angle_v < 5 angle_a > 5 c < 0.5
Point(50, 50.4),
Point(49.9, 76),
Point(50, 74), # zig-zag
Point(50, 130),
Point(50.4, 100),
Point(75, 110), # spike
Point(99, 100),
Point(100, 130), # spike but c > 0.5
Point(100.2, 60),
Point(100, 90), # zig-zag but c > 0.1
Point(99.8, 0), # spike
Point(99.5, 50),
Point(70, 55),
Point(60, 50), # not zig-zag
Point(0, 50),
]
]
)
acute_thr = 5
straight_thr = 5
threshold = 0.5
angle_v, angle_a, ndx, ndxa, is_acute, is_zigzag, is_spike, vx = Point(
50, 50.4
).get_spike_context(square, acute_thr, straight_thr, threshold)
self.assertFalse(is_spike)
angle_v, angle_a, ndx, ndxa, is_acute, is_zigzag, is_spike, vx = Point(
0, 50.1
).get_spike_context(square, acute_thr, straight_thr, threshold)
self.assertTrue(is_spike)
self.assertEqual(ndxa, 1)
self.assertEqual(round(vx.x(), 4), 50.0016)
self.assertEqual(vx.y(), 50.0)
angle_v, angle_a, ndx, ndxa, is_acute, is_zigzag, is_spike, vx = Point(
50, 74
).get_spike_context(square, acute_thr, straight_thr, threshold)
self.assertTrue(is_zigzag)
self.assertEqual(ndx, 3)
self.assertEqual(ndxa, 2)
angle_v, angle_a, ndx, ndxa, is_acute, is_zigzag, is_spike, vx = Point(
50, 130
).get_spike_context(square, acute_thr, straight_thr, threshold)
self.assertTrue(is_spike)
self.assertEqual(ndx, 4)
self.assertEqual(ndxa, 5)
self.assertEqual(vx.x(), 50)
self.assertEqual(round(vx.y(), 4), 99.8374)
angle_v, angle_a, ndx, ndxa, is_acute, is_zigzag, is_spike, vx = Point(
100, 130
).get_spike_context(square, acute_thr, straight_thr, threshold)
self.assertTrue(is_acute)
self.assertFalse(is_spike)
angle_v, angle_a, ndx, ndxa, is_acute, is_zigzag, is_spike, vx = Point(
100, 90
).get_spike_context(square, acute_thr, straight_thr, 0.1)
self.assertFalse(is_spike)
self.assertFalse(is_zigzag)
angle_v, angle_a, ndx, ndxa, is_acute, is_zigzag, is_spike, vx = Point(
100, 0
).get_spike_context(square, acute_thr, straight_thr, threshold)
self.assertTrue(is_spike)
self.assertEqual(ndx, 11)
self.assertEqual(ndxa, 12)
self.assertEqual(round(vx.x(), 4), 99.9109)
self.assertEqual(round(vx.y(), 4), 49.9234)
angle_v, angle_a, ndx, ndxa, is_acute, is_zigzag, is_spike, vx = Point(
60, 50
).get_spike_context(square, acute_thr, straight_thr, threshold)
self.assertFalse(is_zigzag)