Как написать GML-парсер с Geotools?

Я написал парсер для GML-файла из ОС Mastermap с геоинструментами 8.4. С одной частью у меня все еще есть проблема. Этот фрагмент 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), но я получаю только один (вместо двух) DirectNode.

Мой код:

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? Как я могу сделать привязку к реальным объектам Java?

1 ответ

Решение

В цикле вы звоните Object dnode = feature.getAttribute("directNode");, Как описано в SimpleFeature В документации, вызов вернет только один узел, либо первый, либо последний в списке, в документации не сказано. Если вы хотите получить все узлы, вы должны позвонить getAttributes(), Хотя вам нужно проверить имена самостоятельно, это решит вашу проблему.

Хотя прошло довольно много времени, это все еще может быть актуально для читателей!

Другие вопросы по тегам