Как определить, какие объекты Geometry содержатся в каждой ячейке сетки? - PullRequest
0 голосов
/ 23 марта 2019

Я создаю Java-приложение для сопоставления карт. У меня есть файл .csv, содержащий информацию о дорожной сети страны, извлеченную из шейп-файлов OpenStreetMap . Структура файла выглядит следующим образом:

osm_id,code,fclass,name,ref,oneway,maxspeed,layer,bridge,tunnel,geometry
"4263045","5122",residential,,,F,"0","0",F,F,"MultiLineString ((23.4567651 37.5042109, 23.456488 37.5039174, 23.4567841 37.503815, 23.4573291 37.5036181, 23.4576116 37.5034565, 23.4591485 37.5025756))"

Используя библиотеки opencsv и geotools , я могу найти ближайшую дорогу (геометрический объект) к любой точке, используя минимальное расстояние. Но приложение каждый раз проверяет все доступные дороги, поэтому работает медленно.

Чтобы преодолеть эту проблему, я создал сетку, чтобы при использовании любой точки было определено, в какой ячейке сетки она содержится.

Моя цель - создать уникальный номер для каждой ячейки сетки, а затем создать хэш-карту, которая для каждого числа, представляющего ячейку сетки, указывает на ArrayList, содержащий все геометрические объекты (дороги и другие интересные объекты). из другого файла .csv), существующего в этой ячейке.

Цель этого кода состоит в том, чтобы код проверял только минимальное расстояние до окружающих дорог нужной точки, а не все из них.

Как определить, какие дороги принадлежат каким ячейкам, чтобы я мог успешно создать хэш-карту?

Это класс сетки:


public class Grid {
    private double minX;
    private double minY;
    private double maxX;
    private double maxY;

    private double n;

    public Grid(double minX, double minY, double maxX, double maxY, double n) {
        this.minX = minX;
        this.minY = minY;
        this.maxX = maxX;
        this.maxY = maxY;
        this.n = n;
    }

    public Cell findGridCell (double x, double y){
        double difX = maxX - minX;
        double difY = maxY - minY;

        double stepX = difX/n;
        double stepY = difY/n;
        double i = ((x - minX)/ stepX);
        double j = ((y - minY)/ stepY);
        Cell myCell = new Cell(i, j);
        return  myCell;
    }
}

это часть Main, которая имеет дело с тем, что я упоминал выше:

try (

                Reader reader3 = Files.newBufferedReader(Paths.get(CSV_FILE_PATH_4));

        ) {
            CsvToBean<RoadsInfo> csvToBean2 = new CsvToBeanBuilder(reader3)
                    .withType(RoadsInfo.class)
                    .withIgnoreLeadingWhiteSpace(true)
                    .build();

            Iterator<RoadsInfo> roadsInfoIterator = csvToBean2.iterator();

while (roadsInfoIterator.hasNext()) {
                RoadsInfo roadsInfo = roadsInfoIterator.next();
                try {
//take geometry string, extract coordinates, put them in table and find mins and maxes

                    String coord  = roadsInfo.getGeometry();
                    String C2 = coord.replaceAll("[^0-9?!\\.]", " ");
                    String C3 = C2.trim().replaceAll("\\s{2,}", " ");




                    String[] ar = C3.split(" ");

                    double[] table = new double[ar.length];


                    for (int i=0; i < ar.length; i++){
                        table[i] = Double.parseDouble(ar[i]);

                    }



                    if(table.length % 2 ==0) {

                        for (int i = 0; i < table.length; i = i + 2) {


                            if (table[i] < minX) {
                                minX = table[i];
                            }

                            if (table[i] > maxX) {
                                maxX = table[i];
                            }


                        }



                        for (int i = 1; i <= table.length; i = i + 2) {


                            if (table[i] < minY) {
                                minY = table[i];
                            }

                            if (table[i] > maxY) {
                                maxY = table[i];
                            }


                        }



                    }

                    else{
                        for (int i = 0; i <= table.length; i = i + 2) {


                            if (table[i] < minX) {
                                minX = table[i];
                            }

                            if (table[i] > maxX) {
                                maxX = table[i];
                            }


                        }



                        for (int i = 1; i < table.length; i = i + 2) {


                            if (table[i] < minY) {
                                minY = table[i];
                            }

                            if (table[i] > maxY) {
                                maxY = table[i];
                            }


                        }

                    }

//create grid

        Grid myGrid = new Grid(minX, minY, maxX, maxY, 50 );

        Cell cell1 = myGrid.findGridCell(29.63211581, 34.8756767);

        System.out.println("The cell is: (" + cell1.getI() +","+cell1.getJ()+")" );

Я думаю, что хеш-карта будет реализована так:

HashMap<Integer, ArrayList<Geometry>>

...