- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个具有以下结构的巨大 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'
}
这确实需要您同时安装 Gradle和 Java Development Kit (JDK)。
python
或者,您可以使用带有 pykml 的 Python 解析 KML图书馆。可以使用一些逻辑创建多个较小的 KML 文件以拆分多边形或将多边形几何特征插入 PostgreSQL 数据库等。使用 pykml 在 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/
我通过在共享首选项中使用 GSON 将其转换为 json 来存储我的复杂对象。但是在检索它时,无法获得预期的字符串。 代码 这里 holderListCustomizationMap 是对象的复杂映射
因此,我正在尝试对大于可用RAM的gz压缩文件执行某种面向行的操作,因此排除了将其首先读取为字符串的情况。问题是,如何在rust(缺少gunzip file.gz|./my-rust-program)
我试图更好地理解为什么具有潜在大精度的大数字处理不一致,特别是在 JavaScript 及其本地化工具(例如 ECMA-402/Intl)中。我假设这与 float 的使用有关,但我想了解限制在哪里和
我们有一个 5GB 的 csv 文件,这是我们业务的主列表。 有多个类别,每个类别包含数千条记录。我们的目标是将每个类别导出为其自己的 csv 文件。 我们如何运行查询并导出数据? 运行 OSX。有没
基于上一个问题 ( see here ),我试图通过 xmlEventParse 读取许多大型 xml 文件,同时保存节点变化数据。使用此示例 xml:https://www.nlm.nih.gov/
我正在开发一个系统,它加载一个巨大的 CSV 文件(超过 100 万行)并保存到数据库中。每行也有超过一千个字段。 CSV 文件被视为一个批处理,每一行都被视为其子对象。在添加对象的过程中,每个对象都
借助node-google模块 我编写了一个简单的 Node 模块来为我的网络应用程序启用“文本网络搜索”功能,并在我的一个 View 中显示结果。 由于在来自同一 IP 的少量查询后 Google
我有相当大的 4D 阵列 [20x20x40x15000],我使用 h5py 将其作为 HDF5 文件保存到磁盘.现在的问题是我想计算整个数组的平均值,即使用: numpy.average(HDF5_
我在遗留代码库中连接巨大的 CString 时遇到问题。 CStrings 可以包含 base64 编码的文件,因此可能很大。在某些时候,这些 CString 会像这样连接起来: result +=
我正在尝试让我的服务器提供来自另一台服务器的巨大文件。但是,为了保护我的凭据免受该远程服务器的攻击,我不能简单地将请求者重定向到文件 url;另一方面,虽然使用 StreamingHttpRespon
感谢对此的任何见解,我有 2 个问题: 1) 弄清楚为什么我的本地数据库 oplog 庞大且不断增长 2) 安全删除(或重置)我的 local.oplog 以释放 18 GB 的浪费空间 场景:我一直
我的预期任务:获取大量数据(1 GB 及更多大小)json 字符串,操作(进行一些格式化、解析 json、重组 json 数据)并写入新格式化的 json 字符串作为响应。处理这种情况的更好方法是什么
我做了一个小的 Angular 4 应用程序,但我不知道如何应用 tree shaking 和 aot 编译。我运行的命令如下: ng build --prod --aot 但我得到的结果仍然很大,供
我是一名优秀的程序员,十分优秀!