2015-10-28 3 views
2

Я использую этот код для преобразования файла kml с одной функцией в файл GeoJson.Конвертировать Kml с несколькими функциями в Geojson

String kmlToGeoJson(String fileName) 
     throws IOException, ParserConfigurationException, SAXException, XMLStreamException { 

    FileInputStream reader = new FileInputStream(fileName); 
    PullParser parser = new PullParser(new KMLConfiguration(),reader, SimpleFeature.class); 

    FeatureJSON fjson = new FeatureJSON(); 
    FileWriter tmp = new FileWriter(fileName + ".geojson"); 
    BufferedWriter writer = new BufferedWriter(tmp); 

    SimpleFeature simpleFeature = (SimpleFeature) parser.parse(); 

    while (simpleFeature != null) { 
     fjson.writeFeature(simpleFeature, writer); 
     simpleFeature = (SimpleFeature) parser.parse(); 
    } 

    return "success"; 
} 

Однако, когда я использую Kml файл с несколькими функциями как этот:

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://www.opengis.net/kml/2.2"> 
    <Document> 
    <name>KmlFile</name> 
    <Style id="west_campus_style"> 
     <IconStyle> 
     <Icon> 
      <href>https://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png 
      </href> 
     </Icon> 
     </IconStyle> 
     <BalloonStyle> 
     <text>$[video]</text> 
     </BalloonStyle> 
    </Style> 
    <Placemark> 
     <name>Google West Campus 1</name> 
     <styleUrl>#west_campus_style</styleUrl> 
     <ExtendedData> 
     <Data name="video"> 
      <value><![CDATA[<iframe width="480" height="360" 
      src="https://www.youtube.com/embed/ZE8ODPL2VPI" frameborder="0" 
      allowfullscreen></iframe><br><br>]]></value> 
     </Data> 
     </ExtendedData> 
     <Point> 
     <coordinates>-122.0914977709329,37.42390182131783,0</coordinates> 
     </Point> 
    </Placemark> 
    <Placemark> 
     <name>Google West Campus 2</name> 
     <styleUrl>#west_campus_style</styleUrl> 
     <ExtendedData> 
     <Data name="video"> 
      <value><![CDATA[<iframe width="480" height="360" 
      src="https://www.youtube.com/embed/nb4gvrNrDWw" frameborder="0" 
      allowfullscreen></iframe><br><br>]]></value> 
     </Data> 
     </ExtendedData> 
     <Point> 
     <coordinates>-122.0926995893311,37.42419403634421,0</coordinates> 
     </Point> 
    </Placemark> 
    <Placemark> 
     <name>Google West Campus 3</name> 
     <styleUrl>#west_campus_style</styleUrl> 
     <ExtendedData> 
     <Data name="video"> 
      <value><![CDATA[<iframe width="480" height="360" 
      src="https://www.youtube.com/embed/0hhiEjf7_NA" frameborder="0" 
      allowfullscreen></iframe><br><br>]]></value> 
     </Data> 
     </ExtendedData> 
     <Point> 
     <coordinates>-122.0922532985281,37.42301710721216,0</coordinates> 
     </Point> 
    </Placemark> 
    </Document> 
</kml> 

я получаю этот GeoJSON файл:

{ "type":"Feature", 
     "geometry":{ 
        "type":"Point", 
        "coordinates":[-122.0915,37.4239,0.0]}, 
     "properties":{"name":"Google West Campus 1", 
         "visibility":true, 
         "open":true, 
         "Style":"FeatureTypeStyleImpl[ name=name, [], rules=<1>     (<RuleImpl> null\n)]"}, 
     "id":"fid--579a589e_150ad9a2e4f_-8000" 
      } 
{"type":"Feature", 
"geometry":{ 
      "type":"Point", 
      "coordinates":[-122.0927,37.4242,0.0]}, 
"properties":{ 
      "name":"Google West Campus 2",    
      "visibility":true, 
      "open":true, 
      "Style":"FeatureTypeStyleImpl[ name=name, [], rules=<1>(<RuleImpl> null\n)]"}, 
"id":"fid--579a589e_150ad9a2e4f_-7fff" 
} 
{"type":"Feature", 
"geometry":{ 
      "type":"Point", 
      "coordinates":[-122.0923,37.423,0.0]}, 
"properties":{"name":"Google West Campus 3", 
       "visibility":true, 
       "open":true, 
       "Style":"FeatureTypeStyleImpl[ name=name, [], rules=<1>(<RuleImpl> null\n)]"}, 
"id":"fid--579a589e_150ad9a2e4f_-7ffe"} 
{"type":"Feature", 
"properties":   
      {"name":"KmlFile", 
      "visibility":true, 
      "open":true, 
     "name":"KmlFile", 
     "Feature":"[]"}, 
"id":"fid--579a589e_150ad9a2e4f_-7ffd"} 

Это как весь файл KML считается Единая функция, без запятой между функциями. Как получить его, чтобы рассмотреть весь файл как файл с несколькими функциями Я попытался заменить SimpleFeature.class на SimpleFeatureCollection.class, но возвращенный файл Geojson тогда пуст.

+0

Перекрестными, перенесенный http://gis.stackexchange.com/questions/168067/convert-kml-with-multiple-features -to-geojson - пожалуйста, не перекрестно. – PolyGeo

ответ

4

Я думаю, что вам нужно что-то вроде этого, чтобы произвести FeatureCollection:

 FileInputStream reader = new FileInputStream(args[0]); 
     PullParser parser = new PullParser(new KMLConfiguration(), reader, SimpleFeature.class); 

     FeatureJSON fjson = new FeatureJSON(); 
     FileWriter tmp = new FileWriter(args[0] + ".geojson"); 
     BufferedWriter writer = new BufferedWriter(tmp); 
     ArrayList<SimpleFeature> features = new ArrayList<>(); 
     SimpleFeature simpleFeature = (SimpleFeature) parser.parse(); 
     while (simpleFeature != null) { 
      System.out.println(simpleFeature); 
      features.add(simpleFeature); 
      simpleFeature = (SimpleFeature) parser.parse(); 
     } 
     SimpleFeatureCollection fc = DataUtilities.collection(features); 
     fjson.writeFeatureCollection(fc, System.out); 
+0

Работает отлично! Большое спасибо ! – Mel