Exemplo n.º 1
0
class PolylineCodecTestCase(unittest.TestCase):
    def setUp(self):
        self.codec = PolylineCodec()

    def test_decode_multiple_points(self):
        d = self.codec.decode('gu`wFnfys@???nKgE??gE?????oK????fE??fE')
        self.assertEqual(d, [
            (40.641, -8.654),
            (40.641, -8.654),
            (40.641, -8.656),
            (40.642, -8.656),
            (40.642, -8.655),
            (40.642, -8.655),
            (40.642, -8.655),
            (40.642, -8.653),
            (40.642, -8.653),
            (40.642, -8.653),
            (40.641, -8.653),
            (40.641, -8.654)
        ])

    def test_decode_multiple_points_precision(self):
        d = self.codec.decode('o}oolA~ieoO???~{Bo}@??o}@?????_|B????n}@??n}@', 6)
        self.assertEqual(d, [
            (40.641, -8.654),
            (40.641, -8.654),
            (40.641, -8.656),
            (40.642, -8.656),
            (40.642, -8.655),
            (40.642, -8.655),
            (40.642, -8.655),
            (40.642, -8.653),
            (40.642, -8.653),
            (40.642, -8.653),
            (40.641, -8.653),
            (40.641, -8.654)
        ])

    def test_decode_official_example(self):
        d = self.codec.decode('_p~iF~ps|U_ulLnnqC_mqNvxq`@')
        self.assertEqual(d, [
            (38.500, -120.200),
            (40.700, -120.950),
            (43.252, -126.453)
        ])

    def test_decode_official_example_precision(self):
        d = self.codec.decode('_izlhA~rlgdF_{geC~ywl@_kwzCn`{nI', 6)
        self.assertEqual(d, [
            (38.500, -120.200),
            (40.700, -120.950),
            (43.252, -126.453)
        ])

    def test_decode_single_point(self):
        d = self.codec.decode('gu`wFf`ys@')
        self.assertEqual(d, [
            (40.641, -8.653)
        ])

    def test_decode_single_point_precision(self):
        d = self.codec.decode('o}oolAnkcoO', 6)
        self.assertEqual(d, [
            (40.641, -8.653)
        ])

    def test_encode_multiple_points(self):
        e = self.codec.encode([
            (40.641, -8.654),
            (40.641, -8.654),
            (40.641, -8.656),
            (40.642, -8.656),
            (40.642, -8.655),
            (40.642, -8.655),
            (40.642, -8.655),
            (40.642, -8.653),
            (40.642, -8.653),
            (40.642, -8.653),
            (40.641, -8.653),
            (40.641, -8.654)
        ])
        self.assertEqual(e, 'gu`wFnfys@???nKgE??gE?????oK????fE??fE')

    def test_encode_multiple_points_precision(self):
        e = self.codec.encode([
            (40.641, -8.654),
            (40.641, -8.654),
            (40.641, -8.656),
            (40.642, -8.656),
            (40.642, -8.655),
            (40.642, -8.655),
            (40.642, -8.655),
            (40.642, -8.653),
            (40.642, -8.653),
            (40.642, -8.653),
            (40.641, -8.653),
            (40.641, -8.654)
        ], 6)
        self.assertEqual(e, 'o}oolA~ieoO???~{Bo}@??o}@?????_|B????n}@??n}@')

    def test_encode_official_example(self):
        e = self.codec.encode([
            (38.500, -120.200),
            (40.700, -120.950),
            (43.252, -126.453)
        ])
        self.assertEqual(e, '_p~iF~ps|U_ulLnnqC_mqNvxq`@')

    def test_encode_official_example_precision(self):
        e = self.codec.encode([
            (38.500, -120.200),
            (40.700, -120.950),
            (43.252, -126.453)
        ], 6)
        self.assertEqual(e, '_izlhA~rlgdF_{geC~ywl@_kwzCn`{nI')

    def test_encode_single_point(self):
        e = self.codec.encode([
            (40.641, -8.653)
        ])
        self.assertEqual(e, 'gu`wFf`ys@')

    def test_encode_single_point_precision(self):
        e = self.codec.encode([
            (40.641, -8.653)
        ], 6)
        self.assertEqual(e, 'o}oolAnkcoO')

    def test_a_variety_of_precisions(self):
        """uses a generator to create a variety of lat-lon's across the global
            and tests a range of precision settings from 4 to 8"""

        def generator():
            while True:
                coords = []
                for i in range(2, randint(4, 10)):
                    lat, lon = uniform(-180.0, 180.0), uniform(-180.0, 180.0)
                    xy = (round(lat, 5), round(lon, 5))
                    coords.append(xy)
                yield coords

        patience = 3  # seconds.
        waypoints, okays = 0, 0

        g = generator()
        start = time.time()
        while time.time() < start + patience:
            precision = randint(4, 8)
            wp = next(g)
            waypoints += len(wp)
            polyline = self.codec.encode(wp, precision)
            wp2 = self.codec.decode(polyline, precision)
            if wp == wp2:
                okays += len(wp2)
            else:
                for idx, _ in enumerate(wp):
                    dx, dy = abs(wp[idx][0] - wp2[idx][0]), abs(wp[idx][1] - wp2[idx][1])
                    if dx > 10 ** -(precision - 1) or dy > 10 ** -(precision - 1):
                        print("idx={}, dx={}, dy={}".format(idx, dx, dy))
                    else:
                        okays += 1

        assert okays == waypoints
        print("encoded and decoded {0:.2f}% correctly for {1} waypoints @ {2} wp/sec".format(
            100 * okays / float(waypoints),
            waypoints,
            round(waypoints / patience, 0)))
