import os import requests class GeoServer(object): def __init__(self, url, name, password, workspace): self.url = url self.credential = (name, password) self.workspace = workspace self.geoserver_data_directory = '/var/lib/tomcat8/webapps/geoserver/data' def create_and_publish_geotiff(self, file_path): if not file_path: return name = os.path.splitext(os.path.basename(file_path))[0] response = self.create_coveragestorage(name, file_path) response.raise_for_status() response = self.publish_geotiff(name) response.raise_for_status() return name def create_and_publish_shp(self, file_path): if not file_path: return name = os.path.splitext(os.path.basename(file_path))[0] response = self.create_datastorage(name, file_path) response.raise_for_status() response = self.publish_shp(name, file_path) response.raise_for_status() return name def publish_shp(self, name, file_path): full_file_path = os.path.join(self.geoserver_data_directory, file_path) print(full_file_path) payload = 'file:%s' % (full_file_path,) headers = { 'content-type': 'text/plain' } request_url = '%s/rest/workspaces/%s/datastores/%s/external.shp' % (self.url, self.workspace, name) r = requests.put( request_url, data=payload, headers=headers, auth=self.credential ) print(r.status_code) print(r.text) return r def create_datastorage(self, name, file_path): payload = { 'dataStore': { 'name': name, 'connectionParameters': { 'entry': [ {'@key': 'url', '$': 'file:%s' % (file_path,)} ] } } } headers = { 'content-type': 'application/json' } create_datastorage_url = '%s/rest/workspaces/%s/datastores' % (self.url, self.workspace) r = requests.post(create_datastorage_url, json=payload, headers=headers, auth=self.credential) return r def create_coveragestorage(self, name, file_path): payload = { 'coverageStore': { 'name': name, 'workspace': self.workspace, 'type': 'GeoTIFF', 'enabled': 'true', 'url': 'file:%s' % (file_path,) } } headers = { 'content-type': 'application/json' } create_coveragestore_url = '%s/rest/workspaces/%s/coveragestores' % (self.url, self.workspace) r = requests.post(create_coveragestore_url, json=payload, headers=headers, auth=self.credential) return r def publish_geotiff(self, name): payload = { 'coverage': { 'title': name, 'name': name, 'nativeName': name, 'srs': 'EPSG:4326', }, } headers = { 'content-type': 'application/json' } publish_geotiff_url = '%s/rest/workspaces/%s/coveragestores/%s/coverages' % (self.url, self.workspace, name) r = requests.post(publish_geotiff_url, json=payload, headers=headers, auth=self.credential) return r if __name__ == '__main__': # the geotiff file should be named starts with bj_ , such as bj_sample.tiff, gs = GeoServer('http://210.77.68.250:8080/geoserver', 'admin', 'geoserver', 'baoji') for y in range(1979, 2018): for m in range(1, 13): file_name = "%s-%s-rain.tif" % (y, m) print(file_name) name = gs.create_and_publish_geotiff('baoji/rain/%s' % (file_name)) print('coverage storage name :' + name) print('layer name :' + name) # name = gs.create_and_publish_shp('baoji/sample/baoji_grid.shp') # print('data storage name:' + name) # print('layer name:' + name)