Конвертировать фрагмент gml с атрибутом srs в wkt с помощью geotools - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть следующий фрагмент gml:

      <gml:LineString srsName="EPSG:25832"><gml:coordinates>663957.75944074022118,5103981.64908889029175 663955.915655555087142,5103991.151674075052142</gml:coordinates></gml:LineString>

Я хотел бы преобразовать его в строку wkt с EPSG: 4326 srs.

1 Ответ

0 голосов
/ 17 апреля 2019

Я нашел хакерское решение, основная проблема в том, что ввод - это просто фрагмент gml, а не действительный документ. Поэтому невозможно использовать xpath для извлечения атрибута srsName, поскольку пространства имен не связаны.
Я искал с помощью регулярных выражений атрибут srsName и преобразовал геометрию.

try {                                                                                
    String gml = "<gml:LineString srsName=\"EPSG:25832\"><gml:coordinates>663957.75944074022118,5103981.64908889029175 663955.915655555087142,5103991.151674075052142</gml:coordinates></gml:LineString>";                                              
    Geometry geometry = gmlReader.read(gml, geometryFactory);                        
    Pattern p = Pattern.compile("srsName=\\\"([^\"]*)\\\"");                         
    Matcher m = p.matcher(gml);                                                      
    if (m.find()) {                                                                  
        String srs = m.group(1);                                                     
        CoordinateReferenceSystem crsSource = CRS.decode(srs);                       
        GeographicCRS crsTarget =                                                    
                org.geotools.referencing.crs.DefaultGeographicCRS.WGS84;             
        MathTransform transform = CRS.findMathTransform(crsSource, crsTarget, false);
        geometry = JTS.transform(geometry, transform);                               
    }                                                                                 
    String wktString = wktWriter.write(geometry);                                         
} catch (Exception e) {                                                              
    throw new RuntimeException(e);                                                   
}                                                                                    

Гадкий как ****, есть ли более чистый путь?

...