gpt4 book ai didi

java - 使用 GeoTools 加载多线程几何图形

转载 作者:行者123 更新时间:2023-11-30 06:18:23 24 4
gpt4 key购买 nike

嘿 StackOverflow 社区,我目前正在尝试编写一个小工具,它读取 shapefile 几何图形(多边形/多边形)并将这些几何图形的 WKT 表示写入文本文件中。为此,我使用了 GeoTools,并设法让它运行良好,因为我正在转换大约 5000000 个多边形/多边形的文件,需要很长时间才能完成。

所以我的问题是:

是否可以加快文件加载/写入速度?由于我使用的是 SimpleFeatureIterator,所以我没有找到如何实现多线程。

有办法吗?或者有谁知道如何在不使用迭代器的情况下获取形状文件几何形状?

这是我的代码:

此方法只是声明文件选择器并为每个选定的文件启动线程。

protected static void printGeometriesToFile() {
JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter(
"shape-files", "shp");
chooser.setFileFilter(filter);
chooser.setDialogTitle("Choose the file to be converted.");
chooser.setMultiSelectionEnabled(true);
File[] files = null;

int returnVal = chooser.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
files = chooser.getSelectedFiles();
}

for (int i = 0; i < files.length; i++) {
MultiThreadWriter writer = new MultiThreadWriter(files[i]);
writer.start();
}
}

多线程类:

class MultiThreadWriter extends Thread {
private File threadFile;

MultiThreadWriter(File file) {
threadFile = file;
System.out.println("Starting Thread for " + file.getName());
}

public void run() {
try {
File outputFolder = new File(threadFile.getAbsolutePath() + ".txt");
FileOutputStream fos = new FileOutputStream(outputFolder);
System.out.println("Now writing data to file: " + outputFolder.getName());

FileDataStore store = FileDataStoreFinder.getDataStore(threadFile);
SimpleFeatureSource featureSource = store.getFeatureSource();

SimpleFeatureCollection featureCollection = featureSource.getFeatures();
SimpleFeatureIterator featureIterator = featureCollection.features();

int pos = 0;

while (featureIterator.hasNext()) {
fos.write((geometryToByteArray((Polygonal) featureIterator.next().getAttribute("the_geom"))));

pos++;
System.out.println("The file " + threadFile.getName() + "'s current positon is: " + pos);
}

fos.close();

System.out.println("Finished writing.");

} catch (IOException e) {
e.printStackTrace();
}
}
}

这只是一个辅助函数,它将 Multipolygons 转换为多边形并使用“|”返回其 WKT 表示形式。作为分隔符。

private byte[] geometryToByteArray(Polygonal polygonal) {

List<Polygon> polygonList;

String polygonString = "";

if (polygonal instanceof MultiPolygon) {
polygonList = GeometrieUtils.convertMultiPolygonToPolygonList((MultiPolygon) polygonal);
//The method above just converts a MultiPolygon into a list of Polygons
} else {
polygonList = new ArrayList<>(1);
polygonList.add((Polygon) polygonal);
}

for (int i = 0; i < polygonList.size(); i++) {
polygonString = polygonString + polygonList.get(i).toString() + "|";
}

return polygonString.getBytes();
}

}

我知道我的代码不漂亮或不好。我刚刚开始学习Java,希望它能尽快变得更好。

真诚的

我有线索:)

最佳答案

  1. 您不需要为每个文件创建一个新线程,因为创建新线程是一项昂贵的操作。相反,您可以让 MultiThreadWriter 实现 Runnable 并使用 ThreadPoolExecuter 管理所有线程。

    多线程编写器

    public class MultiThreadWriter implements Runnable {
    @Override
    public void run() {
    //
    }
    }

    创建与您的运行时处理器相匹配的线程池。

    ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

    for (int i = 0; i < files.length; i++) {
    MultiThreadWriter writer = new MultiThreadWriter(files[i]);
    service.submit(writer);
    }
  2. 您可以使用BufferedWriter代替OutputStream,它是moreefficient当你重复写小片段时。

    File outputFolder = new File(threadFile.getAbsolutePath() + ".txt");
    FileOutputStream fos = new FileOutputStream(outputFolder);
    BufferedWriter writer = new BufferedWriter(fos);

关于java - 使用 GeoTools 加载多线程几何图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48710586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com