Exemplo n.º 2
0
def encode_polyline(features, zoom_level=18):
    """Encode and iterable of features as a polyline
    """
    points = list(read_points(features))
    codec = PolylineCodec()
    return codec.encode(points)
Exemplo n.º 3
0
class PolylineCodecTestCase(unittest.TestCase):
    def setUp(self):
        self.codec = PolylineCodec()

    def test_decode_multiple_points(self):
        d = self.codec.decode('gu`wFnfys@???nKgE??gE?????oK????fE??fE')
        self.assertEqual(d, [(40.641, -8.654), (40.641, -8.654),
                             (40.641, -8.656), (40.642, -8.656),
                             (40.642, -8.655), (40.642, -8.655),
                             (40.642, -8.655), (40.642, -8.653),
                             (40.642, -8.653), (40.642, -8.653),
                             (40.641, -8.653), (40.641, -8.654)])

    def test_decode_multiple_points_precision(self):
        d = self.codec.decode('o}oolA~ieoO???~{Bo}@??o}@?????_|B????n}@??n}@',
                              6)
        self.assertEqual(d, [(40.641, -8.654), (40.641, -8.654),
                             (40.641, -8.656), (40.642, -8.656),
                             (40.642, -8.655), (40.642, -8.655),
                             (40.642, -8.655), (40.642, -8.653),
                             (40.642, -8.653), (40.642, -8.653),
                             (40.641, -8.653), (40.641, -8.654)])

    def test_decode_official_example(self):
        d = self.codec.decode('_p~iF~ps|U_ulLnnqC_mqNvxq`@')
        self.assertEqual(d, [(38.500, -120.200), (40.700, -120.950),
                             (43.252, -126.453)])

    def test_decode_official_example_precision(self):
        d = self.codec.decode('_izlhA~rlgdF_{geC~ywl@_kwzCn`{nI', 6)
        self.assertEqual(d, [(38.500, -120.200), (40.700, -120.950),
                             (43.252, -126.453)])

    def test_decode_single_point(self):
        d = self.codec.decode('gu`wFf`ys@')
        self.assertEqual(d, [(40.641, -8.653)])

    def test_decode_single_point_precision(self):
        d = self.codec.decode('o}oolAnkcoO', 6)
        self.assertEqual(d, [(40.641, -8.653)])

    def test_encode_multiple_points(self):
        e = self.codec.encode([(40.641, -8.654), (40.641, -8.654),
                               (40.641, -8.656), (40.642, -8.656),
                               (40.642, -8.655), (40.642, -8.655),
                               (40.642, -8.655), (40.642, -8.653),
                               (40.642, -8.653), (40.642, -8.653),
                               (40.641, -8.653), (40.641, -8.654)])
        self.assertEqual(e, 'gu`wFnfys@???nKgE??gE?????oK????fE??fE')

    def test_encode_multiple_points_precision(self):
        e = self.codec.encode([(40.641, -8.654), (40.641, -8.654),
                               (40.641, -8.656), (40.642, -8.656),
                               (40.642, -8.655), (40.642, -8.655),
                               (40.642, -8.655), (40.642, -8.653),
                               (40.642, -8.653), (40.642, -8.653),
                               (40.641, -8.653), (40.641, -8.654)], 6)
        self.assertEqual(e, 'o}oolA~ieoO???~{Bo}@??o}@?????_|B????n}@??n}@')

    def test_encode_official_example(self):
        e = self.codec.encode([(38.500, -120.200), (40.700, -120.950),
                               (43.252, -126.453)])
        self.assertEqual(e, '_p~iF~ps|U_ulLnnqC_mqNvxq`@')

    def test_encode_official_example_precision(self):
        e = self.codec.encode([(38.500, -120.200), (40.700, -120.950),
                               (43.252, -126.453)], 6)
        self.assertEqual(e, '_izlhA~rlgdF_{geC~ywl@_kwzCn`{nI')

    def test_encode_single_point(self):
        e = self.codec.encode([(40.641, -8.653)])
        self.assertEqual(e, 'gu`wFf`ys@')

    def test_encode_single_point_precision(self):
        e = self.codec.encode([(40.641, -8.653)], 6)
        self.assertEqual(e, 'o}oolAnkcoO')

    def test_a_variety_of_precisions(self):
        """uses a generator to create a variety of lat-lon's across the global
            and tests a range of precision settings from 4 to 8"""
        def generator():
            while True:
                coords = []
                for i in range(2, randint(4, 10)):
                    lat, lon = uniform(-180.0, 180.0), uniform(-180.0, 180.0)
                    xy = (round(lat, 5), round(lon, 5))
                    coords.append(xy)
                yield coords

        patience = 3  # seconds.
        waypoints, okays = 0, 0

        g = generator()
        start = time.time()
        while time.time() < start + patience:
            precision = randint(4, 8)
            wp = next(g)
            waypoints += len(wp)
            polyline = self.codec.encode(wp, precision)
            wp2 = self.codec.decode(polyline, precision)
            if wp == wp2:
                okays += len(wp2)
            else:
                for idx, _ in enumerate(wp):
                    dx, dy = abs(wp[idx][0] - wp2[idx][0]), abs(wp[idx][1] -
                                                                wp2[idx][1])
                    if dx > 10**-(precision - 1) or dy > 10**-(precision - 1):
                        print("idx={}, dx={}, dy={}".format(idx, dx, dy))
                    else:
                        okays += 1

        assert okays == waypoints
        print(
            "encoded and decoded {0:.2f}% correctly for {1} waypoints @ {2} wp/sec"
            .format(100 * okays / float(waypoints), waypoints,
                    round(waypoints / patience, 0)))
