Я создаю 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>>