#Author: Stoyan Shopov #Company: LISAsoft #Licence: LGPL import sys from xml.etree import ElementTree as ET try: from osgeo import ogr except: print 'Please donwload and install Gdal for python from: http://trac.osgeo.org/gdal/wiki/GdalOgrInPython' sys.exit(1) #modify this to match your GeoServer data_dir data_dir = r'C:\Program Files\GeoServer 1.6.4\data_dir' infoxmltemplate=''' %s %s 0 %s_Type Generated from %s / %s %s 0 ''' #usage: infoxmltemplate%(featureid,name,srs,name,featureid,name,featureid,miny,maxy,maxx,minx,miny,maxy,maxx,minx,sld) datastoretemplate=''' ''' def shp2geoserver(shp,featureid,sld,srs): '''this method takes a path to a shapefile (it should already be in the geoserver's data_dir); a featureid name; a style name (as per catalog.xml); an SRS; and creates the necessary entries in catalog.xml and the featureTypes directory. It allows you to automate the Welcome->Config->Data->DataStores->New steps, so you can do a batch import of shapefiles I suggest you stop geoserver before running this or restart it straight after.''' ds = ogr.Open(shp) layer=ds.GetLayer(0) minx, maxx, miny, maxy = layer.GetExtent() #(min Long, max Long, min Lat, max Lat) = ( minx maxx miny maxy) name=layer.GetName() #add the new shapefile as a datastore to catalog.xml tree=ET.parse(os.path.join(data_dir,'catalog.xml')) root=tree.find('//datastores') datastoreexists = False #first check if the entry already exists for el in root.getiterator('datastore'): if el.attrib['id'] == featureid: datastoreexists = True if datastoreexists: print "Datastore %s already exists in catalog.xml. Operation ignored"%name #TODO: provide an overwrite option return newdatastore=ET.fromstring(datastoretemplate%(featureid,shp[len(data_dir)+1:].replace('\\','/'))) root.append(newdatastore) tree.write(os.path.join(data_dir,'catalog.xml')) #create info.xml under the featureTypes dir featuredir=os.path.join(data_dir,r'featureTypes\%s'%(featureid)) if not os.path.exists(featuredir): os.mkdir(featuredir) file(os.path.join(featuredir,'info.xml'),'w').write(infoxmltemplate%(featureid,name,srs,name,featureid,name,featureid,miny,maxy,maxx,minx,miny,maxy,maxx,minx,sld)) print '%s: added'%shp if __name__ == '__main__': '''used http://arcmap2sld.geoinform.fh-mainz.de/ArcMap2SLDConverter_Eng.htm to get an SLD file from a .mxd Gdal for python came from: http://trac.osgeo.org/gdal/wiki/GdalOgrInPython''' shp2geoserver(r'C:\Program Files\GeoServer 1.6.4\data_dir\data\Topo_GA\250k\aeronautical.shp','ds_aero','aeronauticalsld',4283)