示例#1
0
def test():
    wkt = """
    POLYGON ((0 0, 9 1, 10 10, 1 9, 0 0))
    """
    poly = loads(wkt)
    print poly

    conv = ToPointsAndSegments()
    conv.add_point((0, 0), info=VertexInfo(0, None, None))
    conv.add_point((9, 1), info=VertexInfo(1, None, 1001))
    conv.add_point((10, 10), info=VertexInfo(0, None, None))
    conv.add_point((1, 9), info=VertexInfo(1, None, 1002))
    conv.add_point((0, 0), info=VertexInfo(0, None, None))

    conv.add_segment((0, 0), (9, 1))
    conv.add_segment((9, 1), (10, 10))
    conv.add_segment((10, 10), (1, 9))
    conv.add_segment((1, 9), (0, 0))

    points, segments, infos = conv.points, conv.segments, conv.infos

    pprint(points)
    pprint(segments)
    pprint(infos)

    dt = triangulate(points, infos, segments)

    for vertex in dt.vertices:
        print vertex, vertex.info

    with open("/tmp/alltris.wkt", "w") as fh:
        output_triangles([t for t in TriangleIterator(dt)], fh)
    with open("/tmp/allvertices.wkt", "w") as fh:
        output_vertices(dt.vertices, fh)
    with open("/tmp/interiortris.wkt", "w") as fh:
        output_triangles([t for t in InteriorTriangleIterator(dt)], fh)
    with open("/tmp/hull.wkt", "w") as fh:
        output_triangles([t for t in ConvexHullTriangleIterator(dt)], fh)

#     #if DEBUG: print poly
#     ln = []
#     for ring in poly:
#         for vtx in ring:
#             ln.append(vtx)
#
#     ev = poly.envelope
#     #if DEBUG: print ev
#     eps = 10000
#     half_dx = (ev.xmax - ev.xmin) / 2.0
#     dy = (ev.ymax - ev.ymin)
#     # top - middle
#     top_y = ev.ymax + dy + eps
#     top_x = ev.xmin + half_dx
#     # bottom - left
#     left_x = ev.xmin - half_dx - eps
#     left_y = ev.ymin - eps
#     # bottom - right
#     right_x = ev.xmax + half_dx + eps
#     right_y = ev.ymin - eps
#
#     bnd = [Vertex(left_x,left_y),
#         Vertex(right_x,right_y),
#         Vertex(top_x,top_y)]
#     # return
#     mesh = Mesh(boundary = bnd)
# #    mesh = Mesh()
#     prev_pt = None
#     seed("ab")
#     for i, pt in enumerate(ln):
#         vtx = Vertex(pt.x, pt.y)
#
#         if i == 2:
#             vtx.flag = 1
#             ext_end = Point(pt.x, pt.y)
#
#         elif i == 60:
#             vtx.flag = 1
#             ext_end2 = Point(pt.x, pt.y)
#         else:
#             vtx.flag = 0 # int(randint(0, 10) in (5, ))
#
#         vtx = mesh.insert(vtx)
#         vtx.gid = i
#         if i == 2:
#             ext_end_id = vtx.gid
#         elif i == 60:
#             ext_end2_id = vtx.gid
#
#         if i > 0:
#             mesh.add_constraint( prev_pt, vtx )
#         prev_pt = vtx
#
#     fh = open('/tmp/tris.wkt', 'w')
#     fh.write("geometry\n")
#     MeshVisualizer(mesh).list_triangles_wkt(fh)
#     fh.close()

    visitor = EdgeEdgeHarvester([t for t in InteriorTriangleIterator(dt)])
    visitor.skeleton_segments()
    with open("/tmp/skel0.wkt", "w") as fh:
        fh.write("wkt\n")
        for seg in visitor.segments:
            fh.write(
                "LINESTRING({0[0].x} {0[0].y}, {0[1].x} {0[1].y})\n".format(
                    seg))
    visitor.pick_connectors()

    #     visitor = MidpointHarvester([t for t in InteriorTriangleIterator(dt)])
    #     visitor.skeleton_segments()
    #     with open("/tmp/skel.wkt", "w") as fh:
    #         fh.write("wkt\n")
    #         for seg in visitor.segments:
    #             fh.write("LINESTRING({0[0].x} {0[0].y}, {0[1].x} {0[1].y})\n".format(seg))

    #     with open("/tmp/centres.wkt", "w") as fh:
    #         fh.write("wkt\n")
    #         for t, point in visitor.triangle_point.iteritems():
    #             fh.write("POINT({0})\n".format(point))

    #     visitor = TriangleVisitor(dt)
    #     visitor.skeleton_segments()
    #     visitor.pick_connectors()
    #
    #     visitor.list_table_sg()
    #     visitor.list_segments_pg()
    #     visitor.list_connectors_pg()
    #     visitor.list_pg()

    #    visualizer = MeshVisualizer(mesh)
    #    visualizer.list_pg()

    # make artificial external edges
    #     ext_start = Point(1747940, 5136656)
    #     ln = LineString()
    #     ln.append(ext_start)
    #     ln.append(ext_end)
    #     outside_edges = [
    #         (500000, ln, 100, True, -1, 101, False, ext_end_id, 200, 201)]
    #         #(eid, geom, sn, sn_ext, en, en_ext, lf, rf)
    #
    #     ext_start2 = Point(1748550, 5136537)
    #     ln = LineString()
    #     ln.append(ext_start2)
    #     ln.append(ext_end2)
    #     outside_edges.append((600000, ln, 200, True,  -2, 201, False, ext_end2_id, 201, 200))
    #

    outside_edges = [
        #eid, geom, sn, sn_ext, svtxid, en, en_ext, evtxid, lf, rf
        (4000, LineString([(1, 9), (0, 20), (20, 20), (20, 1), (9, 1)], ),
         1002, False, 1002, 1001, False, 1001, "C", "B"),
        (4001, LineString([(0, 9), (1, 9)], ), 5002, False, 5002, 1002, False,
         1002, "C", "D"),
        (4002, LineString([(9, 0), (9, 1)], ), 5001, False, 5001, 1001, False,
         1001, "D", "C"),
    ]

    #     outside_edges = []
    skeleton = SkeletonGraph()
    print """
    
    ADDING OUTSIDE EDGES
    """
    # first add outside edges
    for outside_edge in outside_edges:
        eid, geom, sn, sn_ext, svtxid, en, en_ext, evtxid, lf, rf, = outside_edge
        skeleton.add_segment(geom,
                             external=True,
                             edge_id=eid,
                             left_face_id=lf,
                             right_face_id=rf,
                             start_node_id=sn,
                             end_node_id=en,
                             start_vertex_id=svtxid,
                             end_vertex_id=evtxid,
                             start_external=sn_ext,
                             end_external=en_ext)


