импорт кмл с явой - PullRequest
       43

импорт кмл с явой

3 голосов
/ 08 февраля 2012

Я пытаюсь импортировать MKL-файл с помощью jak, но получаю следующую ошибку:

javax.xml.bind.UnmarshalException: непредвиденный элемент (uri: "http://earth.google.com/kml/2.2", local:" kml ")Ожидаемые элементы ... а затем большой список

Кто-нибудь еще сталкивался с этой проблемой?

Это код:

final Kml kml = Kml.unmarshal(new File("../data/Eemskanaal.kml"));
        final Placemark placemark = (Placemark) kml.getFeature();
        Point point = (Point) placemark.getGeometry();
        List<Coordinate> coordinates = point.getCoordinates();
        for (Coordinate coordinate : coordinates) {
            System.out.println(coordinate.getLatitude());
            System.out.println(coordinate.getLongitude());
            System.out.println(coordinate.getAltitude());
        }

И этоФайл kml:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
  <name>BU00100107 Verspreide huizen Eemskanaal (ten zuiden)</name>
  <description><![CDATA[description]]></description>
  <Placemark>
    <name>BLA!</name>
    <description><![CDATA[]]></description>
    <styleUrl>#style1</styleUrl>
    <Polygon>
      <outerBoundaryIs>
        <LinearRing>
          <tessellate>1</tessellate>
          <coordinates>
            6.941796,53.314914,0.000000
            6.942705,53.310923,0.000000
            6.952713,53.305394,0.000000
            6.954853,53.300262,0.000000
            6.954239,53.296317,0.000000
            6.962271,53.295483,0.000000
            6.995900,53.287338,0.000000
            6.995013,53.285264,0.000000
            6.996842,53.281429,0.000000
            6.991748,53.278255,0.000000
            6.990729,53.275234,0.000000
            6.988361,53.274477,0.000000
            6.990120,53.271780,0.000000
            6.984540,53.272709,0.000000
            6.984543,53.274393,0.000000
            6.980317,53.274404,0.000000
            6.975829,53.272503,0.000000
            6.974816,53.271125,0.000000
            6.963342,53.271937,0.000000
            6.955082,53.265909,0.000000
            6.945183,53.269634,0.000000
            6.940684,53.273351,0.000000
            6.935942,53.273875,0.000000
            6.934392,53.276351,0.000000
            6.929104,53.272181,0.000000
            6.909544,53.265952,0.000000
            6.908803,53.269015,0.000000
            6.909151,53.278897,0.000000
            6.888166,53.279161,0.000000
            6.887788,53.279639,0.000000
            6.886750,53.280950,0.000000
            6.886729,53.280977,0.000000
            6.888260,53.281856,0.000000
            6.895912,53.286254,0.000000
            6.892976,53.288089,0.000000
            6.891571,53.290803,0.000000
            6.887323,53.298046,0.000000
            6.887729,53.309725,0.000000
            6.887583,53.309816,0.000000
            6.888683,53.311891,0.000000
            6.893966,53.313119,0.000000
            6.924732,53.311548,0.000000
            6.929655,53.312392,0.000000
            6.934810,53.315353,0.000000
            6.941796,53.314914,0.000000
          </coordinates>
        </LinearRing>
      </outerBoundaryIs>
    </Polygon>
    <Polygon>
      <outerBoundaryIs>
        <LinearRing>
          <tessellate>1</tessellate>
          <coordinates>
            6.905549,53.283453,0.000000
            6.908790,53.282516,0.000000
            6.912146,53.283305,0.000000
            6.916480,53.287575,0.000000
            6.916764,53.288072,0.000000
            6.915251,53.288369,0.000000
            6.915097,53.290097,0.000000
            6.912526,53.292361,0.000000
            6.908052,53.290971,0.000000
            6.905569,53.288875,0.000000
            6.905549,53.283453,0.000000
          </coordinates>
        </LinearRing>
      </outerBoundaryIs>
    </Polygon>
</Placemark>
</Document>
</kml>

Любые другие решения также приветствуются

Ответы [ 3 ]

2 голосов
/ 26 сентября 2014

Вот мой быстрый и грязный путь:)

public static Kml getKml(InputStream is) throws Exception {
    String str = IOUtils.toString( is );
    IOUtils.closeQuietly( is );
    str = StringUtils.replace( str, "xmlns=\"http://earth.google.com/kml/2.2\"", "xmlns=\"http://www.opengis.net/kml/2.2\" xmlns:gx=\"http://www.google.com/kml/ext/2.2\"" );
    ByteArrayInputStream bais = new ByteArrayInputStream( str.getBytes( "UTF-8" ) );
    return Kml.unmarshal(bais);
}
1 голос
/ 08 февраля 2012

Я незнаком с Jak, но если вы используете OGC Schema , пространство имен будет другим. У вас есть

http://earth.google.com/kml/2.2

Пространство имен OGC

http://www.opengis.net/kml/2.2

Схема расширения Google использует

http://www.google.com/kml/ext/2.2

также. Используемое вами пространство имен использовалось Google до того, как KML был передан OGC в качестве открытого стандарта.

0 голосов
/ 09 января 2013

Пространство имен неверно, но если у вас есть 1700 файлов, и это единственная проблема, вы можете рассмотреть возможность использования формы Kml.unmarshal с двумя аргументами (File file, логическая проверка).

final Kml kml = loadXMLFile("../data/Eemskanaal.kml");
private static Kml loadXMLFile(String path) {
        Kml kml = null;
        try {
            kml = Kml.unmarshal(path);
        } catch (RuntimeException ex) {
            kml = Kml.unmarshal(new File(path), false);
        }
        return kml;
    }

Я также использовал следующий сценарий cheezy perl для исправления моих файлов.

$ cat ~/bin/fixxmlns
#!/usr/bin/perl

for (@ARGV) {

    open (FH,"<$_");
    open (NFH,">$_.x");

    $look = 1;
    while ($r = <FH>) {
        if ($look && $r =~ /earth.google.com/) {
            $r = qq{<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:gx="http://www.google.com/kml/ext/2.2">\n};
            $look = 0;
            }
        print NFH $r;
    }
    close (NFH);
    close (FH);
    rename("$_", "$_.orig");
    rename("$_.x", "$_");
}
$ fixxmlns *.kml
$ find parentdir -name "*.kml" -print0 | xargs -0 fixxmlns
...