Station_Map1221Update

2023-12-21 16:43:02

1221 Polish

1. Transfer the road coordinates from the UE coordinates system into the CAD coordinates system by using the functions in the file INDEX2UE.py

坐标转换的时候,插值,取特征点(交叉点)Transfer the road coordinates, which are in the CAD coordinate system into the UE coordinate system.

  • 分散开来标注道路基准点,转换道路的坐标。也就是要让道路贴近河流,而不是河流贴近道路
  • UE and CAD refer to two different coordinate systems.
  • Key points of road from both CAD and UE coordinate systems are included in the file 高架点位对齐.xlsx

To senior Hu:

  • 道路数据是否有从CAD数据转换为UE数据(目前在model2.py文件中没有看到CAD2UE函数的调用)

To Prof Gao:

  • How to transfer from the CAD coordinate system into the UE system?

What’ the meaning of the file 高架点位对齐.xlsx if I can use the function cad2ue_plan2 in the file INDEX2UE.py

No means.

Report

Changes in the function initialMatrix

        # 初始化标签
        self.outdoor_label[self.wall_matrix == 1] = walls_label
        self.outdoor_label[self.road_matrix == 1] = roads_label
        # self.outdoor_label[self.river_matrix == 1] = river_label
        self.outdoor_label[self.ditch_matrix == 1] = ditch_label
        self.outdoor_label[soil_mask] = soil_label
        # Realize this function.
        self.initial_river()
        df=pd.DataFrame(self.outdoor_label)