#     print """
#
#     BRIDGE CONNECTORS
#     """
#     # add nodes from inner rings ("bridge" connectors)
#     for i, segment in enumerate(visitor.ext_segments):
#         v0, v1, = segment
#         ln = LineString()
#         ln.append(Point(*v0.point))
#         ln.append(Point(*v1.point))
#         skeleton.add_segment(ln,
#                              external = True,
#                              edge_id = i,
#                              start_vertex_id = v0.gid,
#                              end_vertex_id = v1.gid,
#                              left_face_id = v0.label,
#                              right_face_id = v0.label,
# #                             start_external = True,
# #                             end_external = True
#                              )
#
#     print """
#
#     UNLABELED EDGES
#     """
#     # then add all segments which are unlabeled
    for i, segment in enumerate(visitor.segments):
        v0, v1, = segment
        ln = LineString()
        ln.append(Point(v0.x, v0.y))
        ln.append(Point(v1.x, v1.y))
        start_vertex_id = v0.info.vertex_id
        if start_vertex_id is None:
            start_vertex_id = (
                id(v0),
            )  # note, not an int but tuple to prevent duplicate with external ids
        end_vertex_id = v1.info.vertex_id
        if end_vertex_id is None:
            end_vertex_id = (
                id(v1),
            )  # note, not an int but tuple to prevent duplicate with external ids
        print start_vertex_id
        print end_vertex_id
        skeleton.add_segment(ln,
                             start_vertex_id=start_vertex_id,
                             end_vertex_id=end_vertex_id,
                             external=False,
                             edge_id=i + len(visitor.ext_segments))

    with open('/tmp/edges.wkt', 'w') as fh:
        fh.write("geometry;leftface;rightface;sn;en\n")
        for edge in skeleton.edges:
            print >> fh, edge.geometry, ";", edge.left_face_id, ";", edge.right_face_id, ";", edge.start_node.id, ";", edge.end_node.id

    skeleton.visualize_nodes()
    skeleton.label_sides()
    skeleton.prune_branches()
    skeleton.find_new_edges(new_edge_id=90000, new_node_id=80000)

    with open("/tmp/edges_new.wkt", "w") as fh:
        fh.write("eid;sn;en;lf;rf;length;geom\n")
        for eid, sn, en, lf, rf, length, geom, in skeleton.new_edges:
            print >> fh, eid, ";", sn, ";", en, ";", lf, ";", rf, ";", length, ";", geom
示例#2
0
def test():
    
