def calculate_matrix(inliers, m, norm_0, ref_z, direction_z): a, b, c, d = m x_max = inliers[np.argmax(inliers[:, 0])] x_min = inliers[np.argmin(inliers[:, 0])] y_max = inliers[np.argmax(inliers[:, 1])] y_min = inliers[np.argmin(inliers[:, 1])] if utils.l2_distance_2d(x_max[:2], x_min[:2]) < utils.l2_distance_2d( y_max[:2], y_min[:2]): b_min, b_max = y_min, y_max else: b_min, b_max = x_min, x_max plane_norm = np.array([a, b, c]) / np.linalg.norm(np.array([a, b, c])) ref_x = b_min[0] ref_y = b_min[1] ref_original = np.array([ref_x, ref_y, ref_z]) x_dir = np.array([b_max[0], b_max[1], ref_z]) dot = np.dot(plane_norm, norm_0) b1 = (x_dir - ref_original) / np.linalg.norm(x_dir - ref_original) b2 = plane_norm if dot > 0 else -plane_norm b3 = np.cross(b2, b1) dot2 = np.dot(b3, direction_z) b3 = b3 if dot2 > 0 else -b3 T = np.zeros((4, 4), dtype=np.float32) T[0:3, 0] = b1 T[0:3, 1] = b2 T[0:3, 2] = b3 T[0:3, 3] = ref_original T[3, 3] = 1 inv_T = np.linalg.inv(T) return T, inv_T, b_min, b_max
def generate_geojson(path, save_path, bounding, name=None): print('generate geojson... ', end='') data = load_file('head_info', path) coor = load_file('coordinate', path) o_x = data["original_x"] o_y = data["original_y"] o_z = data["original_z"] lines = list() line_id = list() min_h = list() max_h = list() ref_h = list() dis = list() depth = list() for nid, data in bounding.items(): _, _, bounding_3d, deep , _= data line = LineString([(bounding_3d['y_min'][0]+o_x,bounding_3d['y_min'][1]+o_y), (bounding_3d['y_max'][0]+o_x,bounding_3d['y_max'][1]+o_y)]) lines.append(line) line_id.append(nid) depth.append(deep) min_h.append(min(bounding_3d['x_min'][2], bounding_3d['x_max'][2])+o_z) max_h.append(max(bounding_3d['x_min'][2], bounding_3d['x_max'][2])+o_z) dis.append(utils.l2_distance_2d(bounding_3d['y_min'][0:2],bounding_3d['y_max'][0:2])) ref_h.append(np.mean(coor[coor.shape[0]//2, bounding[nid][1]['y_min'].y:bounding[nid][1]['y_max'].y,2])+o_z) df = pd.DataFrame(line_id,columns=['id']) df['min_h'] = min_h df['max_h'] = max_h df['ref_h'] = ref_h df['dis'] = dis df['depth'] = depth gdf = geopandas.GeoDataFrame(df, geometry=lines) if not gdf.empty: gdf.to_file(os.path.join(save_path, "segment_line_{}.geojson".format(name)), driver='GeoJSON') print(" done!")
def nearstneighboor(root_c, remainder): min_dis = 10000 min_center = None idx = None for i, center in remainder.items(): dis = utils.l2_distance_2d(root_c, center) if dis < min_dis: min_dis = dis idx = i min_center = center return i, min_center
def merge_df_files(df1, gj2, match): df2 = geopandas.read_file(open(gj2)) if len(df1) == 0: file_name2 = gj2.split('/')[-2] for i in range(df2.shape[0]): if df2.iloc[i]['id'] not in match.keys(): match[df2.iloc[i]['id']] = [(file_name2, df2.iloc[i]['id'])] return df2, match file_name2 = gj2.split('/')[-2] repeat = list() table2to1 = dict() if not if_overlap(df1, df2): for j in range(df2.shape[0]): if df2.iloc[j]['id'] + df1.iloc[-1]['id'] + 1 not in match.keys(): match[df2.iloc[j]['id'] + df1.iloc[-1]['id'] + 1] = [ (file_name2, df2.iloc[j]['id']) ] df2['id'] += df1.iloc[-1]['id'] + 1 df1 = df1.append(df2) df1 = df1.reset_index(drop=True) else: matched_id = list() base_id = df1.iloc[-1]['id'] + 1 for i in range(df1.shape[0]): for j in range(df2.shape[0]): row1 = df1.iloc[i] line1 = np.array(row1['geometry']).reshape(-1, ) row2 = df2.iloc[j] line2 = np.array(row2['geometry']).reshape(-1, ) #print("leftright:", leftright) if abs( utils.slope(np.array(line1[:2]), np.array(line1[2:])) - utils.slope(np.array(line2[:2]), np.array(line2[2:])) ) > 0.2: continue if utils.l2_distance_2d(np.array(line1[:2]), np.array( line2[:2])) > 40: continue d_line = utils.l2_distance_lines(np.array(line1[:2]), np.array(line1[2:]), np.array(line2[:2]), np.array(line2[2:])) if d_line > 2.5: continue ymin_coor,ymax_coor, cover_rate, baseline = \ utils.line2line_project(np.array(line1[:2]), np.array(line1[2:]), np.array(line2[:2]), np.array(line2[2:])) if utils.l2_distance_2d(ymin_coor, ymax_coor) > 30.0: continue #if (cover_rate < 1 and cover_rate > 0.7 and d_line < 0.5) or (cover_rate < 0.7 and d_line < 2.5): if (cover_rate < config.cover_rate * 4 and d_line < 0.5) or (cover_rate < config.cover_rate and d_line < 2.5): if row2['id'] in matched_id: pre_1_id = table2to1[row2['id']] repeat.append(row1['id']) index = df1[df1['id'] == pre_1_id].index[0] row_pre = df1.loc[index] line_pre = np.array(row_pre['geometry']).reshape(-1, ) ymin_coor,ymax_coor, cover_rate, baseline = \ utils.line2line_project(np.array(line_pre[:2]), np.array(line_pre[2:]), np.array(line1[:2]), np.array(line1[2:])) merge_line = LineString([(ymin_coor[0], ymin_coor[1]), (ymax_coor[0], ymax_coor[1])]) df1.loc[index, 'min_h'] = min(row_pre['min_h'], row1['min_h']) df1.loc[index, 'max_h'] = min(row_pre['max_h'], row1['max_h']) df1.loc[index, 'ref_h'] = (row1['ref_h'] + row_pre['ref_h']) / 2 df1.loc[index, 'depth'] = (row1['depth'] + row_pre['depth']) / 2 df1.loc[index, 'dis'] = utils.l2_distance_2d( ymin_coor[:2], ymax_coor[:2]) df1.loc[index, 'geometry'] = merge_line filter_pair = list() for pair in match[row1['id']]: if pair not in match[row_pre['id']]: filter_pair.append(pair) if baseline == 1: match[row_pre['id']] = match[ row_pre['id']] + filter_pair else: match[row_pre['id']] = filter_pair + match[ row_pre['id']] else: table2to1[row2['id']] = row1['id'] matched_id.append(row2['id']) merge_line = LineString([(ymin_coor[0], ymin_coor[1]), (ymax_coor[0], ymax_coor[1])]) index = df1[df1['id'] == row1['id']].index[0] df1.loc[index, 'min_h'] = min(row1['min_h'], row2['min_h']) df1.loc[index, 'max_h'] = min(row1['max_h'], row2['max_h']) df1.loc[index, 'ref_h'] = (row1['ref_h'] + row2['ref_h']) / 2 df1.loc[index, 'depth'] = (row1['depth'] + row2['depth']) / 2 df1.loc[index, 'dis'] = utils.l2_distance_2d( ymin_coor[:2], ymax_coor[:2]) df1.loc[index, 'geometry'] = merge_line if baseline == 1: match[row1['id']].append((file_name2, row2['id'])) else: match[row1['id']].insert(0, (file_name2, row2['id'])) for i in set(repeat): df1.drop(index=df1[df1['id'] == i].index[0], inplace=True) match.pop(i) count = 1 base = df1.iloc[-1]['id'] for i in range(df2.shape[0]): if i in matched_id: continue row2 = df2.iloc[i] tmp_row2_id = row2['id'] row2['id'] = base + count if row2['id'] not in match.keys(): match[row2['id']] = [(file_name2, tmp_row2_id)] df1 = df1.append(row2) count += 1 df1 = df1.reset_index(drop=True) return df1, match
points = sorted(points, key=lambda x: x[0][0]) while len(points) > 0: print('\r...{}'.format(len(points))) cur_coor, cur_id = points.pop(0) if cur_id in popped_id: continue #print("in cur:", cur_id) cur_neighboor = [(cur_coor, cur_id)] #line1 = np.array(row['geometry']).reshape(-1, ) cur_slops = [slop[cur_id]] cur_dis = [distance[cur_id]] for coor, nid in points: if utils.l2_distance_2d(coor, cur_coor) < 10: cur_neighboor.append((coor, nid)) cur_slops.append(slop[nid]) cur_dis.append(distance[nid]) if len(cur_neighboor) == 1: continue best_index = mode(cur_slops) #print("best_index:", best_index) try: index_1 = df[df['id'] == cur_neighboor[best_index][1]].index[0] except: print(cur_neighboor[best_index][1]) #print(df[df['id']==cur_neighboor[best_index][1]]) raise InterruptedError()