예제 #1
0
    def trunk_from_street_city(self):
        """
         ---<---
               +---<---
         --->--+
        """
        city = City("Trunk from street")

        trunk = Trunk.from_control_points([
            Point(0, 0),
            Point(50, 0)
        ])
        trunk.name = "t1"

        street = Street.from_control_points([
            Point(100, 0),
            Point(50, 0)
        ])
        street.name = "s1"

        city.add_road(trunk)
        city.add_road(street)

        city.add_intersection_at(Point(50, 0))

        return city
예제 #2
0
    def Y_intersection_one_to_many_city(self):
        """
                  (0,100)
                    |
                    |
                    +
                   / \
                  /   \
         (-100,-100) (100,-100)
        """
        city = City("Y intersection - One to many")

        s1 = Street.from_control_points([Point(0, 100), Point(0, 0)])
        s1.name = "s1"

        s2 = Street.from_control_points([Point(0, 0), Point(-100, -100)])
        s2.name = "s2"

        s3 = Street.from_control_points([Point(0, 0), Point(100, -100)])
        s3.name = "s3"

        city.add_intersection_at(Point(0, 0))

        city.add_road(s1)
        city.add_road(s2)
        city.add_road(s3)

        return city
예제 #3
0
    def road_ends_in_intersection_city(self):
        """
        When using smooth geometries, the original intersection point (0,0) does
        not exist anymore as a place for the roads to intersect (it should be
        replaced by an arc or similar). Since s2 dies on (0,0) the road geometry
        has to be extended to touch the new s1 geometry.

                             __--- (50,30)
        (-50,0) ------- + ---
                        |
                        |
                      (0,-50)
        """
        city = City("Road ends in intersection")

        s1 = Street.from_control_points([Point(-50, 0), Point(0, 0), Point(50, 30)])
        s1.name = "s1"

        s2 = Street.from_control_points([Point(0, -50), Point(0, 0)])
        s2.name = "s2"

        city.add_intersection_at(Point(0, 0))

        city.add_road(s1)
        city.add_road(s2)

        return city
예제 #4
0
    def test_trim_redundant_nodes_on_multiple_collinear_segments_with_one_intersection(
            self):
        """Two collinear segments, where the midpoint is an intersection.
        The middle point should not be removed, as that would remove the intersection"""

        city = City()
        city.add_intersection_at(Point(100, 0))
        city.add_road(
            Road.from_control_points([Point(100, 100),
                                      Point(100, 0)]))

        points = [
            Point(0, 0),
            Point(10, 0),
            Point(20, 0),
            Point(50, 0),
            Point(100, 0),
            Point(110, 0),
            Point(150, 0),
            Point(200, 0)
        ]
        road = Road.from_control_points(points)
        city.add_road(road)

        before_trim_expected_nodes = [
            RoadSimpleNode(Point(0, 0)),
            RoadSimpleNode(Point(10, 0)),
            RoadSimpleNode(Point(20, 0)),
            RoadSimpleNode(Point(50, 0)),
            RoadIntersectionNode(Point(100, 0)),
            RoadSimpleNode(Point(110, 0)),
            RoadSimpleNode(Point(150, 0)),
            RoadSimpleNode(Point(200, 0))
        ]
        self.assertEqual(road.nodes(), before_trim_expected_nodes)

        road.trim_redundant_nodes()

        after_trim_expected_nodes = [
            RoadSimpleNode(Point(0, 0)),
            RoadIntersectionNode(Point(100, 0)),
            RoadSimpleNode(Point(200, 0))
        ]

        self.assertEqual(road.nodes(), after_trim_expected_nodes)
예제 #5
0
    def L_intersection_city(self):
        """
            (0,100)
               |
               + -- (100,0)
        """
        city = City("L intersection")

        s1 = Street.from_control_points([Point(0, 100), Point(0, 0)])
        s1.name = "s1"

        s2 = Street.from_control_points([Point(0, 0), Point(100, 0)])
        s2.name = "s2"

        city.add_intersection_at(Point(0, 0))

        city.add_road(s1)
        city.add_road(s2)

        return city
예제 #6
0
    def T_intersection_out_city(self):
        """
        (-100,0) -- + -- (100,0)
                    |
                  (0,-100)
        """
        city = City("T intersection out")

        s1 = Street.from_control_points([Point(-100, 0), Point(0, 0), Point(100, 0)])
        s1.name = "s1"

        s2 = Street.from_control_points([Point(0, 0), Point(0, -100)])
        s2.name = "s2"

        city.add_intersection_at(Point(0, 0))

        city.add_road(s1)
        city.add_road(s2)

        return city
예제 #7
0
    def test_sample_city(self):
        city = City()

        city.add_road(
            Street.from_control_points(
                [Point(-100, 0), Point(0, 0),
                 Point(100, 0)]))
        city.add_road(
            Street.from_control_points(
                [Point(0, 100), Point(0, 0),
                 Point(0, -100)]))
        city.add_intersection_at(Point(0, 0))

        city.add_road(
            Street.from_control_points([
                Point(-10, 200),
                Point(0, 200),
                Point(10, 220),
                Point(20, 270)
            ]))

        stats = CityStatistics(city)
        values = stats.run()
        self.assertEquals(values['roads_count'], 3)
        self.assertEquals(values['lanes_count'], 3)
        self.assertEquals(values['buildings_count'], 0)
        self.assertEquals(values['blocks_count'], 0)
        self.assertEquals(values['polyline_waypoints_count'], 12)
        self.assertEquals(values['polyline_intersections_count'], 4)
        self.assertEquals(values['average_polyline_intersections'], 4.0 / 3.0)
        self.assertEquals(values['average_polyline_waypoints'], 12.0 / 3.0)
        self.assertEquals(values['lines_and_arcs_waypoints_count'], 14)
        self.assertEquals(values['lines_and_arcs_intersections_count'], 4)
        self.assertEquals(values['average_lines_and_arcs_intersections'],
                          4.0 / 3.0)
        self.assertEquals(values['average_lines_and_arcs_waypoints'],
                          14.0 / 3.0)
예제 #8
0
    def collinear_streets_city(self):
        """
         --->---+--->---
        """
        city = City("Collinear streets")

        s1 = Street.from_control_points([
            Point(0, 0),
            Point(50, 0)
        ])
        s1.name = "s1"

        s2 = Street.from_control_points([
            Point(50, 0),
            Point(100, 0)
        ])
        s2.name = "s2"

        city.add_road(s1)
        city.add_road(s2)

        city.add_intersection_at(Point(50, 0))

        return city
예제 #9
0
    def broken_intersection_on_two_lanes_city(self):
        """
                      (10,50)
                         |
                        |    __--- (50,20)
        (-50,0) ------- + ---
                        |
                        |
                      (0,-50)
        """
        city = City("Broken intersection - Two lanes")

        s1 = Street.from_control_points([Point(-50, 0), Point(0, 0), Point(50, 20)])
        s1.name = "s1"

        s2 = Street.from_control_points([Point(0, -50), Point(0, 0), Point(10, 50)])
        s2.name = "s2"

        city.add_intersection_at(Point(0, 0))

        city.add_road(s1)
        city.add_road(s2)

        return city