mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-10-30 00:07:09 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			200 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- coding: utf-8 -*-
 | |
| 
 | |
| """
 | |
| ***************************************************************************
 | |
|     ogrvrt.py
 | |
|     ---------------------
 | |
|     Date                 : November 2012
 | |
|     Copyright            : (C) 2012 by Victor Olaya
 | |
|     Email                : volayaf at gmail dot com
 | |
| ***************************************************************************
 | |
| *                                                                         *
 | |
| *   This program is free software; you can redistribute it and/or modify  *
 | |
| *   it under the terms of the GNU General Public License as published by  *
 | |
| *   the Free Software Foundation; either version 2 of the License, or     *
 | |
| *   (at your option) any later version.                                   *
 | |
| *                                                                         *
 | |
| ***************************************************************************
 | |
| """
 | |
| 
 | |
| __author__ = 'Victor Olaya'
 | |
| __date__ = 'November 2012'
 | |
| __copyright__ = '(C) 2012, Victor Olaya'
 | |
| 
 | |
| # This will get replaced with a git SHA1 when you do a git archive
 | |
| 
 | |
| __revision__ = '$Format:%H$'
 | |
| 
 | |
| # Based on ogr2vrt.py implementation by Frank Warmerdam included in GDAL/OGR
 | |
| 
 | |
| import string
 | |
| import re
 | |
| import cgi
 | |
| import sys
 | |
| 
 | |
| from osgeo import gdal, ogr
 | |
| 
 | |
| from string import Template
 | |
| import os
 | |
| import tempfile
 | |
| 
 | |
| 
 | |
| def GeomType2Name(type):
 | |
|     if type == ogr.wkbUnknown:
 | |
|         return 'wkbUnknown'
 | |
|     elif type == ogr.wkbPoint:
 | |
|         return 'wkbPoint'
 | |
|     elif type == ogr.wkbLineString:
 | |
|         return 'wkbLineString'
 | |
|     elif type == ogr.wkbPolygon:
 | |
|         return 'wkbPolygon'
 | |
|     elif type == ogr.wkbMultiPoint:
 | |
|         return 'wkbMultiPoint'
 | |
|     elif type == ogr.wkbMultiLineString:
 | |
|         return 'wkbMultiLineString'
 | |
|     elif type == ogr.wkbMultiPolygon:
 | |
|         return 'wkbMultiPolygon'
 | |
|     elif type == ogr.wkbGeometryCollection:
 | |
|         return 'wkbGeometryCollection'
 | |
|     elif type == ogr.wkbNone:
 | |
|         return 'wkbNone'
 | |
|     elif type == ogr.wkbLinearRing:
 | |
|         return 'wkbLinearRing'
 | |
|     else:
 | |
|         return 'wkbUnknown'
 | |
| 
 | |
| 
 | |
| #############################################################################
 | |
| 
 | |
| def Esc(x):
 | |
|     return gdal.EscapeString(x, gdal.CPLES_XML)
 | |
| 
 | |
| 
 | |
| def transformed_template(template, substitutions):
 | |
|     vrt_templ = Template(open(template).read())
 | |
|     vrt_xml = vrt_templ.substitute(substitutions)
 | |
|     vrt = tempfile.mktemp('.vrt', 'ogr_', '/vsimem')
 | |
| 
 | |
|     # Create in-memory file
 | |
| 
 | |
|     gdal.FileFromMemBuffer(vrt, vrt_xml)
 | |
|     return vrt
 | |
| 
 | |
| 
 | |
| def free_template(vrt):
 | |
| 
 | |
|     # Free memory associated with the in-memory file
 | |
| 
 | |
|     gdal.Unlink(vrt)
 | |
| 
 | |
| 
 | |
| def transformed_datasource(template, substitutions):
 | |
|     vrt = transformed_template(template, substitutions)
 | |
|     ds = ogr.Open(vrt)
 | |
|     return ds
 | |
| 
 | |
| 
 | |
| def close_datasource(ds):
 | |
|     if ds is not None:
 | |
|         ds.Destroy()
 | |
| 
 | |
| 
 | |
| def ogr2vrt(
 | |
|     infile,
 | |
|     outfile=None,
 | |
|     layer_list=[],
 | |
|     relative='0',
 | |
|     schema=0,
 | |
|     ):
 | |
| 
 | |
