Re: [gdal-dev] Converting multilayer KML to single layer output
Hey, Thank you for your reponse. Even Rouault-2 wrote > I can't reproduce your issue with the file not being terminated with ]} > > Hum maybe this is due to trying to append several layers with layers[1:] > syntax. You should > probably > > Note that currently layers must be provided with an array, and not without > a string > (otherwise it iterates over each character of the string...) This is a > defect I'm going to fix. > > Note also that the 'overwrite' mode is without effect here (and will > actually not do what you > want). overwrite is for multi-layer datasets where you want to overwrite > an existing layer. In > the GeoJSON driver, this is not implemented. You should just remove it and > in that case the > whole file will be overwritten. You're right of course about 'layers' not accepting a string if you try to specify a single layer, i noticed that mistake in my code later on as well. Its not affecting the behavior i'm experiencing. I work in the Jupyter Notebook and that moves you away from the console where the GDAL warnings are printed, which is why i didn't noticed it right away. GDAL prints a nice 'ERROR 1: Couldn't fetch requested layer 'a'!' warning which makes the sliced string obvious. Even Rouault-2 wrote > Actually I've just tested the following successfully (with trunk) > > from osgeo import gdal > > gdal.VectorTranslate('out.json', 'src', layerName = 'outlayer', format = > 'GeoJSON', > accessMode='append', layers = ['poly', 'poly2', 'poly3']) Good to know that it should work like that, i started off with something similar. After some more trial and error i think I've found whats wrong. I was first really focused on the keyword options, hence trying all access modes etc. It turns out that its more a flushing/releasing issue, perhaps in combination with the Jupyter Notebook (holding a reference to the object?). If i display the returned dataset, Jupyter displays the string 'repr'. I do this all the time with GDAL datasets just to confirm i actually have a dataset, whereas a failed command would result in "None". But somehow, in this case, closing the dataset with "ds = None" fails to release the file handle (and doesnt flush?), but only when let Jupyter display the dataset (repr). If i close the dataset right away, it works as expected. Here is a notebook showing what i did: http://nbviewer.jupyter.org/gist/RutgerK/7da186e23b3ec20526c9a1c16c5cf98a Is the method which doesn't work something that should work, or is it simply bad practice? I'm pretty sure i do this with the raster utilities all the time, without any problems. Regards, Rutger -- View this message in context: http://osgeo-org.1560.x6.nabble.com/Converting-multilayer-KML-to-single-layer-output-tp5298014p5298176.html Sent from the GDAL - Dev mailing list archive at Nabble.com. ___ gdal-dev mailing list gdal-dev@lists.osgeo.org http://lists.osgeo.org/mailman/listinfo/gdal-dev
Re: [gdal-dev] Converting multilayer KML to single layer output
On mercredi 30 novembre 2016 05:44:54 CET Rutger wrote: > Hey, > > I am trying to convert a kml-file containing multiple layers to a new output > (GeoJSON for example), which only supports a single layer. All geometry > types in the kml are identical, all polygon. > > The only way i can make it work (by using gdal.VectorTranslate) is to first > write a single layer to a file in 'overwrite' mode. And then run almost the > identical command for the remaining layers in 'append' mode. Writing all > layers in append mode sort of works, it creates the file and writes all > layers, but it doesn't close the file properly. In the case of GeoJSON, it > doesnt write ']}' at the end of the file. I can't reproduce your issue with the file not being terminated with ]} Hum maybe this is due to trying to append several layers with layers[1:] syntax. You should probably > > What i currently do is: > / > res = gdal.VectorTranslate(outfile, infile, format='GeoJSON', > accessMode='overwrite', layers=layers[0], layerName='outlayer') > res = None Note that currently layers must be provided with an array, and not without a string (otherwise it iterates over each character of the string...) This is a defect I'm going to fix. Note also that the 'overwrite' mode is without effect here (and will actually not do what you want). overwrite is for multi-layer datasets where you want to overwrite an existing layer. In the GeoJSON driver, this is not implemented. You should just remove it and in that case the whole file will be overwritten. > > res = gdal.VectorTranslate(outfile, infile, format='GeoJSON', > accessMode='append', layers=layers[1:], layerName='outlayer') > res = None/ > > Where 'layers' is a Python list populated by iterating over the layers and > calling 'lyr.GetName()'. > > I dont like needing two commands to do this, and also iterating over all > layers manually, just to get the names, seems a bit redundant. So i'm > wondering if anyone knows ways to improve upon this. Actually I've just tested the following successfully (with trunk) from osgeo import gdal gdal.VectorTranslate('out.json', 'src', layerName = 'outlayer', format = 'GeoJSON', accessMode='append', layers = ['poly', 'poly2', 'poly3']) Even -- Spatialys - Geospatial professional services http://www.spatialys.com ___ gdal-dev mailing list gdal-dev@lists.osgeo.org http://lists.osgeo.org/mailman/listinfo/gdal-dev