Пример #1
0
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
Пример #2
0
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!")    
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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()