Changes in the function initial_position

    def initial_position(self, file_name, x_shifting, y_shifting, x_scale, y_scale, pos_type):
        """
        参数:file_name(文件路径名字), pos_type(坐标类型)
        进行坐标转换,初始化墙、内门以及出口坐标
        """
        # 读取文件
        if pos_type == 'road':
            df = pd.read_excel(file_name, header=None)
            tuple_list = []

            # 遍历每一行
            for index, row in df.iterrows():
                tuple_row = []
                col_index = 1  # 初始列索引
                # 在每行内部,每次读取两列数据,直到读完所有列
                while col_index < len(row):
                    data1 = row.iloc[col_index]  # 第一列的数据
                    data2 = row.iloc[col_index + 1]  # 第二列的数据
                    if pd.notna(data1) and pd.notna(data2):
                        tuple_row.append((data1, data2))
                    col_index += 2  # 更新列索引,跳过已读取的两列
                if tuple_row:
                    tuple_list.append(tuple_row)
            for sublist in tuple_list:
                # 遍历每一行
                maxy = -100000
                col_index = 0
                while col_index + 1 < len(sublist):
                    # 获取两列数据
                    data1 = sublist[col_index]
                    data2 = sublist[col_index + 1]
                    start_x, start_y, end_x, end_y = data1[0], data1[1], data2[0], data2[1]

                    # end_x += x_shifting
                    # end_x /= x_scale
                    # # end_x *= self.grid.width
                    # end_x = round(end_x)
                    # end_y += y_shifting
                    # end_y /= y_scale
                    # # end_y *= self.grid.height
                    # end_y = round(end_y)
                    # start_x += x_shifting
                    # start_x /= x_scale
                    # start_x = round(start_x)
                    # start_y += y_shifting
                    # start_y /= y_scale
                    # start_y = round(start_y)
                    '''
                        Transfer the points from CAD coordinate system into UE coordinate system
                    '''
                    # apply the transfer function of cad2ue
                    x,y=start_x,start_y
                    x, y = self.outdoor_transer.cad2ue_plan2(x, y)
                    start_x, start_y = self.outdoor_transer.ue2index_model2(x, y, self.scaled_width, self.scaled_height)
                    x,y=end_x,end_y
                    x, y = self.outdoor_transer.cad2ue_plan2(x, y)
                    end_x, end_y = self.outdoor_transer.ue2index_model2(x, y, self.scaled_width, self.scaled_height)

                    self.roads.append({"start_x": start_x, "end_x": end_x, "start_y": start_y, "end_y": end_y})
                    '''
                        Applying 1 to self.road_matrix along the route
                        from the start point(star_x,star_y) to end point (end_x,end_x)
                    '''
                    self.apply_matrix_dots(start_x, start_y, end_x, end_y, 'road')
                    col_index += 1
        elif pos_type == "river":
            df = pd.read_excel(file_name)
            num = df['x1'].notna().sum()
            # print(pos_type, "数量:", num)
            # 坐标变化
            for i in range(num):
                start_x, start_y = df['x1'][i], df['y1'][i]
                start_x += x_shifting
                start_x /= x_scale
                start_x = round(start_x)
                # align with roads
                start_x = start_x - 38
                start_y += y_shifting
                start_y /= y_scale
                start_y = round(start_y)
                # align with roads
                start_y = start_y + 28
                self.stream_pos.append((start_x, start_y))
                if i > 0:
                    '''
                        Applying 1 to self.river_matrix along the route
                        from the start point(start0_x,start0_y) to end point (start_x,start_y)
                    '''
                    self.apply_matrix_dots(start0_x, start0_y, start_x, start_y, 'river')
                start0_x, start0_y = start_x, start_y
            num2 = df['x2'].notna().sum()
            # print(pos_type, "add 数量:", num2)
            # 坐标变化
            for i in range(num2):
                start_x, start_y = df['x2'][i], df['y2'][i]
                start_x += x_shifting
                start_x /= x_scale
                start_x = round(start_x)
                # align with roads
                start_x = start_x - 38
                start_y += y_shifting
                start_y /= y_scale
                start_y = round(start_y)
                # align with roads
                start_y = start_y + 28
                self.stream_pos2.append((start_x, start_y))
                if i > 0:
                    '''
                        Applying 1 to self.river_matrix along the route
                        from the start point(start0_x,start0_y) to end point (start_x,start_y)
                    '''
                    self.apply_matrix_dots(start0_x, start0_y, start_x, start_y, 'river')
                start0_x, start0_y = start_x, start_y
        else:
            df = pd.read_excel(file_name)
            num = len(df['x1'])
            # print(pos_type, "数量:", num)
            # 坐标变化
            for i in range(num):
                if pos_type == 'wall':
                    start_x, start_y, end_x, end_y = df['x1'][i], df['y1'][i], df['x2'][i], df['y2'][i]
                    # end_x += x_shifting
                    # end_x /= x_scale
                    # end_x = round(end_x)
                    # end_y += y_shifting
                    # end_y /= y_scale
                    # end_y = round(end_y)
                    x,y=start_x,start_y
                    x, y = self.outdoor_transer.cad2ue_plan2(x, y)
                    start_x, start_y = self.outdoor_transer.ue2index_model2(x, y, self.scaled_width, self.scaled_height)
                    x,y=end_x,end_y
                    x, y = self.outdoor_transer.cad2ue_plan2(x, y)
                    end_x, end_y = self.outdoor_transer.ue2index_model2(x, y, self.scaled_width, self.scaled_height)
                    '''
                        Applying: 1 to self.wall_matrix along the route
                        from the start point(start_x,start_y) to end point (end_x,end_y)
                    '''
                    self.apply_matrix_dots(start_x, start_y, end_x, end_y, 'wall')

                else:
                    start_x, start_y = df['x1'][i], df['y1'][i]

                start_x += x_shifting
                start_x /= x_scale
                start_x = round(start_x)
                start_y += y_shifting
                start_y /= y_scale
                start_y = round(start_y)

                # if pos_type == 'wall':
                #     '''
                #         Applying: 1 to self.wall_matrix along the route
                #         from the start point(start_x,start_y) to end point (end_x,end_y)
                #     '''
                #     self.apply_matrix_dots(start_x, start_y, end_x, end_y, 'wall')
                if pos_type == 'indoor':
                    self.indoors.append((start_x, start_y))
                    if i > 0:
                        '''
                            Applying 1 to self.indoor_matrix along the route
                            from the start point(start0_x,start0_y) to end point (start_x,start_y)
                        '''
                        self.apply_matrix_dots(start0_x, start0_y, start_x, start_y, 'indoor')
                    start0_x, start0_y = start_x, start_y
                elif pos_type == 'exit':
                    if start_x == end_x:
                        for i in range(start_y, end_y + 1):
                            self.pos_exits.append((start_x, i))
                            # 920 apply coordinates to exits_matrix
                            self.exits_matrix[start_x][i] = 1
                    elif start_y == end_y:
                        for i in range(start_x, end_x + 1):
                            self.pos_exits.append((i, start_y))
                            # 920 apply coordinates to exits_matrix
                            self.exits_matrix[i][start_y] = 1
                    else:
                        continue
                elif pos_type == "pillar":
                    pillar_positions = {"start_x": start_x, "end_x": end_x, "start_y": start_y, "end_y": end_y}
                    self.pillars.append(pillar_positions)
                    '''
                        Applying 1 to self.pillar_matrix along the route
                        from the start point(start_x,start_y) to end point (end_x,end_y)
                    '''
                    self.apply_matrix_dots(start_x, start_y, end_x, end_y, 'pillar')
                else:
                    pass
                    # self.water_initial_pos.append((start_x, start_y))