#    from brep.io import geom_from_text
    
    wkt = """
    POLYGON ((1748051.29733583 5136615.82947196 773.937, 1748047.48 5136606.14 774.133, 1748046.06 5136603.88 773.969, 1748042.35 5136597.96 773.537, 1748047.67 5136593.68 773.537, 1748062.48 5136584.98 773.537, 1748067.52 5136582.04 773.537, 1748078.22 5136575.79 773.537, 1748087.88 5136571.84 773.537, 1748100.04 5136568.43 773.537, 1748114.52 5136567.96 773.537, 1748123.7 5136568.71 773.537, 1748126.1 5136568.9 773.537, 1748139.61 5136568.29 773.537, 1748149.57 5136565.95 773.537, 1748151.93 5136555.15 773.537, 1748149.21 5136548.6 773.537, 1748145.32 5136546.63 773.537, 1748142.02 5136544.95 773.537, 1748131.75 5136545.4 773.537, 1748127.61 5136546.26 773.537, 1748103.12 5136551.32 773.537, 1748099.8 5136552.01 773.537, 1748097.94 5136550.26 773.537, 1748104.5 5136544.95 773.537, 1748110.82 5136539.96 773.537, 1748115.85 5136536 773.537, 1748120.75 5136530 773.537, 1748122.84 5136527.43 773.537, 1748130.56 5136525.53 773.529, 1748137.16 5136523.9 773.522, 1748181.68 5136506.95
773.582, 1748242.81 5136487.67 772.94, 1748259.51 5136493.28 772.94, 1748258.84 5136498.26 772.94, 1748301.42 5136484.25 772.94, 1748297.81 5136473.28 771.782, 1748340.02 5136463.62 771.782, 1748354.35 5136457.53 771.782, 1748368.83 5136450.68 771.782, 1748369.05 5136450.98 771.788, 1748372.99 5136456.65 771.892, 1748377.35 5136461.37 772.002, 1748382.3 5136465.89 772.112, 1748386.44 5136469.71 772.222, 1748392.7 5136473.98 772.332, 1748394.36 5136475.02 772.362, 1748398.85 5136477.82 772.442, 1748404.63 5136480.54 772.552, 1748412.49 5136483.25 772.662, 1748419.53 5136484.98 772.772, 1748426.23 5136486.04 772.882, 1748433.03 5136486.76 772.992, 1748441.07 5136486.75 773.102, 1748448.67 5136486.1 773.212, 1748454.72 5136485.04 773.342, 1748455.57 5136484.81 773.342, 1748455.03 5136493.07 773.342, 1748451.87 5136500.92 773.342, 1748448.06 5136508.98 773.342, 1748443.03 5136515.29 773.342, 1748435.89 5136523.68 773.342, 1748426.88 5136534.43 773.342, 1748419.43 5136547.01 773.
342, 1748412.45 5136556.31 773.342, 1748403.46 5136567.93 773.342, 1748395.46 5136580.18 773.342, 1748392.94 5136593.95 773.342, 1748395.02 5136601.5 773.342, 1748393.12 5136622.45 773.342, 1748390.53 5136630.67 773.129, 1748384.75 5136630.93 773.129, 1748376.07 5136635.84 773.129, 1748375.44 5136643.04 773.129, 1748369.59 5136648.43 773.129, 1748367.26 5136649.46 773.129, 1748363.05 5136651.32 773.129, 1748358.76 5136653.21 773.129, 1748356.79 5136656.19 773.129, 1748354.07 5136660.32 773.129, 1748348.53 5136665.18 773.129, 1748333.14 5136668.96 773.129, 1748328.14 5136669.42 773.129, 1748320.61 5136670.1 773.129, 1748315.97 5136670.48 773.129, 1748315.3 5136670.54 773.129, 1748304.63 5136671.4 773.129, 1748292.43 5136678.1 773.129, 1748284.63 5136689.93 773.129, 1748282.24 5136693.79 773.129, 1748278.53 5136699.76 773.129, 1748266.66 5136710.23 773.129, 1748257.66 5136711.9 773.129, 1748252.92 5136710.38 773.129, 1748245.92 5136708.12 773.129, 1748233.48 5136705.31 773.129,
1748223.28 5136703 773.129, 1748211.97 5136693.03 773.129, 1748206.17 5136686 773.114, 1748187.06 5136659.51 773.114, 1748185.87 5136658.15 773.101, 1748181.55 5136653.23 773.054, 1748173.2 5136636.95 773.054, 1748169.79 5136630.29 773.054, 1748157.99 5136613.96 773.054, 1748145.41 5136605.64 773.069, 1748137.18 5136604.48 773.084, 1748133.63 5136604.66 773.084, 1748122.27 5136605.23 773.084, 1748112.05 5136608.23 773.084, 1748096.84 5136610.21 773.084, 1748083.65 5136610.56 773.069, 1748070.37 5136611.7 773.174, 1748054.86 5136614.9 773.384, 1748051.29733583 5136615.82947196 773.937))
    """
    
    poly = loads(wkt)
    
    print poly
    points, segments = polygon_as_points_and_segments(poly)
    pprint(points)
    pprint(segments)
    dt = triangulate(points, segments)
    with open("/tmp/alltris.wkt", "w") as fh:
        output_triangles([t for t in TriangleIterator(dt)], fh)
    with open("/tmp/allvertices.wkt", "w") as fh:
        output_vertices(dt.vertices, fh)
    with open("/tmp/interiortris.wkt", "w") as fh:
        output_triangles([t for t in InteriorTriangleIterator(dt)], fh)
    with open("/tmp/hull.wkt", "w") as fh:
        output_triangles([t for t in ConvexHullTriangleIterator(dt)], fh)

