def test_point_geom_not_moving(self): r""" Modify path, point not moving + + | | \ X / X / \ | | + + """ p1 = PathFactory.create( geom=LineString((0, 0), (0, 5), (5, 10), (0, 15), (0, 20))) poi = Point(10, 10, srid=settings.SRID) poi.transform(settings.API_SRID) poitopo = Topology.deserialize({'lat': poi.y, 'lng': poi.x}) self.assertEqual(0.5, poitopo.aggregations.all()[0].start_position) self.assertTrue(almostequal(-5, poitopo.offset)) # It should have kept its position ! self.assertTrue(almostequal(10, poitopo.geom.x)) self.assertTrue(almostequal(10, poitopo.geom.y)) # Change path, it should still be in the same position p1.geom = LineString((0, 0), (0, 5), (-5, 10), (0, 15), (0, 20)) p1.save() poitopo.reload() self.assertTrue(almostequal(10, poitopo.geom.x)) self.assertTrue(almostequal(10, poitopo.geom.y))
def test_point_offset_kept(self): """ Shorten path, offset kept. X X +-----------+ +------+ """ p1 = PathFactory.create(geom=LineString((0, 0), (20, 0))) poi = Point(5, 10, srid=settings.SRID) poi.transform(settings.API_SRID) poitopo = Topology.deserialize({'lat': poi.y, 'lng': poi.x}) self.assertTrue( almostequal(0.25, poitopo.aggregations.all()[0].start_position)) self.assertTrue(almostequal(10, poitopo.offset)) p1.geom = LineString((0, 0), (10, 0)) p1.save() poitopo.reload() self.assertTrue(almostequal(10, poitopo.offset)) # Not moved: self.assertTrue(almostequal(5, poitopo.geom.x)) self.assertTrue(almostequal(10, poitopo.geom.y))
def test_point_geom_not_moving(self): """ Modify path, point not moving + + | | \ X / X / \ | | + + """ p1 = PathFactory.create(geom=LineString((0, 0, 0), (0, 5, 0), (5, 10, 0), (0, 15, 0), (0, 20, 0))) poi = Point(10, 10, srid=settings.SRID) poi.transform(settings.API_SRID) poitopo = Topology.deserialize({'lat': poi.y, 'lng': poi.x}) self.assertEqual(0.5, poitopo.aggregations.all()[0].start_position) self.assertTrue(almostequal(-5, poitopo.offset)) # It should have kept its position ! self.assertTrue(almostequal(10, poitopo.geom.x)) self.assertTrue(almostequal(10, poitopo.geom.y)) # Change path, it should still be in the same position p1.geom = LineString((0, 0, 0), (0, 5, 0), (-5, 10, 0), (0, 15, 0), (0, 20, 0)) p1.save() poitopo.reload() self.assertTrue(almostequal(10, poitopo.geom.x)) self.assertTrue(almostequal(10, poitopo.geom.y))
def test_serialize_point(self): path = PathFactory.create() topology = TopologyFactory.create(offset=1, no_path=True) topology.add_path(path, start=0.5, end=0.5) fieldvalue = topology.serialize() # fieldvalue is like '{"lat": -5.983842291017086, "lng": -1.3630770374505987, "kind": "TOPOLOGY"}' field = json.loads(fieldvalue) self.assertTrue(almostequal(field['lat'], -5.983)) self.assertTrue(almostequal(field['lng'], -1.363)) self.assertEqual(field['kind'], "TOPOLOGY")
def test_point_at_end_of_path_not_moving_after_mutate(self): PathFactory.create(geom=LineString((400, 400), (410, 400), srid=settings.SRID)) self.assertEqual(1, len(Path.objects.all())) father = Topology.deserialize({"lat": -1, "lng": -1}) poi = Point(500, 600, srid=settings.SRID) poi.transform(settings.API_SRID) son = Topology.deserialize({"lat": poi.y, "lng": poi.x}) father.mutate(son) self.assertTrue(almostequal(father.geom.x, 500)) self.assertTrue(almostequal(father.geom.y, 600))
def test_point_at_end_of_path_not_moving_after_mutate(self): PathFactory.create( geom=LineString((400, 400), (410, 400), srid=settings.SRID)) self.assertEqual(1, len(Path.objects.all())) father = Topology.deserialize({'lat': -1, 'lng': -1}) poi = Point(500, 600, srid=settings.SRID) poi.transform(settings.API_SRID) son = Topology.deserialize({'lat': poi.y, 'lng': poi.x}) father.mutate(son) self.assertTrue(almostequal(father.geom.x, 500)) self.assertTrue(almostequal(father.geom.y, 600))
def test_deserialize_serialize(self): path = PathFactory.create(geom=LineString((1, 1), (2, 2), (2, 0))) before = TopologyFactory.create(offset=1, no_path=True) before.add_path(path, start=0.5, end=0.5) # Deserialize its serialized version ! after = Topology.deserialize(before.serialize()) self.assertEqual(len(before.paths.all()), len(after.paths.all())) start_before = before.aggregations.all()[0].start_position end_before = before.aggregations.all()[0].end_position start_after = after.aggregations.all()[0].start_position end_after = after.aggregations.all()[0].end_position self.assertTrue(almostequal(start_before, start_after), '%s != %s' % (start_before, start_after)) self.assertTrue(almostequal(end_before, end_after), '%s != %s' % (end_before, end_after))
def test_deserialize_point(self): PathFactory.create() # Take a point p = Point(2, 1, 0, srid=settings.SRID) p.transform(settings.API_SRID) closest = Path.closest(p) # Check closest path self.assertEqual(closest.geom.coords, ((1.0, 1.0, 0.0), (2.0, 2.0, 0.0))) # The point has same x as first point of path, and y to 0 : topology = Topology.deserialize('{"lng": %s, "lat": %s}' % (p.x, p.y)) self.assertAlmostEqual(topology.offset, -0.7071, 3) self.assertEqual(len(topology.paths.all()), 1) pagg = topology.aggregations.get() self.assertTrue(almostequal(pagg.start_position, 0.5)) self.assertTrue(almostequal(pagg.end_position, 0.5))
def test_remove_poi(self): """ poi is linked with AB poi + D * | * | A---------B C |----| e1 we got after remove AB : poi + * * * * * * * D | | C poi is linked with DC and e1 is deleted """ ab = PathFactory.create(name="AB", geom=LineString((0, 0), (1, 0))) PathFactory.create(name="CD", geom=LineString((2, 0), (2, 1))) poi = POIFactory.create(no_path=True, offset=1) e1 = TopologyFactory.create(no_path=True) PathAggregationFactory.create(path=ab, topo_object=e1, start_position=0.5, end_position=1) poi.add_path(ab, start=0.5, end=0.5) poi.save() self.assertTrue(almostequal(1, poi.offset)) self.assertEqual(poi.geom, Point(0.5, 1.0, srid=2154)) ab.delete() poi.reload() e1.reload() self.assertEqual(len(Path.objects.all()), 1) self.assertEqual(e1.deleted, True) self.assertEqual(poi.deleted, False) self.assertTrue(almostequal(1.5, poi.offset))
def test_deserialize_serialize(self): path = PathFactory.create(geom=LineString((1, 1, 1), (2, 2, 2), (2, 0, 0))) before = TopologyFactory.create(offset=1, no_path=True) before.add_path(path, start=0.5, end=0.5) # Reload from DB before = Topology.objects.get(pk=before.pk) # Deserialize its serialized version ! after = Topology.deserialize(before.serialize()) # Reload from DB after = Topology.objects.get(pk=after.pk) self.assertEqual(len(before.paths.all()), len(after.paths.all())) self.assertTrue(almostequal(before.aggregations.all()[0].start_position, after.aggregations.all()[0].start_position)) self.assertTrue(almostequal(before.aggregations.all()[0].end_position, after.aggregations.all()[0].end_position))
def test_point_geom_3d(self): """ + / \ / X \ + + """ p1 = PathFactory.create(geom=LineString((0, 0, 1000), (4, 4, 2000))) p2 = PathFactory.create(geom=LineString((4, 4, 2000), (8, 0, 0))) poi = Point(3, 1, srid=settings.SRID) position, distance = Path.interpolate(p1, poi) self.assertTrue(almostequal(0.5, position)) self.assertTrue(almostequal(-1.414, distance)) # Verify that deserializing this, we obtain the same original coordinates # (use lat/lng as in forms) poi.transform(settings.API_SRID) poitopo = Topology.deserialize({'lat': poi.y, 'lng': poi.x}) # Computed topology properties match original interpolation self.assertTrue(almostequal(0.5, poitopo.aggregations.all()[0].start_position)) self.assertTrue(almostequal(-1.414, poitopo.offset)) # Resulting geometry self.assertTrue(almostequal(3, poitopo.geom.x)) self.assertTrue(almostequal(1, poitopo.geom.y)) self.assertTrue(almostequal(0, poitopo.geom.z))
def test_point_offset_updated(self): """ Shorten path, offset updated. X X +-----------+ +------+ """ p1 = PathFactory.create(geom=LineString((0, 0), (20, 0))) poi = Point(10, 10, srid=settings.SRID) poi.transform(settings.API_SRID) poitopo = Topology.deserialize({'lat': poi.y, 'lng': poi.x}) self.assertTrue(almostequal(0.5, poitopo.aggregations.all()[0].start_position)) self.assertTrue(almostequal(10, poitopo.offset)) p1.geom = LineString((0, 0), (0, 5)) p1.save() poitopo.reload() self.assertTrue(almostequal(11.180339887, poitopo.offset)) # Not moved: self.assertTrue(almostequal(10, poitopo.geom.x)) self.assertTrue(almostequal(10, poitopo.geom.y))
def test_point_offset_kept(self): """ Shorten path, offset kept. X X +-----------+ +------+ """ p1 = PathFactory.create(geom=LineString((0, 0), (20, 0))) poi = Point(5, 10, srid=settings.SRID) poi.transform(settings.API_SRID) poitopo = Topology.deserialize({"lat": poi.y, "lng": poi.x}) self.assertTrue(almostequal(0.25, poitopo.aggregations.all()[0].start_position)) self.assertTrue(almostequal(10, poitopo.offset)) p1.geom = LineString((0, 0), (10, 0)) p1.save() poitopo.reload() self.assertTrue(almostequal(10, poitopo.offset)) # Not moved: self.assertTrue(almostequal(5, poitopo.geom.x)) self.assertTrue(almostequal(10, poitopo.geom.y))
def test_point_geom_moving(self): p1 = PathFactory.create(geom=LineString((0, 0), (0, 5))) poi = Point(0, 2.5, srid=settings.SRID) poi.transform(settings.API_SRID) poitopo = Topology.deserialize({"lat": poi.y, "lng": poi.x}) self.assertTrue(almostequal(0.5, poitopo.aggregations.all()[0].start_position)) self.assertTrue(almostequal(0, poitopo.offset)) self.assertTrue(almostequal(0, poitopo.geom.x)) self.assertTrue(almostequal(2.5, poitopo.geom.y)) p1.geom = LineString((10, 0), (10, 5)) p1.save() poitopo.reload() self.assertTrue(almostequal(10, poitopo.geom.x)) self.assertTrue(almostequal(2.5, poitopo.geom.y))
def test_point_geom_moving(self): p1 = PathFactory.create(geom=LineString((0, 0), (0, 5))) poi = Point(0, 2.5, srid=settings.SRID) poi.transform(settings.API_SRID) poitopo = Topology.deserialize({'lat': poi.y, 'lng': poi.x}) self.assertTrue( almostequal(0.5, poitopo.aggregations.all()[0].start_position)) self.assertTrue(almostequal(0, poitopo.offset)) self.assertTrue(almostequal(0, poitopo.geom.x)) self.assertTrue(almostequal(2.5, poitopo.geom.y)) p1.geom = LineString((10, 0), (10, 5)) p1.save() poitopo.reload() self.assertTrue(almostequal(10, poitopo.geom.x)) self.assertTrue(almostequal(2.5, poitopo.geom.y))