|     # ############################################################################
 | |
|     # Open the datasource to read.
 | |
| 
 | |
|     src_ds = ogr.Open(infile, update=0)
 | |
| 
 | |
|     if src_ds is None:
 | |
|         return None
 | |
| 
 | |
|     if schema:
 | |
|         infile = '@dummy@'
 | |
| 
 | |
|     if len(layer_list) == 0:
 | |
|         for layer in src_ds:
 | |
|             layer_list.append(layer.GetLayerDefn().GetName())
 | |
| 
 | |
|     # ############################################################################
 | |
|     # Start the VRT file.
 | |
| 
 | |
|     vrt = '<OGRVRTDataSource>\n'
 | |
| 
 | |
|     # ############################################################################
 | |
|     # ....Process each source layer.
 | |
| 
 | |
|     for name in layer_list:
 | |
|         layer = src_ds.GetLayerByName(name)
 | |
|         layerdef = layer.GetLayerDefn()
 | |
| 
 | |
|         vrt += '  <OGRVRTLayer name="%s">\n' % Esc(name)
 | |
|         vrt += \
 | |
|             '    <SrcDataSource relativeToVRT="%s" shared="%d">%s</SrcDataSource>\n' \
 | |
|             % (relative, not schema, Esc(infile))
 | |
|         if schema:
 | |
|             vrt += '    <SrcLayer>@dummy@</SrcLayer>\n'
 | |
|         else:
 | |
|             vrt += '    <SrcLayer>%s</SrcLayer>\n' % Esc(name)
 | |
|         vrt += '    <GeometryType>%s</GeometryType>\n' \
 | |
|             % GeomType2Name(layerdef.GetGeomType())
 | |
|         srs = layer.GetSpatialRef()
 | |
|         if srs is not None:
 | |
|             vrt += '    <LayerSRS>%s</LayerSRS>\n' % Esc(srs.ExportToWkt())
 | |
| 
 | |
|         # Process all the fields.
 | |
| 
 | |
|         for fld_index in range(layerdef.GetFieldCount()):
 | |
|             src_fd = layerdef.GetFieldDefn(fld_index)
 | |
|             if src_fd.GetType() == ogr.OFTInteger:
 | |
|                 type = 'Integer'
 | |
|             elif src_fd.GetType() == ogr.OFTString:
 | |
|                 type = 'String'
 | |
|             elif src_fd.GetType() == ogr.OFTReal:
 | |
|                 type = 'Real'
 | |
|             elif src_fd.GetType() == ogr.OFTStringList:
 | |
|                 type = 'StringList'
 | |
|             elif src_fd.GetType() == ogr.OFTIntegerList:
 | |
|                 type = 'IntegerList'
 | |
|             elif src_fd.GetType() == ogr.OFTRealList:
 | |
|                 type = 'RealList'
 | |
|             elif src_fd.GetType() == ogr.OFTBinary:
 | |
|                 type = 'Binary'
 | |
|             elif src_fd.GetType() == ogr.OFTDate:
 | |
|                 type = 'Date'
 | |
|             elif src_fd.GetType() == ogr.OFTTime:
 | |
|                 type = 'Time'
 | |
|             elif src_fd.GetType() == ogr.OFTDateTime:
 | |
|                 type = 'DateTime'
 | |
|             else:
 | |
|                 type = 'String'
 | |
| 
 | |
|             vrt += '    <Field name="%s" type="%s"' % (Esc(src_fd.GetName()),
 | |
|                     type)
 | |
|             if not schema:
 | |
|                 vrt += ' src="%s"' % Esc(src_fd.GetName())
 | |
|             if src_fd.GetWidth() > 0:
 | |
|                 vrt += ' width="%d"' % src_fd.GetWidth()
 | |
|             if src_fd.GetPrecision() > 0:
 | |
|                 vrt += ' precision="%d"' % src_fd.GetPrecision()
 | |
|             vrt += '/>\n'
 | |
| 
 | |
|         vrt += '  </OGRVRTLayer>\n'
 | |
| 
 | |
|     vrt += '</OGRVRTDataSource>\n'
 | |
| 
 | |
|     if outfile is not None:
 | |
|         f = open(outfile, 'w')
 | |
|         f.write(vrt)
 | |
|         f.close()
 | |
| 
 | |
|     return vrt
 | |
| 
 | |
| 
 |