#     #if DEBUG: print poly
#     ln = []
#     for ring in poly:
#         for vtx in ring:
#             ln.append(vtx)
#         
#     ev = poly.envelope
#     #if DEBUG: print ev
#     eps = 10000
#     half_dx = (ev.xmax - ev.xmin) / 2.0
#     dy = (ev.ymax - ev.ymin)
#     # top - middle
#     top_y = ev.ymax + dy + eps
#     top_x = ev.xmin + half_dx
#     # bottom - left
#     left_x = ev.xmin - half_dx - eps
#     left_y = ev.ymin - eps
#     # bottom - right
#     right_x = ev.xmax + half_dx + eps
#     right_y = ev.ymin - eps
#     
#     bnd = [Vertex(left_x,left_y), 
#         Vertex(right_x,right_y), 
#         Vertex(top_x,top_y)]
#     # return
#     mesh = Mesh(boundary = bnd)
# #    mesh = Mesh()
#     prev_pt = None
#     seed("ab")
#     for i, pt in enumerate(ln):
#         vtx = Vertex(pt.x, pt.y)
#         
#         if i == 2:
#             vtx.flag = 1
#             ext_end = Point(pt.x, pt.y)
#             
#         elif i == 60:
#             vtx.flag = 1
#             ext_end2 = Point(pt.x, pt.y)    
#         else:
#             vtx.flag = 0 # int(randint(0, 10) in (5, ))
#         
#         vtx = mesh.insert(vtx)
#         vtx.gid = i
#         if i == 2:
#             ext_end_id = vtx.gid
#         elif i == 60:
#             ext_end2_id = vtx.gid
#         
#         if i > 0:
#             mesh.add_constraint( prev_pt, vtx )
#         prev_pt = vtx
#     
#     fh = open('/tmp/tris.wkt', 'w')
#     fh.write("geometry\n")
#     MeshVisualizer(mesh).list_triangles_wkt(fh)
#     fh.close()

    visitor = EdgeEdgeHarvester([t for t in InteriorTriangleIterator(dt)])
    visitor.skeleton_segments()
    with open("/tmp/skel0.wkt", "w") as fh:
        fh.write("wkt\n")
        for seg in visitor.segments:
            fh.write("LINESTRING({0[0].x} {0[0].y}, {0[1].x} {0[1].y})\n".format(seg))

    visitor = MidpointHarvester([t for t in InteriorTriangleIterator(dt)])
    visitor.skeleton_segments()
    with open("/tmp/skel.wkt", "w") as fh:
        fh.write("wkt\n")
        for seg in visitor.segments:
            fh.write("LINESTRING({0[0].x} {0[0].y}, {0[1].x} {0[1].y})\n".format(seg))

    with open("/tmp/centres.wkt", "w") as fh:
        fh.write("wkt\n")
        for t, point in visitor.triangle_point.iteritems():
            fh.write("POINT({0})\n".format(point))
    
#     sys.exit()

#     visitor = TriangleVisitor(dt)
#     visitor.skeleton_segments()
#     visitor.pick_connectors()
# 
#     visitor.list_table_sg()
#     visitor.list_segments_pg()
#     visitor.list_connectors_pg()
#     visitor.list_pg()

#    visualizer = MeshVisualizer(mesh)
#    visualizer.list_pg()
    
    # make artificial external edges
#     ext_start = Point(1747940, 5136656)
#     ln = LineString()
#     ln.append(ext_start)
#     ln.append(ext_end)
#     outside_edges = [
#         (500000, ln, 100, True, -1, 101, False, ext_end_id, 200, 201)] 
#         #(eid, geom, sn, sn_ext, en, en_ext, lf, rf)
#     
#     ext_start2 = Point(1748550, 5136537)
#     ln = LineString()
#     ln.append(ext_start2)
#     ln.append(ext_end2)
#     outside_edges.append((600000, ln, 200, True,  -2, 201, False, ext_end2_id, 201, 200))
#     
    outside_edges = []
    skeleton = SkeletonGraph()
    print """
    
    ADDING OUTSIDE EDGES
    """
    # first add outside edges
    for outside_edge in outside_edges:
        eid, geom, sn, sn_ext, svtxid, en, en_ext, evtxid, lf, rf, = outside_edge
        skeleton.add_segment(geom, 
                             external = True, 
                             edge_id = eid, 
                             left_face_id = lf, 
                             right_face_id = rf,
                             start_node_id = sn, 
                             end_node_id = en,
                             start_vertex_id = svtxid,
                             end_vertex_id = evtxid,
                             start_external = sn_ext,
                             end_external = en_ext
                             )
    print """
    
    BRIDGE CONNECTORS
    """
    # add nodes from inner rings ("bridge" connectors)
    for i, segment in enumerate(visitor.ext_segments):
        v0, v1, = segment
        ln = LineString()
        ln.append(Point(*v0.point))
        ln.append(Point(*v1.point))
        skeleton.add_segment(ln, 
                             external = True, 
                             edge_id = i,
                             start_vertex_id = v0.gid,
                             end_vertex_id = v1.gid,
                             left_face_id = v0.label,
                             right_face_id = v0.label,
#                             start_external = True,
#                             end_external = True
                             )

    print """
    
    UNLABELED EDGES
    """
    # then add all segments which are unlabeled
    for i, segment in enumerate(visitor.segments):
        v0, v1, = segment
        ln = LineString()
        ln.append(Point(v0.x, v0.y))
        ln.append(Point(v1.x, v1.y))
        skeleton.add_segment(ln, 
                             start_vertex_id = v0.gid,
                             end_vertex_id = v1.gid,
                             external = False, 
                             edge_id = i + len(visitor.ext_segments))
    
    fh = open('/tmp/edges.wkt', 'w')
    fh.write("geometry;leftface;rightface;sn;en\n")
    for edge in skeleton.edges:
        print >> fh, edge.geometry,";", edge.left_face_id,";", edge.right_face_id, ";", edge.start_node.id,";", edge.end_node.id
    fh.close()
        
    skeleton.visualize_nodes()
    skeleton.label_sides()
    skeleton.prune_branches()
    skeleton.find_new_edges()
    
    fh = open("/tmp/edges_new.wkt", "w")
    fh.write("eid;sn;en;lf;rf;length;geom\n")
    for eid, sn, en, lf, rf, length, geom, in skeleton.new_edges:
        print >> fh, eid, ";", sn,";",  en, ";", lf, ";", rf, ";", length,";",  geom
    fh.close()
