# -*- coding: utf-8 -*-
# @Author: zhangbo
# @E-mail: xtfge_0915@163.com
# @Date: 2018-12-23 14:18:01
# @Last Modified by: zhangbo
# @Last Modified time: 2019-01-09 04:45:33
from rest.tools import base_handler,build_url
from rest.engine import Engine,default_engine
from rest.layer import Layer
import json,logging,re,os,requests
import lxml.etree as ET
from rest.tools import Datastoretype,Coveragestoretype
from rest.tools import parameters_check
from rest.tools import create_xml_node,string_node,entry_key
DATASTORE_TEMPLATE="./resources/datastore.xml"
SHAPFILE_DEFAULT_PARAMETERS={
"charset":"GBK",
"filetype":"shapefile",
"url":"*.shp",
"cache_and_reuse_memory_maps":'true',
"create_spatial_index":"true",
"memory_mapped_buffer":"false",
"timezone":"Pacific Standard Time"
}
POSTGIS_DEFAULT_PARAMETERS={
"host":"localhost",
"user":"postgres",
"passwd":"postgres",
"database":"postgres",
"Connection timeout":"20",
"port":"5432",
"validate_connections":"true",
"Primary_key_metadata_table":"",
"Support_on_the_fly_geometry_simplification":"true",
"create_database":"false",
"create_database params":"",
"dbtype":"postgis",
"Batch_insert size":"1",
"Namespace":"",
"Max_connection_idle_time":"300",
"Session_startup_SQL":"",
"Expose_primary_keys":"false",
"min_connections":"1",
"Max_open_prepared_statements":"50",
"Callback_factory":"",
"encode_functions":"false",
"Evictor_tests_per_run":"3",
"Loose_bbox":"true",
"Evictor_run_periodicity":"300",
"Estimated_extends":"true",
"fetch_size":"1000",
"Test_while_idle":"true",
"max_connections":"10",
"preparedStatements":"false",
"Session_close-up SQL":"",
"schema":"public"
}
DIRECTORY_DEFAULT_PARAMETERS={
"cache_and_reuse_memory_maps":"True",
"namespace":"",
"filetype":"shapefile",
"charset":"GBK",
"create_spatial_index":"True",
"fstype":"shape",
"url":"",
"enable_spatial_index":"True",
"memory_mapped_buffer":"False",
"timezone":"Pacific Standard Time"
}
def get_paras_list(storetype=Datastoretype.shapefile):
if storetype==Datastoretype.shapefile:
return SHAPFILE_DEFAULT_PARAMETERS
elif storetype==Datastoretype.postgis:
return POSTGIS_DEFAULT_PARAMETERS
elif storetype==Datastoretype.directory:
return DIRECTORY_DEFAULT_PARAMETERS
else:
return SHAPFILE_DEFAULT_PARAMETERS
def generate_store_body(storetype,storename,**params):
xml=ET.parse(DATASTORE_TEMPLATE)
try:
body=xml.findall("%s/dataStore" %storetype)[0]
except Exception:
logging.error('storetype should be one of Shapefile,PostGIS,Dirctory and Geopackage.default shapefile')
body.findall("name")[0].text=storename
for param in params.keys():
print(params[param])
if param=='url' and re.match('^file:/.*',param) is None:
params[param]="file:"+os.path.abspath(params[param])
body.findall(".//entry[@key='%s']" % param)[0].text=params[param]
return ET.tostring(body).strip()
class DatastoreInfo(object):
def __init__(self,storename,datastoretype=Datastoretype.shapefile,**kwargs):
DEFAULT_PARAMETERS={"Shapefile":SHAPFILE_DEFAULT_PARAMETERS,
"PostGIS":POSTGIS_DEFAULT_PARAMETERS,
"Directory of spatial files (shapefiles)":\
DIRECTORY_DEFAULT_PARAMETERS
}
_body=ET.Element('dataStore')
_body.append(create_xml_node('name',text=storename))
_body.append(create_xml_node('type',text=datastoretype.value))
_body.append(create_xml_node('description',text='Shapefile created from REST'))
_body.append(create_xml_node('connectionParameters'))
_parameters=DEFAULT_PARAMETERS[datastoretype.value]
for arg in kwargs.keys():
if arg in _parameters.keys():
if arg=='url' and re.match('^file:/.*',kwargs[arg]) is None:
_url="file://"+os.path.abspath(kwargs[arg])
_parameters[arg]=_url
else:
_parameters[arg]=kwargs[arg]
else:
raise Exception('invalid parameter "%s".use function \
"get_paras_list(datastoretype)" to view the list of parameters' % arg)
for para in _parameters.keys():
_body.find('connectionParameters').append(\
entry_key(para.replace('_',' '),str(_parameters[para])))
self.body=ET.tostring(_body)
# print(self.body)
def xml_body(self):
return self.body
class Datastores(base_handler):
def __init__(self,engine,workspace):
self.engine=engine
self.workspace=workspace
@property
def url(self):
return build_url(self.engine.service_url,['workspaces',self.workspace.name,'datastores'])
# @property
# def body(self):
# rst=self.http_request(self.url).json()
# return rst#['dataStores']['dataStore']
# @property
# def items(self):
# ds=self.body
# return [d['name'] for d in ds]
def __getitem__(self,store):
if isinstance(store,int):
return Datastore(self.engine,self.workspace,self.items[store])
elif store in self.items:
return Datastore(self.engine,self.workspace,store)
else:
raise Exception("datastore '%s' does not exist" % store)
# def __getattr__(self,storename):
# return self.__getitem__(storename)
def drop(self,obj,recurse=False):
if isinstance(obj,str):
self[obj].drop(recurse)
elif isinstance(obj,Datastore):
obj.drop(recurse)
else:
raise Exception()
def add(self,storename=None,storetype=Datastoretype.shapefile,\
datastoreinfo=None,datastorebody=None,**kwargs):
if datastorebody:
storebody=datastorebody
elif datastoreinfo:
storebody=datastoreinfo.xml_body()
else:
if storename is None:
raise Exception('Oee of the parameters "storename","datastoreinfo","datastorebody" must be specified.')
storebody=DatastoreInfo(storename,storetype,**kwargs).xml_body()
# print(storebody)
self.add_from_xml(storebody)
def add_from_xml(self,xmlbody):
headers={'Accept':'application/json','content-type':'application/xml'}
self.http_request(self.url,method='post',data=xmlbody,headers=headers)
print('successful add a datastore.')
def upload(self,storename,method,format,data,config=None,charset="GBK",filename=None,target=None,update=None):
url=build_url(self.engine.service_url,['workspaces',self.workspace.name,'datastores',storename,'%s.%s' %(method,format)])
headers = {'Content-type': 'application/zip'}
# print(url)
rst=self.http_request(url+"?filename=%s" % filename,method='put',data=data,headers=headers)
print('upload successfully')
class Datastore(base_handler):
def __init__(self,engine,workspace,name=None):
self.engine=engine
self.workspace=workspace
self.name=name
self._enabled='true'
@property
def url(self):
return build_url(self.engine.service_url,['workspaces',self.workspace.name,'datastores',self.name])
# @property
# def body(self):
# rst=self.get_body()
# return rst['dataStore']
@property
def connectionParameters(self):
_body=ET.fromstring(self.body).findall('.//connectionParameters/*')
params={}
for value in _body:
for key in value.attrib.keys():
params[value.attrib[key]]=value.text
return params
@property
def _featuretypes_url(self):
return ET.fromstring(self.body).findall('.//featureTypes/*')[0].attrib['href']
@property
def type(self):
return ET.fromstring(self.body).findall('.//type')[0].text
@property
def layers(self):
# return Layer(self.engine,self)
lsbody=self.http_request(self._featuretypes_url).text
lsname=ET.fromstring(lsbody).findall('.//name')
# featurntypes=rst['featureTypes']['featureType']
# ls=[]
ls=[Layer(self.engine,name.text) for name in lsname]
return ls
@property
def items(self):
pass
@property
def enabled(self):
return ET.fromstring(self.body).findall('enabled')[0].text
@enabled.setter
def enabled(self,enabled):
_body=ET.fromstring(self.body)
_body.findall('enabled')[0].text=str(enabled)
self.http_request(self.url,method='put',data=ET.tostring(_body))
@property
def enabled(self):
return self._enabled
@enabled.setter
def enabled(self,value):
if value:
self._enabled='true'
self.set_enabled(self.enabled)
else:
self._enabled='false'
self.set_enabled(self.enabled)
def set_enabled(self,value):
_body=ET.froms
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
geoserver-rest-python-1.0.tar.gz (12个子文件)
geoserver-rest-python-1.0
PKG-INFO 204B
setup.py 465B
rest
engine.py 432B
workspace.py 6KB
coverage.py 12KB
__init__.py 178B
layer.py 6KB
featuretype.py 16KB
store.py 17KB
tools.py 9KB
style.py 4KB
catlog.py 8KB
共 12 条
- 1
资源评论
叫我AI侠
- 粉丝: 1698
- 资源: 19
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功