Exemplo n.º 4
0
def encode_polyline(features, zoom_level=18):
    """Encode and iterable of features as a polyline
    """
    points = list(read_points(features))
    codec = PolylineCodec()
    return codec.encode(points)
Exemplo n.º 5
0
class PolylineCodecTestCase(unittest.TestCase):
    def setUp(self):
        self.codec = PolylineCodec()

    def test_decode_multiple_points(self):
        d = self.codec.decode('gu`wFnfys@???nKgE??gE?????oK????fE??fE')
        self.assertEqual(d, [(40.641, -8.654), (40.641, -8.654),
                             (40.641, -8.656), (40.642, -8.656),
                             (40.642, -8.655), (40.642, -8.655),
                             (40.642, -8.655), (40.642, -8.653),
                             (40.642, -8.653), (40.642, -8.653),
                             (40.641, -8.653), (40.641, -8.654)])

    def test_decode_multiple_points_precision(self):
        d = self.codec.decode('o}oolA~ieoO???~{Bo}@??o}@?????_|B????n}@??n}@',
                              6)
        self.assertEqual(d, [(40.641, -8.654), (40.641, -8.654),
                             (40.641, -8.656), (40.642, -8.656),
                             (40.642, -8.655), (40.642, -8.655),
                             (40.642, -8.655), (40.642, -8.653),
                             (40.642, -8.653), (40.642, -8.653),
                             (40.641, -8.653), (40.641, -8.654)])

    def test_decode_official_example(self):
        d = self.codec.decode('_p~iF~ps|U_ulLnnqC_mqNvxq`@')
        self.assertEqual(d, [(38.500, -120.200), (40.700, -120.950),
                             (43.252, -126.453)])

    def test_decode_official_example_precision(self):
        d = self.codec.decode('_izlhA~rlgdF_{geC~ywl@_kwzCn`{nI', 6)
        self.assertEqual(d, [(38.500, -120.200), (40.700, -120.950),
                             (43.252, -126.453)])

    def test_decode_single_point(self):
        d = self.codec.decode('gu`wFf`ys@')
        self.assertEqual(d, [(40.641, -8.653)])

    def test_decode_single_point_precision(self):
        d = self.codec.decode('o}oolAnkcoO', 6)
        self.assertEqual(d, [(40.641, -8.653)])

    def test_encode_multiple_points(self):
        e = self.codec.encode([(40.641, -8.654), (40.641, -8.654),
                               (40.641, -8.656), (40.642, -8.656),
                               (40.642, -8.655), (40.642, -8.655),
                               (40.642, -8.655), (40.642, -8.653),
                               (40.642, -8.653), (40.642, -8.653),
                               (40.641, -8.653), (40.641, -8.654)])
        self.assertEqual(e, 'gu`wFnfys@???nKgE??gE?????oK????fE??fE')

    def test_encode_multiple_points_precision(self):
        e = self.codec.encode([(40.641, -8.654), (40.641, -8.654),
                               (40.641, -8.656), (40.642, -8.656),
                               (40.642, -8.655), (40.642, -8.655),
                               (40.642, -8.655), (40.642, -8.653),
                               (40.642, -8.653), (40.642, -8.653),
                               (40.641, -8.653), (40.641, -8.654)], 6)
        self.assertEqual(e, 'o}oolA~ieoO???~{Bo}@??o}@?????_|B????n}@??n}@')

    def test_encode_official_example(self):
        e = self.codec.encode([(38.500, -120.200), (40.700, -120.950),
                               (43.252, -126.453)])
        self.assertEqual(e, '_p~iF~ps|U_ulLnnqC_mqNvxq`@')

    def test_encode_official_example_precision(self):
        e = self.codec.encode([(38.500, -120.200), (40.700, -120.950),
                               (43.252, -126.453)], 6)
        self.assertEqual(e, '_izlhA~rlgdF_{geC~ywl@_kwzCn`{nI')

    def test_encode_single_point(self):
        e = self.codec.encode([(40.641, -8.653)])
        self.assertEqual(e, 'gu`wFf`ys@')

    def test_encode_single_point_precision(self):
        e = self.codec.encode([(40.641, -8.653)], 6)
        self.assertEqual(e, 'o}oolAnkcoO')
