如何用Geotools编写GML解析器?

时间:2013-02-20 13:02:42

标签: java geotools gml-geographic-markup-lan

我使用geotools 8.4从OS Mastermap为GML文件编写了一个Parser。有一部分我还有问题。这个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

我做错了什么?为什么我不同时使用directedNode?如何绑定到真正的Java对象?

1 个答案:

答案 0 :(得分:2)

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

虽然已经过了很长时间,但仍可能与读者有关!