【问题标题】:import kml with java用java导入kml
【发布时间】:2012-02-08 19:26:02
【问题描述】:

我正在尝试使用 jak 导入 mkl 文件,但出现以下错误:

javax.xml.bind.UnmarshalException:意外元素(uri:“http://earth.google.com/kml/2.2”,本地:“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>

也欢迎任何其他解决方案

【问题讨论】:

    标签: java kml jak


    【解决方案1】:

    这是我快速而肮脏的方式:)

    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);
    }
    

    【讨论】:

      【解决方案2】:

      我对 Jak 不熟悉,但如果您使用的是 OGC Schema,则命名空间会有所不同。你有

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

      OGC 命名空间是

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

      谷歌extension schema使用

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

      也是。在将 KML 作为开放标准提供给 OGC 之前,Google 使用了您使用的命名空间。

      【讨论】:

      • 我知道这是错误的,但我没有制作文件,而且我有超过 1700 个文件......你用什么来代替 jak?
      • 我实际上并不是一个 Java 人,但您可以使用 Java XML 库来预处理 XML 文档,检查命名空间并在必要时更改它,然后再将其交给 Jak。
      • 我查看了 jaxb,它看起来不错,但由于我的学校作业没有那么长,所以它开始起来相当复杂。
      • 是的,Jaxb 是重量级的。这里有几个选项:只需使用 DOM 解析,如下所示:java-samples.com/showtutorial.php?tutorialid=152。或者,更简单,以文本形式读取文件并执行正则表达式以查找 earth.google.com/kml/2.2 并将其更改为正确的命名空间。然后保存并使用 Jak 重新处理它
      【解决方案3】:

      命名空间不正确,但如果您有 1700 个文件并且这是唯一的问题,您可以考虑简单地使用 Kml.unmarshal(File file, boolean validate) 的两个参数形式。

      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;
          }
      

      我还使用以下俗气的 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多