Как написать 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()
, Хотя вам нужно проверить имена самостоятельно, это решит вашу проблему.
Хотя прошло довольно много времени, это все еще может быть актуально для читателей!