윤영준 윤영준 2024-04-29
# 보로노이 계산 병렬화
@4d6d1c216d2dbc675961cf3892501224de871922
algorithms/voronoi.py
--- algorithms/voronoi.py
+++ algorithms/voronoi.py
@@ -15,52 +15,28 @@
     coords = list(geom.exterior.coords)
     return (coords)
 
-# def vor_ver(furthest_pnt, i):
-#     return furthest_pnt[i].vertices
+def find_lec_for_polygon(points, polygon):
+    voronoi = Voronoi(points, furthest_site=False)
+    furthest_pnt = voronoi.vertices
+
+    voronoi_nodes = points_from_xy(extract(furthest_pnt, 0), extract(furthest_pnt, 1))
+    voronoi_nodes_if_inside = polygon.contains(voronoi_nodes)
+    voronoi_nodes = list(compress(voronoi_nodes, voronoi_nodes_if_inside))
+    leccc = [item for sublist in extract_coord(voronoi_nodes) for item in sublist]
+
+    dist = cdist(np.array([list(item) for item in points]), np.array([list(item) for item in leccc]))
+    voronoi_nodes_dist = [min(dist[:, j]) for j in range(dist.shape[1])]
+    lecc_ind = np.argmax(voronoi_nodes_dist)
+    lecc = leccc[lecc_ind]
+    lecc_dist = np.max(voronoi_nodes_dist)
+
+    return lecc, lecc_dist
 
 def get_lecc(shp):
-    """
-    This functions finds largest enclosed circle center from shape file.
-    It is used for optimizing text placement and size using Voronoi diagram in this project
-    Arguments:
-    shp -- shape object
+    polygons_coord = [coord_lister(geom) for geom in shp.geometry]
 
-    returns -
-    lecc : which is largest enclosed circle
-    lecc_dist : which is radius of largest enclosed circle
-    """
-    num_area = len(shp)
-    polygons_coord = shp.geometry.apply(coord_lister)
-    furthest_pnt = [None] * num_area
-    voronoi_ori = [None] * num_area
-    for i, points in enumerate(polygons_coord):
-        voronoi_ori[i] = Voronoi(points, furthest_site=False)
-        furthest_pnt[i] = voronoi_ori[i].vertices
+    with ProcessPoolExecutor() as executor:
+        results = list(executor.map(find_lec_for_polygon, polygons_coord, shp.geometry))
 
-    voronoi_nodes = [None] * num_area
-    leccc = [None] * num_area
-    # get voronoi nodes that is inside the polygon.
-    for i in range(num_area):
-        voronoi_nodes[i] = points_from_xy(extract(furthest_pnt[i], 0), extract(furthest_pnt[i], 1))
-        voronoi_nodes_if_inside = shp.geometry[i].contains(voronoi_nodes[i])
-        voronoi_nodes[i] = list(compress(voronoi_nodes[i], voronoi_nodes_if_inside))
-        leccc[i] = [item for sublist in extract_coord(voronoi_nodes[i]) for item in sublist]
-
-    dist = [None] * num_area
-    for i, points in enumerate(polygons_coord):
-        # explaining this mess : I need to get the LEC from candidate I got before, but the thing is,
-        # cdist from scipy only accepts exact dimension with array like object,
-        # which means I need to explicitly set the shape of ndarray, convert list of points into ndarray
-        dist[i] = cdist(np.array([list(item) for item in points]), np.array([list(item) for item in leccc[i]]))
-
-    lecc = [None] * num_area
-    lecc_dist = [None] * num_area
-    for i in range(num_area):
-        voronoi_nodes_dist = [None] * (dist[i].shape[1])
-        for j in range(dist[i].shape[1]):
-            voronoi_nodes_dist[j] = min(dist[i][:, j])
-        lecc_ind = np.argmax(voronoi_nodes_dist)
-        lecc[i] = leccc[i][lecc_ind]
-        lecc_dist[i] = np.max(voronoi_nodes_dist)
-
+    lecc, lecc_dist = zip(*results)
     return lecc, lecc_dist
(No newline at end of file)
Add a comment
List