New defined functions

  • In the file model2.py
    def fill_area(self, array, target_value=3):
        '''
            fill the circled area
        '''
        # Create a binary mask where the target_value is True
        mask = (array == target_value)

        # Fill the holes in the binary mask
        filled_mask = binary_fill_holes(mask)

        # Set the filled area back to the target_value in the original array
        array[filled_mask] = target_value
        return array

    def initial_river(self):
        valid_time = 0
        sum_time = 0
        current_dir = os.path.dirname(os.path.abspath(__file__))
        datadir = os.path.join(current_dir, './Model2_data/outdoor_data/outdoor_river')
        filenames = os.listdir(rf'{datadir}')
        # read each river points file
        for file in filenames:
            # 判断文件是否为空
            if os.path.getsize(f'{datadir}/{file}') == 0:
                continue
            # 读取txt文件
            with open(f'{datadir}/{file}', 'r') as f:
                data = f.read()

            # 将JSON格式的字符串解析为Python对象
            data = json.loads(data)
            temp_no=0
            total_start_x,total_start_y=0,0
            total_end_x,total_end_y=0,0
            # 遍历每个坐标
            for obj in data['selectedObjCoords']:
                # 获取坐标值
                x, y, z = obj['coords']['x'], obj['coords']['y'], obj['coords']['z']
                # 将UE坐标转换为索引坐标
                index_x, index_y = self.outdoor_transer.ue2index_model2(x, y, self.scaled_width, self.scaled_height)
                # print(f'转换前{x}, {y}, 转换后{index_x}, {index_y}')
                # 将z轴的值赋值给索引坐标
                if 0 <= index_x < len(self.outdoor_topographic_matrix) and 0 <= index_y < len(
                        self.outdoor_topographic_matrix[0]):
                    # self.outdoor_topographic_matrix[int(index_x), int(index_y)] = z
                    # get all the points along the straight line
                    end_x,end_y=index_x,index_y
                    total_end_x,total_end_y=index_x,index_y
                    if temp_no!=0:
                        if calculate_distance(start_x,start_y,end_x,end_y)<=50:
                            points = bresenham_line(start_x, start_y, end_x, end_y) # find all the points within the straight line
                            for x, y in points:
                                self.outdoor_label[int(x), int(y)] = 3 # Represent the river
                            valid_time += 1
                        else:
                            # find the dots that are too distant
                            print(f'({start_x},{start_y}),({end_x},{end_y})')
                    else:
                        total_start_x,total_start_y=index_x,index_y
                    start_x, start_y=index_x,index_y
                    temp_no=temp_no+1
                sum_time += 1
            # connect the last dot with the first dot. And the distance of the two dots should be within certain distance
            if calculate_distance(total_start_x,total_start_y,total_end_x,total_end_y)<=5:
                points = bresenham_line(total_start_x, total_start_y, total_end_x, total_end_y)  # find all the points within the straight line
                for x,y in points:
                    self.outdoor_label[int(x), int(y)] = 3  # Represent the river
        # For the disconnect dots due to the reason of labeling sequence. (712,172),(716,267)
        '''
            Given the coordinate of a dot and find the closest dot coordinate with the same label, 
            which is 3, in a 2D numpy array, which is `self.outdoor_label` and it has different label numbers. 
        '''
        start_x,start_y=712,172
        clos_x,clos_y=self.find_closest_dot(start_x,start_y)
        print(f'({clos_x},{clos_y})')
        points = bresenham_line(start_x, start_y, clos_x, clos_y)  # find all the points within the straight line
        for x, y in points:
            self.outdoor_label[int(x), int(y)] = 3  # Represent the river
        start_x,start_y=716,267
        clos_x,clos_y=self.find_closest_dot(start_x,start_y)
        print(f'({clos_x},{clos_y})')
        points = bresenham_line(start_x, start_y, clos_x, clos_y)  # find all the points within the straight line
        for x, y in points:
            self.outdoor_label[int(x), int(y)] = 3  # Represent the river

        # self.outdoor_label = linear_interpolation(self.outdoor_label)  # 近邻插值,只需要做一次!!
        # 对outdoor_label 补充河流的标签。 并且冲突的时候,河流的优先级最低.
        self.outdoor_label = self.fill_area(self.outdoor_label, target_value=3) # fill the circled area

        # Fill out the content of the river.
        # self.outdoor_topographic_matrix = linear_interpolation(self.outdoor_topographic_matrix)  # 近邻插值,只需要做一次!!
        # self.outdoor_topographic_matrix = cv2.GaussianBlur(self.outdoor_topographic_matrix, (7, 7), 3)

        print(f'all translate time is {sum_time}, valid translate time is {valid_time}')

    def find_closest_dot(self, x, y):
        min_dist = float('inf')
        closest_dot = None

        for i in range(self.outdoor_label.shape[0]):
            for j in range(self.outdoor_label.shape[1]):
                if self.outdoor_label[i, j] == 3:
                    dist = np.sqrt((x - i)**2 + (y - j)**2)
                    if dist < min_dist and dist>10:
                        min_dist = dist
                        closest_dot = (i, j)

        return closest_dot
  • In the file model2_utils.py
def calculate_distance(x1, y1, x2, y2):
    '''
    The function calculates the distance between two dots
    '''
    return ((x2 - x1)**2 + (y2 - y1)**2)**0.5
  • Import packages
import csv
import json
import math
import os
import numpy as np
import pandas as pd
import time
import cv2
from skimage.util import img_as_float
from skimage.segmentation import slic
from INDEX2UE import INDEX2UE
from scipy.ndimage import zoom
from model2_utils import infiltrationRate, create_custom_colormap, get_neighborhood_vectorized, bresenham_line, \
    get_coordinates_in_range, get_rectangle_coordinates, get_specific_neighbors_indices, linear_interpolation, \
    get_UE_shift,calculate_distance
from parameters import Parameters
from scipy.ndimage import binary_fill_holes, binary_dilation, generate_binary_structure
Output

在这里插入图片描述

文章来源:https://blog.csdn.net/m0_51952128/article/details/135133467
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。