示例#3
0
import logging
import sys
logging.basicConfig(
    format="%(asctime)s %(levelname)s (%(process)d) %(message)s",
    stream=sys.stderr,
    level=logging.DEBUG)
from topomap.io import TopoMapFactory
from simplegeom.wkt import loads
from simplegeom.wkb import dumps

factory = TopoMapFactory()

bbox = loads(
    """SRID=28992;POLYGON((119000 487000, 122000 487000, 122000 488000, 119000 488000, 119000 487000))"""
)
#0 0, 400000 0, 400000 650000, 0 650000, 0 0))')

fh = open("/tmp/edges.wkt", "w")
fh.write("id;wkt\n")

tm = factory.topo_map_proper_bbox(name='adam_centre_clean',
                                  bbox=bbox,
                                  universe_id=-1,
                                  srid=28992)
for he in tm.half_edges.itervalues():
    fh.write("{0};{1}\n".format(he.id, he.geometry))

fh.close()

# missing_face = tm.faces[-99]
# for he in tm.half_edges.itervalues():
示例#4
0
Has a problem with computing all initial events...
"""
if True:
    import logging
    import sys
    root = logging.getLogger()
    root.setLevel(logging.DEBUG)
    ch = logging.StreamHandler(sys.stdout)
    ch.setLevel(logging.DEBUG)
    #         formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    formatter = logging.Formatter('%(asctime)s - %(message)s')
    ch.setFormatter(formatter)
    root.addHandler(ch)

wkt = """POLYGON((149497.68200000000069849 411022.27700000000186265,149499.4970000000030268 411022.34700000000884756,149499.72099999999045394 411018.00699999998323619,149499.04099999999743886 411017.96600000001490116,149499.08199999999487773 411017.36599999997997656,149499.76199999998789281 411017.36700000002747402,149499.92399999999906868 411014.46399999997811392,149499.22399999998742715 411014.42499999998835847,149499.26500000001396984 411013.70500000001629815,149500.0059999999939464 411013.71899999998277053,149500.07300000000395812 411013.018999999971129,149500.61199999999371357 411013.06400000001303852,149500.58600000001024455 411013.76400000002468005,149503.38500000000931323 411013.95000000001164153,149503.45199999999022111 411013.27000000001862645,149504.01099999999860302 411013.29599999997299165,149503.98499999998603016 411013.99499999999534339,149505.48399999999674037 411014.08899999997811392,149505.6909999999916181 411011.25099999998928979,149508.60999999998603016 411011.39799999998649582,149508.74499999999534339 411009.70000000001164153,149510.04399999999441206 411009.83199999999487773,149509.97200000000884756 411011.16999999998370185,149513.11100000000442378 411011.37900000001536682,149513.22299999999813735 411010.14100000000325963,149513.97000000000116415 411009.40799999999580905,149514.74199999999837019 411010.21500000002561137,149514.69000000000232831 411011.47399999998742715,149518.82800000000861473 411011.75199999997857958,149518.92000000001280569 411010.53299999999580905,149519.72700000001350418 411009.78100000001722947,149520.41899999999441206 411010.62699999997857958,149520.34799999999813735 411011.82600000000093132,149524.54600000000209548 411012.10499999998137355,149524.61699999999837019 411010.96500000002561137,149525.40400000000954606 411010.17300000000977889,149526.09599999999045394 411011.0590000000083819,149526.02499999999417923 411012.21799999999348074,149530.22299999999813735 411012.49699999997392297,149530.29399999999441206 411011.29800000000977889,149531.08100000000558794 411010.5659999999916181,149531.79300000000512227 411011.41200000001117587,149531.70199999999022111 411012.61099999997531995,149535.90100000001257285 411012.90999999997438863,149535.97200000000884756 411011.66999999998370185,149536.8189999999885913 411010.97800000000279397,149537.53200000000651926 411011.76400000002468005,149537.48000000001047738 411013.04399999999441206,149541.63699999998789281 411013.34200000000419095,149541.72899999999208376 411012.08299999998416752,149542.49600000001373701 411011.39000000001396984,149543.24799999999231659 411012.15700000000651926,149543.15599999998812564 411013.43599999998696148,149547.43499999999767169 411013.7559999999939464,149547.46700000000419095 411012.45600000000558794,149548.2529999999969732 411011.78299999999580905,149548.60899999999674037 411012.22700000001350418,149550.38800000000628643 411012.36300000001210719,149550.59299999999348074 411009.74599999998463318,149550.09799999999813735 411009.22100000001955777,149550.52100000000791624 411008.84499999997206032,149550.9970000000030268 411009.28899999998975545,149551.73600000000442378 411009.37599999998928979,149551.79300000000512227 411007.63699999998789281,149551.99299999998765998 411007.61800000001676381,149552.11699999999837019 411007.14000000001396984,149552.79600000000209548 411007.28600000002188608,149553.52100000000791624 411006.71199999999953434,149553.38699999998789281 411006.09100000001490116,149553.94899999999324791 411005.89600000000791624,149554.01000000000931323 411005.77700000000186265,149554.60999999998603016 411005.76199999998789281,149554.72599999999511056 411004.14299999998183921,149553.72599999999511056 411004.07400000002235174,149553.79300000000512227 411003.29499999998370185,149554.83300000001327135 411003.32400000002235174,149554.88800000000628643 411002.48800000001210719,149554.90299999999115244 411002.26500000001396984,149555.68299999998998828 411002.29200000001583248,149555.63300000000162981 411003.37199999997392297,149560.91099999999278225 411003.70000000001164153,149561.00099999998928979 411002.64100000000325963,149561.84099999998579733 411002.66899999999441206,149561.79099999999743886 411003.76799999998183921,149567.02900000000954606 411004.07699999999022111,149567.1190000000060536 411003.03800000000046566,149568.01900000000023283 411003.04599999997299165,149567.99900000001071021 411003.47100000001955777,149567.96900000001187436 411004.125,149568.96799999999348074 411004.21500000002561137,149568.92100000000209548 411004.9340000000083819,149567.8219999999855645 411004.88400000002002344,149567.7470000000030268 411006.40399999998044223,149568.36699999999837019 411006.44900000002235174,149568.26600000000325963 411008.66899999999441206,149570.40499999999883585 411008.84799999999813735,149570.33199999999487773 411010.24800000002142042,149571.75099999998928979 411010.32099999999627471,149571.81700000001001172 411009.70100000000093132,149572.25700000001234002 411009.72499999997671694,149572.23099999999976717 411010.36499999999068677,149577.70900000000256114 411010.7559999999939464,149577.77499999999417923 411010.11599999997997656,149578.25500000000465661 411010.12099999998463318,149578.22800000000279397 411010.78100000001722947,149581.70000000001164153 411010.93099999998230487,149581.95199999999022111 411008.02500000002328306,149585.21799999999348074 411008.21299999998882413,149584.99299999998765998 411011.16600000002654269,149588.24600000001373701 411011.27199999999720603,149588.33199999999487773 411010.63400000002002344,149588.95100000000093132 411010.71899999998277053,149588.90499999999883585 411011.35800000000745058,149593.5620000000053551 411011.66100000002188608,149593.68900000001303852 411010.98300000000745058,149594.32800000000861473 411011.08899999997811392,149594.20199999999022111 411011.74699999997392297,149597.39499999998952262 411012.43699999997625127,149597.71900000001187436 411012.018999999971129,149598.23600000000442378 411012.40399999998044223,149597.89100000000325963 411012.90100000001257285,149599.60699999998905696 411015.55699999997159466,149600.26800000001094304 411015.46299999998882413,149600.36300000001210719 411016.06400000001303852,149599.78200000000651926 411016.13900000002468005,149598.98800000001210719 411019.77199999999720603,149599.42600000000675209 411019.97600000002421439,149599.17600000000675209 411020.9940000000060536,149600.96400000000721775 411022.36999999999534339,149601.8690000000060536 411021.75900000002002344,149602.2440000000060536 411022.38199999998323619,149601.35800000000745058 411022.9340000000083819,149601.79199999998672865 411025.6969999999855645,149602.67900000000372529 411025.04499999998370185,149603.09299999999348074 411025.60899999999674037,149602.26699999999254942 411026.24200000002747402,149604.95800000001327135 411027.30699999997159466,149605.68499999999767169 411026.5530000000144355,149606.14100000000325963 411026.97700000001350418,149605.39300000001094304 411027.79100000002654269,149606.31400000001303852 411029.81900000001769513,149607.31500000000232831 411029.78800000000046566,149607.40700000000651926 411030.58899999997811392,149606.54600000000209548 411030.68099999998230487,149605.44599999999627471 411032.83199999999487773,149606.54600000000209548 411032.88199999998323619,149606.57500000001164153 411033.98200000001816079,149608.57500000001164153 411034.05999999999767169,149609.00399999998626299 411033.08399999997345731,149609.56099999998696148 411033.42999999999301508,149609.1909999999916181 411034.42599999997764826,149610.83600000001024455 411036.14000000001396984,149612.01900000000023283 411035.91100000002188608,149612.15299999999115244 411036.5530000000144355,149611.26999999998952262 411036.78499999997438863,149610.96499999999650754 411039.46199999999953434,149611.8809999999939464 411039.90999999997438863,149611.63500000000931323 411040.54800000000977889,149610.67900000000372529 411040.09899999998742715,149608.8030000000144355 411041.74200000002747402,149609.11300000001210719 411042.78499999997438863,149608.4310000000114087 411042.97899999999208376,149608.1190000000060536 411042.07600000000093132,149606.06099999998696148 411041.87699999997857958,149605.95100000000093132 411042.95600000000558794,149604.79199999998672865 411042.84499999997206032,149605.34899999998742715 411045.27100000000791624,149606.30799999998998828 411045.41999999998370185,149606.22200000000884756 411046.0590000000083819,149605.08300000001327135 411045.9280000000144355,149604.0059999999939464 411047.71799999999348074,149604.49799999999231659 411048.58199999999487773,149604.03599999999278225 411048.79800000000977889,149603.50200000000768341 411048.13299999997252598,149600.73499999998603016 411048.90700000000651926,149601.44800000000395812 411049.65399999998044223,149601.0029999999969732 411050.13000000000465661,149600.20999999999185093 411049.42300000000977889,149599.40499999999883585 411052.09499999997206032,149600.25800000000162981 411052.78299999999580905,149599.81400000001303852 411053.25900000002002344,149598.95999999999185093 411052.6309999999939464,149597.02799999999115244 411053.75400000001536682,149597.19800000000395812 411054.77500000002328306,149596.69599999999627471 411054.99099999997997656,149597.10200000001350418 411058.65399999998044223,149597.85999999998603016 411058.8809999999939464,149597.71499999999650754 411059.46000000002095476,149596.89699999999720603 411059.23200000001816079,149594.59500000000116415 411061.72499999997671694,149595.09799999999813735 411062.28299999999580905,149594.66099999999278225 411062.72499999997671694,149594.27700000000186265 411062.08699999999953434,149590.56099999998696148 411062.9469999999855645,149590.48600000000442378 411063.72800000000279397,149589.84500000000116415 411063.6909999999916181,149589.92000000001280569 411062.79100000002654269,149589.64000000001396984 411062.83299999998416752,149589.82399999999324791 411063.37199999997392297,149588.80499999999301508 411063.7370000000228174,149587.48099999999976717 411063.143999999971129,149585.43200000000069849 411065.03600000002188608,149585.89999999999417923 411066.27299999998649582,149585.34599999999045394 411067.29599999997299165,149584.40299999999115244 411066.78100000001722947,149583.95499999998719431 411065.44400000001769513,149580.47200000000884756 411065.22299999999813735,149580.35999999998603016 411066.56400000001303852,149579.50500000000465661 411067.30800000001909211,149578.76000000000931323 411066.43300000001909211,149578.8720000000030268 411065.1120000000228174,149575.40900000001420267 411064.89100000000325963,149575.29699999999138527 411066.19199999998090789,149574.46199999999953434 411066.95600000000558794,149573.67600000000675209 411066.03999999997904524,149573.78800000000046566 411064.76000000000931323,149570.08600000001024455 411064.58000000001629815,149569.9940000000060536 411065.8809999999939464,149569.13800000000628643 411066.64500000001862645,149568.3129999999946449 411065.71000000002095476,149568.42499999998835847 411064.42900000000372529,149565.14300000001094304 411064.24699999997392297,149565.10500000001047738 411064.64799999998649582,149565.34700000000884756 411064.94599999999627471,149564.84899999998742715 411065.32900000002700835,149564.58699999999953434 411064.98999999999068677,149562.76600000000325963 411064.96000000002095476,149562.4280000000144355 411065.22200000000884756,149561.96499999999650754 411064.70500000001629815,149562.26300000000628643 411064.42300000000977889,149562.39199999999254942 411062.62199999997392297,149562.14999999999417923 411062.34399999998277053,149561.89000000001396984 411062.32500000001164153,149560.68200000000069849 411060.87199999997392297,149560.70000000001164153 411060.55200000002514571,149558.33900000000721775 411060.38500000000931323,149557.93900000001303852 411060.4469999999855645,149557.94000000000232831 411060.60700000001816079,149557.77999999999883585 411060.76799999998183921,149557.51999999998952262 411060.74900000001071021,149557.37899999998626299 411060.54999999998835847,149557.39799999998649582 411060.39000000001396984,149557.09799999999813735 411060.39100000000325963,149557.01699999999254942 411060.29200000001583248,149554.59599999999045394 411060.18499999999767169,149554.55799999998998828 411060.46500000002561137,149553.3060000000114087 411061.75199999997857958,149552.92600000000675209 411061.75400000001536682,149552.58699999999953434 411062.07600000000093132,149552.43599999998696148 411063.7370000000228174,149552.65900000001420267 411064.07600000000093132,149552.14100000000325963 411064.518999999971129,149551.87899999998626299 411064.17999999999301508,149549.99799999999231659 411064.07099999999627471,149549.70000000001164153 411064.33199999999487773,149549.25700000001234002 411063.77500000002328306,149549.61499999999068677 411063.47299999999813735,149549.76300000000628643 411061.47200000000884756,149549.48099999999976717 411061.13299999997252598,149549.77900000000954606 411060.85200000001350418,149549.81700000001001172 411060.47100000001955777,149547.51800000001094304 411060.35700000001816079,149547.72099999999045394 411057.87800000002607703,149546.0620000000053551 411057.74300000001676381,149545.55799999998998828 411058.21799999999348074,149545.08199999999487773 411057.73399999999674037,149545.60699999998905696 411057.23999999999068677,149545.76399999999557622 411055.36099999997531995,149545.52299999998649582 411055.49900000001071021,149544.82999999998719431 411054.77199999999720603,149544.92000000001280569 411053.67300000000977889,149540.70199999999022111 411053.31400000001303852,149540.63200000001234002 411054.45400000002700835,149539.82500000001164153 411055.14600000000791624,149539.11199999999371357 411054.35999999998603016,149539.18200000000069849 411053.28000000002793968,149534.96499999999650754 411053.00099999998928979,149534.89300000001094304 411054.26099999999860302,149534.10699999998905696 411054.91399999998975545,149533.39199999999254942 411054.20699999999487773,149533.48499999998603016 411052.86800000001676381,149529.26699999999254942 411052.56900000001769513,149529.19500000000698492 411053.84799999999813735,149528.39000000001396984 411054.5059999999939464,149528.34899999998742715 411054.53999999997904524,149528.08400000000256114 411054.24599999998463318,149527.67600000000675209 411053.79399999999441206,149527.76800000001094304 411052.47499999997671694,149523.54999999998835847 411052.21600000001490116,149523.47899999999208376 411053.41499999997904524,149522.65100000001257285 411054.14799999998649582,149521.95800000001327135 411053.34100000001490116,149521.98999999999068677 411052.10200000001350418,149517.83199999999487773 411051.8030000000144355,149517.7410000000090804 411053.00300000002607703,149516.95399999999790452 411053.71500000002561137,149516.16200000001117587 411052.90799999999580905,149516.23300000000745058 411051.68900000001303852,149512.11499999999068677 411051.43099999998230487,149512.02400000000488944 411052.65000000002328306,149511.21700000000419095 411053.30200000002514571,149510.46400000000721775 411052.47499999997671694,149510.5560000000114087 411051.2559999999939464,149507.81799999999930151 411050.97100000001955777,149507.77499999999417923 411051.33000000001629815,149507.11499999999068677 411051.28399999998509884,149508.50099999998928979 411052.77700000000186265,149507.61300000001210719 411053.62900000001536682,149506.14799999998649582 411052.09600000001955777,149498.61100000000442378 411051.5659999999916181,149497.33499999999185093 411052.71500000002561137,149497.05100000000675209 411052.97100000001955777,149497.01999999998952262 411052.99900000001071021,149496.30199999999604188 411052.20199999999022111,149496.53599999999278225 411051.99099999997997656,149497.84099999998579733 411050.8159999999916181,149498.20999999999185093 411045.24599999998463318,149496.32000000000698492 411045.09499999997206032,149496.14000000001396984 411045.08100000000558794,149496.22800000000279397 411043.91999999998370185,149498.27299999998649582 411044.05499999999301508,149498.7529999999969732 411036.80599999998230487,149496.64499999998952262 411036.66600000002654269,149496.72599999999511056 411035.5059999999939464,149496.99299999998765998 411035.52100000000791624,149498.20600000000558794 411035.58799999998882413,149498.36799999998765998 411032.66700000001583248,149497.6279999999969732 411032.62599999998928979,149497.64900000000488944 411032.0059999999939464,149498.3690000000060536 411032.0470000000204891,149498.59299999999348074 411027.46600000001490116,149497.87299999999231659 411027.40500000002793968,149497.89400000000023283 411026.70500000001629815,149498.61400000000139698 411026.74599999998463318,149498.79600000000209548 411023.48599999997531995,149497.52299999998649582 411023.39899999997578561,149497.3159999999916181 411023.38500000000931323,149497.35699999998905696 411022.26500000001396984,149497.68200000000069849 411022.27700000000186265))"""

poly = loads(wkt)
outer = poly[0]

rounded = [(round(pt[0], 3), round(pt[1], 3)) for pt in outer]
segments = zip(rounded[:-1], rounded[1:])

conv = ToPointsAndSegments()
for line in segments:
    conv.add_point(line[0])
    conv.add_point(line[1])
    conv.add_segment(*line)
print conv.points

skel = calc_skel(conv, pause=False, output=True)