Exemplo n.º 6
0
class PolylineCodecTestCase(unittest.TestCase):
    def setUp(self):
        self.codec = PolylineCodec()

    def test_decode_multiple_points(self):
        d = self.codec.decode("gu`wFnfys@???nKgE??gE?????oK????fE??fE")
        self.assertEqual(
            d,
            [
                (40.641, -8.654),
                (40.641, -8.654),
                (40.641, -8.656),
                (40.642, -8.656),
                (40.642, -8.655),
                (40.642, -8.655),
                (40.642, -8.655),
                (40.642, -8.653),
                (40.642, -8.653),
                (40.642, -8.653),
                (40.641, -8.653),
                (40.641, -8.654),
            ],
        )

    def test_decode_multiple_points_precision(self):
        d = self.codec.decode("o}oolA~ieoO???~{Bo}@??o}@?????_|B????n}@??n}@", 6)
        self.assertEqual(
            d,
            [
                (40.641, -8.654),
                (40.641, -8.654),
                (40.641, -8.656),
                (40.642, -8.656),
                (40.642, -8.655),
                (40.642, -8.655),
                (40.642, -8.655),
                (40.642, -8.653),
                (40.642, -8.653),
                (40.642, -8.653),
                (40.641, -8.653),
                (40.641, -8.654),
            ],
        )

    def test_decode_official_example(self):
        d = self.codec.decode("_p~iF~ps|U_ulLnnqC_mqNvxq`@")
        self.assertEqual(d, [(38.500, -120.200), (40.700, -120.950), (43.252, -126.453)])

    def test_decode_official_example_precision(self):
        d = self.codec.decode("_izlhA~rlgdF_{geC~ywl@_kwzCn`{nI", 6)
        self.assertEqual(d, [(38.500, -120.200), (40.700, -120.950), (43.252, -126.453)])

    def test_decode_single_point(self):
        d = self.codec.decode("gu`wFf`ys@")
        self.assertEqual(d, [(40.641, -8.653)])

    def test_decode_single_point_precision(self):
        d = self.codec.decode("o}oolAnkcoO", 6)
        self.assertEqual(d, [(40.641, -8.653)])

    def test_encode_multiple_points(self):
        e = self.codec.encode(
            [
                (40.641, -8.654),
                (40.641, -8.654),
                (40.641, -8.656),
                (40.642, -8.656),
                (40.642, -8.655),
                (40.642, -8.655),
                (40.642, -8.655),
                (40.642, -8.653),
                (40.642, -8.653),
                (40.642, -8.653),
                (40.641, -8.653),
                (40.641, -8.654),
            ]
        )
        self.assertEqual(e, "gu`wFnfys@???nKgE??gE?????oK????fE??fE")

    def test_encode_multiple_points_precision(self):
        e = self.codec.encode(
            [
                (40.641, -8.654),
                (40.641, -8.654),
                (40.641, -8.656),
                (40.642, -8.656),
                (40.642, -8.655),
                (40.642, -8.655),
                (40.642, -8.655),
                (40.642, -8.653),
                (40.642, -8.653),
                (40.642, -8.653),
                (40.641, -8.653),
                (40.641, -8.654),
            ],
            6,
        )
        self.assertEqual(e, "o}oolA~ieoO???~{Bo}@??o}@?????_|B????n}@??n}@")

    def test_encode_official_example(self):
        e = self.codec.encode([(38.500, -120.200), (40.700, -120.950), (43.252, -126.453)])
        self.assertEqual(e, "_p~iF~ps|U_ulLnnqC_mqNvxq`@")

    def test_encode_official_example_precision(self):
        e = self.codec.encode([(38.500, -120.200), (40.700, -120.950), (43.252, -126.453)], 6)
        self.assertEqual(e, "_izlhA~rlgdF_{geC~ywl@_kwzCn`{nI")

    def test_encode_single_point(self):
        e = self.codec.encode([(40.641, -8.653)])
        self.assertEqual(e, "gu`wFf`ys@")

    def test_encode_single_point_precision(self):
        e = self.codec.encode([(40.641, -8.653)], 6)
        self.assertEqual(e, "o}oolAnkcoO")