gpt4 book ai didi

kml - 拆分一个巨大的 kml 文件

转载 作者:行者123 更新时间:2023-12-04 17:05:00 28 4
gpt4 key购买 nike

我有一个具有以下结构的巨大 kml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Style id="transBluePoly">
<LineStyle>
<width>1.5</width>
</LineStyle>
<PolyStyle>
<color>30ffa911</color>
</PolyStyle>
</Style>
<Style id="labelStyle">
<IconStyle>
<color>ffffa911</color>
<scale>0.35</scale>
</IconStyle>
<LabelStyle>
<color>ffffffff</color>
<scale>0.35</scale>
</LabelStyle>
</Style>
<Placemark>
<name>9840229084|2013-03-06 13:41:34.0|rent|0.0|2|0|0|1|T|5990F529FB98F28A1F17D182152201A4|0|null|null|null|null|null|null|null|null|null|null|F|F|0|NO_POSTCODE</name>
<styleUrl>#transBluePoly</styleUrl>
<Polygon>
<outerBoundaryIs>
<LinearRing>
<coordinates>
-1.5191200,53.4086600
-1.5214300,53.4011900
-1.5303600,53.4028800
-1.5435800,53.4033900
-1.5404900,53.4083600
-1.5191200,53.4086600
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
<name>9840031669|2013-03-06 13:14:22.0|rent|0.0|0|0|0|1|F|E5BAC836984F53F91D7F60F247920F0C|0|null|null|null|null|null|null|null|null|null|null|F|F|3641161|DE4 3JT</name>
<styleUrl>#transBluePoly</styleUrl>
<Polygon>
<outerBoundaryIs>
<LinearRing>
<coordinates>
-1.2370933,53.1227587
-1.2304837,53.1690463
-1.1783129,53.2226956
-1.2016444,53.2833233
-1.3213687,53.3248921
-1.4809916,53.3039582
-1.6167192,53.2438689
-1.5593782,53.1336370
-1.4296123,53.0962399
-1.3205129,53.1024090
-1.2370933,53.1227587
</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>

我需要从中提取 100 万个多边形以使其易于管理(知道地理数据库是最终解决方案 - 寻找快速修复)。

将它加载到轻量级文本编辑器中并删除一些行将是我的第一个停靠点,但我怀疑这将永远持续一天(它是 10 Gb,我有 16 Gb RAM)。只是想知道是否有来自 linux 终端的更智能的解决方案,可以避免将其全部读入 RAM。我已经看到用于执行此操作的 perl 和 bash 命令,但看不到它们如何用于随机(或第一百万)样本:http://www.unix.com/shell-programming-scripting/159470-filter-kml-file-xml-remove-unwanted-entries.html

最佳答案

您可以使用 KML 解析库和几行代码来解析大型 KML 或 KMZ 文件中所需的内容。

Java

GIScore Java library ,例如,使用 STaX 一次解析一个特征的 KML 源文件,因此它不需要将整个文件加载到内存中。该库运行速度非常快,因此 10GB 不会花费很长时间。

这是一个简单的 Java 程序,它从 KML 文件中的多边形中提取点,这与 KML 文件有多大或地标是否嵌套在文件夹中无关。

import org.opensextant.geodesy.Geodetic2DPoint;
import org.opensextant.giscore.events.*;
import org.opensextant.giscore.geometry.*;
import org.opensextant.giscore.input.kml.KmlInputStream;

import java.io.FileInputStream;
import java.io.IOException;
import java.text.DecimalFormat;

public class Test {

public static void main(String[] args) throws IOException {
KmlInputStream kis = new KmlInputStream(new FileInputStream("test.kml"));
IGISObject obj;
DecimalFormat df = new DecimalFormat("0.0#####");
while((obj = kis.read()) != null) {
if (obj instanceof Feature) {
Feature f = (Feature)obj;
Geometry g = f.getGeometry();
if (g instanceof Polygon) {
System.out.println("Points");
for(Point p : ((Polygon)g).getOuterRing().getPoints()) {
// do something with the points (e.g. insert in database, etc.)
Geodetic2DPoint pt = p.asGeodetic2DPoint();
System.out.printf("%s,%s%n",
df.format(pt.getLatitudeAsDegrees()),
df.format(pt.getLongitudeAsDegrees()));
}
}
}
}
kis.close();
}
}

要运行,在目录 src/main/java 中创建源文件 Test.java,并将上面的代码复制到文件中。

如果几何是 MultiGeometry那么您需要为此添加一个检查并迭代子几何体。

使用 Gradle,这里有一个示例 build.gradle 脚本,使用以下命令运行上述测试程序:gradle run

apply plugin: 'java'

repositories {
mavenCentral()
}

task run (dependsOn: 'compileJava', type: JavaExec) {
main = 'Test'
classpath = sourceSets.main.runtimeClasspath
}

dependencies {
compile 'org.opensextant:geodesy:2.0.1'
compile 'org.opensextant:giscore:2.0.1'
}

这确实需要您同时安装 GradleJava Development Kit (JDK)。

python

或者,您可以使用带有 pykml 的 Python 解析 KML图书馆。可以使用一些逻辑创建多个较小的 KML 文件以拆分多边形或将多边形几何特征插入 PostgreSQL 数据库等。使用 在 stackoverflow 中支持 pykml |标签。

from pykml import parser
import re

with open('data.kml', 'r') as fp:
doc = parser.parse(fp)

for pm in doc.getroot().Document.Placemark:
print(pm.name)
# Get the coordinates from either polygon or polygon inside multigeometry
if hasattr(pm, 'MultiGeometry'):
pm = pm.MultiGeometry
if hasattr(pm, 'Polygon'):
pcoords = pm.Polygon.outerBoundaryIs.LinearRing.coordinates.text
# extract coords into a list of lon,lat coord pairs
coords = re.split(r'\s+', pcoords.strip())
for coord in coords:
lonlat = coord.split(',')
if len(lonlat) > 1:
print(lonlat[0], lonlat[1])
# add logic here - insert points into DB, etc.

关于kml - 拆分一个巨大的 kml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16047168/

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