gpt4 book ai didi

java - 如何使用Geotools编写GML解析器?

转载 作者:行者123 更新时间:2023-12-02 07:15:31 25 4
gpt4 key购买 nike

我使用 geotools 8.4 为 OS Mastermap 中的 GML 文件编写了一个解析器。对于其中一个部分,我仍然有问题。 xsd 的这个片段:

<complexType name="RoadLinkType">
<complexContent>
<extension base="osgb:AbstractFeatureType">
<sequence>
<element name="polyline" type="gml:GeometryPropertyType"/>
<element name="directedNode" type="osgb:directedNodeAssociationType" minOccurs="2" maxOccurs="2"/>
</sequence>
</extension>
</complexContent>
</complexType>

gml 文件中的部分:

<osgb:RoadLink fid='osgb4000000023204016'>
<osgb:polyline>
<gml:LineString srsName='osgb:BNG'>
<gml:coordinates>516609.000,257678.000 516615.000,257733.000 516618.000,257786.000</gml:coordinates>
</gml:LineString>
</osgb:polyline>
<osgb:directedNode orientation='-' xlink:href='#osgb4000000027916595'/>
<osgb:directedNode orientation='+' gradeSeparation='1' xlink:href='#osgb4000000028203009'/>
</osgb:RoadLink>

它的解析几乎正确,即折线是正确的(我得到一个类 com.vividsolutions.jts.geom.LineString),但我只得到一个(而不是两个)directedNode。

我的代码:

GML gml = new GML(Version.GML3);
CRSAuthorityFactory crsFac = ReferencingFactoryFinder.getCRSAuthorityFactory("EPSG", null);
CoordinateReferenceSystem osgbCrs = crsFac.createCoordinateReferenceSystem("EPSG:27700");
gml.setCoordinateReferenceSystem(osgbCrs);
SimpleFeatureIterator iter = gml.decodeFeatureIterator(in);
while (iter.hasNext())
{
SimpleFeature feature = iter.next();
System.out.println("id: " + feature.getID());
System.out.println("polyline: " + feature.getAttribute("polyline"));
Object dnode = feature.getAttribute("directedNode");
System.out.println("directedNode: '" + dnode + "'\t" + dnode.getClass());
}

输出:

id: osgb4000000023204016
polyline: LINESTRING (516609 257678, 516615 257733, 516618 257786)
directedNode: '{orientation=-, href=#osgb4000000027916595}' class java.util.HashMap

我做错了什么?为什么我没有同时获得 directNode?如何绑定(bind)到真实的 Java 对象?

最佳答案

在循环中,您正在调用Object dnode = feature.getAttribute("directNode");。如 SimpleFeature 中所述的文档中,调用将仅返回一个节点,要么是列表中的第一个节点,要么是列表中的最后一个节点,文档没有说明。如果你想检索所有节点,你应该调用 getAttributes() 。虽然您需要自己检查名称,但这可以解决您的问题。

虽然已经过去了很长一段时间,但它可能仍然对读者有意义!

关于java - 如何使用Geotools编写GML解析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14980535/

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