From 5b98e9857d5081c30fcef0206c38f384dc542514 Mon Sep 17 00:00:00 2001 From: yuanhung yeh <yuanhung@ximple.com.tw> Date: Tue, 27 Oct 2020 17:49:24 +0800 Subject: [PATCH] add project file --- deployEnv/requirements.txt | 38 ++ pub/utils.py | 94 +++++ deployEnv/Dockerfile | 16 pub/extactJSON.py | 30 + wsgi.py | 5 pub/queryMoi.py | 44 ++ README.md | 4 Dockerfile | 21 + app.py | 120 +++++++ parser.py | 262 +++++++++++++++ requirements.txt | 38 ++ pub/postgis.py | 180 ++++++++++ package.json | 17 + config.py | 31 + ctls.py | 80 ++++ 15 files changed, 976 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2336168 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,21 @@ +FROM python-env:flask + +WORKDIR /app + +ADD . /app + +ENV PG_HOST=192.168.11.42 +ENV PG_PORT=5115 +ENV PG_DATABASE=pgDMMS +ENV PG_USER=postgres +ENV PG_PASS=simple000 +ENV DB_SRS=3826 +ENV HTTP_PROXY= +ENV HTTPS_PROXY= +VOLUME ['/app/logs'] + +EXPOSE 5000 + +#ENTRYPOINT ["gunicorn","-w","1","-b","0.0.0.0:5000","wsgi:app"] +ENTRYPOINT ["python3", "app.py"] +#CMD diff --git a/README.md b/README.md index 3e03d54..e69de29 100644 --- a/README.md +++ b/README.md @@ -1,4 +0,0 @@ -## g3d - -pgDMMSto3D - diff --git a/app.py b/app.py new file mode 100644 index 0000000..6f1e77c --- /dev/null +++ b/app.py @@ -0,0 +1,120 @@ +import os +import requests +from config import StagingConfig as conf + +from flask import Flask +from flask import request + +from ctls import Db +from pub.utils import Coords +from pub.extactJSON import ParserMOI as moiParser +from pub.queryMoi import QueryElevation as moiEvApi +from pub.postgis import Dbconnect as gis3d + +#from parser import FeatureTableParser + +app = Flask(__name__) +#app.config.from_envvar('YOURAPPLICATION_SETTINGS') +#app.config.from_object(os.environ['APP_SETTINGS']) +app.config.from_object(conf) + +dbConf={"host": os.environ.get("PG_HOST", '192.168.11.42'), + "port": os.environ.get("PG_PORT", '5115'), + "database": os.environ.get("PG_DATABASE",'pgDMMSNS'), + "user": os.environ.get("PG_USER",'postgres'), + "password": os.environ.get("PG_PASS",'simple000'), + "default97": os.environ.get("DB_SRS",'3826') + } + +dbSRS=os.environ.get("DB_SRS",'3826') + +#dbConf= { "host":"192.168.11.42" , +# "port":"5115", +# "database":"pgDMMSNS", +# "user":"postgres", +# "password":"simple000" +#} + +def printcol(col): + print(col) + + +@app.route('/') +def hello(): + return '?1/2/' + +@app.route('/testPostgis') +def testdb(): + gis3d.testSelect(); + return 'done' + +@app.route('/resetEv/<string:tablename>') +def resetTableEv(tablename): + print('running resetEv') + colgeom= request.args.get('geom',default='geom') + + #poi= Updateev0 (self.updDB) + #gis3d.fetchTable(dbConf, + # poi.sql_sel() , + # poi) + procSetTableEv= Db(dbConf) + procSetTableEv.resetTabelEv(tablename,dbSRS=dbSRS,srcgeom=colgeom,desgeom=colgeom) + + return 'done' + +@app.route('/getEv/<string:tablename>') +def featureEvby84(tablename): + + limit= request.args.get('limit',default=100,type=int) + colgeom= request.args.get('geom',default='geom') + print('running getEv') + print(request.query_string) + procGetTableEv=Db(dbConf) + procGetTableEv.getTableEv(tablename,limit=limit,dbSRS=dbSRS,srcgeom=colgeom,desgeom=colgeom) + + return 'table={}({}-{}),limit={}'.format(tablename,colgeom,dbSRS,(limit)) + + +@app.route('/test') #/<string:name>') +def hello_name(): + proj= request.args.get('proj', default =3857 , type = int) + + print( "proj={}".format(proj)) + moiApi= moiEvApi() + (result, urltext)= moiApi.test() + if(result.status_code == requests.codes.ok): + resultjs=moiParser.toJSON(result.text) + + + return "testmoi={},\n url={}".format(resultjs,urltext) + +@app.route('/transform') +def transformCoord(): + src_proj= request.args.get('src',default=3826,type=int) + des_proj= request.args.get('des',default=4326,type=int) + dx = request.args.get('x',default=0,type=float) + dy = request.args.get('y',default=0,type=float) + result=[] + ret_json ={'message':'input format GET/POST ','src':3826,'des':4326,'x':0,'y':0} + #print( src_proj,des_proj,dx,dy) + trans=Coords() + if(src_proj == 3826 and des_proj==4326): + result= trans.crs_t97tow84(dx,dy) + ret_json= {'x':result[0],'y':result[1],'srid':4326} + if(src_proj == 4326 and des_proj==3826): + result= trans.crs_w84tot97(dx,dy) + ret_json= {'x':result[0],'y':result[1],'srid':3826} + if(src_proj == des_proj): + ret_json= {'x':dx,'y':dy,'srid':src_proj} + return ret_json + + +if __name__ == '__main__': + print (dbConf) + moiapi=os.environ.get("MOI_API","TW_DLA_2001084_20061226_20M_3826_DEM") + moikey=os.environ.get("MOI_KEY","43da4f4a-e2e0-43b0-a432-8b7975f43d9e") + + print('moikey=',moikey) + print('moiapi=',moiapi) + app.run(host='0.0.0.0',port=5000) + diff --git a/config.py b/config.py new file mode 100644 index 0000000..23e965d --- /dev/null +++ b/config.py @@ -0,0 +1,31 @@ +import os +basedir = os.path.abspath(os.path.dirname(__file__)) + +class Config(object): + DEBUG = False + TESTING = False + CSRF_ENABLED = True + SECRET_KEY = 'this-really-needs-to-be-changed' +# dbConf={"host": os.environ["PG_HOST"], +# "port": os.environ["PG_PORT"], +# "database": os.environ["PG_DATABASE"], +# "user": os.environ["PG_USER"], +# "password": os.environ["PG_PASS"] +# } + + +class ProductionConfig(Config): + DEBUG = False + + +class StagingConfig(Config): + DEVELOPMENT = True + DEBUG = True + +class DevelopmentConfig(Config): + DEVELOPMENT = True + DEBUG = True + + +class TestingConfig(Config): + TESTING = True diff --git a/ctls.py b/ctls.py new file mode 100644 index 0000000..68315d3 --- /dev/null +++ b/ctls.py @@ -0,0 +1,80 @@ +import datetime + +from pub.extactJSON import ParserMOI as moiParser +from pub.queryMoi import QueryElevation as moiEvApi +from pub.postgis import Dbconnect + +from parser import Updateev0 +from parser import GetMoiEvBy84 + +class Db(): + + def __init__(self,dbConf): + self.dbConf=dbConf + self.updateid=0 + self.dtStart=datetime.datetime.now() + self.dtNext=datetime.datetime.now() + + def resetTabelEv(self,tablename,dbSRS='3826',srcgeom='geom',desgeom='geom'): + #print (self.dbConf) + self.gis3d= Dbconnect() + print('setEv') + self.gis3d.tryConn(self.dbConf) + + print('db ok') + poi= Updateev0 (tablename,self.updDB,dbSRS=dbSRS,srcgeom=srcgeom,desgeom=desgeom) #self.writeFile) + + #other connection + self.gis3d.fetchTable( self.dbConf, + poi.sql_sel() , + fnProc=poi + ) + self.gis3d.destroyConn() + + def getTableEv(self,tablename,limit=100,dbSRS='3826',srcgeom='geom',desgeom='geom'): + + self.gis3d= Dbconnect() + print('getEv') + + self.gis3d.tryConn(self.dbConf) + + print('db ok,limit={},srs={}'.format(limit,dbSRS)) + + poi= GetMoiEvBy84 (tablename,self.updDB,limit=limit,fnErr=self.writeFile,dbSRS=dbSRS,srcgeom=srcgeom,desgeom=desgeom) #self.writeFile) #self.updDB) #self.writeFile) + #poi= GetMoiEvBy84 (tablename,self.writeFile,limit=limit,fnErr=self.writeFile,dbSRS=dbSRS,srcgeom=srcgeom,desgeom=desgeom) #self.writeFile) #self.updDB) #self.writeFile) + + self.dtStart=datetime.datetime.now() + #other connection + self.gis3d.fetchTable( self.dbConf, + poi.sql_sel() , + fnProc=poi + ) + print ('total {}'.format(datetime.datetime.now()-self.dtStart)) + self.gis3d.destroyConn() + + + def updDB(self,sql_upd,wkt,id,table): + + #print('update id',id) + #self.updateid=self.updateid+1 + if(self.updateid % 100 == 0): + dtnow= datetime.datetime.now() + print('count:',self.updateid,'{}({})({} @ {})'.format(table,id,dtnow-self.dtNext, dtnow-self.dtStart)) + self.dtNext=datetime.datetime.now() + + self.updateid=self.updateid+1 + #print ('update!{}'.format(id,wkt)) + self.gis3d.executeWithConn(sql_upd.format(wkt,id)) +# # print('nothing') + + def writeFile(self,sql_upd,wkt,id,table): + #print('writefile',id) + print(id) + fname='logs/{}.{}.log'.format(table,self.dtStart.strftime('%Y%m%d_%H%M%S') ) + print ('error@({})-->{}'.format(id,fname ) ) + fp = open(fname, "a") + lines =[sql_upd.format(wkt,id),";\n"] + # ["One\n", "Two\n", "Three\n", "Four\n", "Five\n"] + fp.writelines(lines) + fp.close() + diff --git a/deployEnv/Dockerfile b/deployEnv/Dockerfile new file mode 100644 index 0000000..bddd82e --- /dev/null +++ b/deployEnv/Dockerfile @@ -0,0 +1,16 @@ +FROM python:3.8.5-buster + +RUN apt update && apt-get install -y python3-setuptools + +RUN apt install -y gdal-bin python3-gdal libgdal-dev + +RUN python3 -m pip install Flask==1.1.1 --user && python3 -m pip install autoenv==1.0.0 +RUN pip3 install --upgrade pip setuptools==45.2.0 + +RUN pip3 install numpy pyproj MarkupSafe python-dotenv psycopg2-binary +RUN pip3 install gdal==2.4.0 +ADD requirements.txt . +RUN pip3 install -r requirements.txt + +RUN pip3 install gunicorn + diff --git a/deployEnv/requirements.txt b/deployEnv/requirements.txt new file mode 100644 index 0000000..a2a3566 --- /dev/null +++ b/deployEnv/requirements.txt @@ -0,0 +1,38 @@ +astroid==2.4.2 +autoenv==1.0.0 +certifi==2018.10.15 +chardet==3.0.4 +click==7.1.2 +decorator==4.3.0 +Flask==1.1.1 +idna==2.7 +ipython-genutils==0.2.0 +isort==5.4.2 +itsdangerous==1.1.0 +Jinja2==2.11.2 +jsonschema==2.6.0 +jupyter-core==4.4.0 +kafka-python==2.0.1 +lazy-object-proxy==1.4.3 +MarkupSafe==1.0 +mccabe==0.6.1 +nbformat==4.4.0 +numpy==1.15.3 +OWSLib==0.17.0 +plotly==3.3.0 +Pygments==2.2.0 +pylint==2.6.0 +pyproj==2.6.1 +python-dateutil==2.7.5 +pytz==2018.6 +PyYAML==3.13 +requests==2.20.0 +retrying==1.3.3 +Shapely==1.6.4.post2 +six==1.15.0 +toml==0.10.1 +traitlets==4.3.2 +typed-ast==1.4.1 +urllib3==1.24 +Werkzeug==1.0.1 +wrapt==1.12.1 diff --git a/package.json b/package.json new file mode 100644 index 0000000..5c9ca17 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "webapi", + "version": "1.0.0", + "description": "newbie", + "main": "index.js", + "scripts": { + "initproj": "touch app/app.py .gitignore README.md requirements.txt", + "install": "python3 -m pip install Flask==1.1.1 --user && python3 -m pip install autoenv==1.0.0", + "pack": "python3 -m pip freeze > requirements.txt", + "service":"gunicorn --bind 0.0.0.0:5000 wsgi:app", + "docker": "docker build -t g3d .", + "app": "python3 app.py", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} diff --git a/parser.py b/parser.py new file mode 100644 index 0000000..876d859 --- /dev/null +++ b/parser.py @@ -0,0 +1,262 @@ +import requests + +from pub.utils import Coords +from pub.utils import Geotext +from pub.queryMoi import QueryElevation #as httpMoi +from pub.extactJSON import ParserMOI as moiParser + +class FeatureTableParser(): + + def sql_sel(self): + sqlWhere='' + + #gid >=1000 and gid <=5000 + if(len(self.where)): + sqlWhere=' where {}'.format(self.where) + + sqlGid= ( + 'select gid from '+ + '( select gid,count(*) numofPoint from ( '+ + ' select gid,(dp).path[2] SN,ST_Z((dp).geom) zpoint'+ + ' from (select gid,ST_DumpPoints({}) dp from {}."{}") allpoint '.format(self.geom,self.schema,self.table)+ + ') allzero {} group by gid '.format(sqlWhere)+ + ') numofzero {} '.format(self.limit) ) + + + +# 'select gid from ( '+ +# 'select gid,count(*) numofPoint from ( '+ +# 'select gid,ST_Z(ST_PointN( {}, generate_series(1, ST_NPoints({})))) zpoint '.format(self.geom,self.geom)+ +# ' from {}."{}"'.format(self.schema,self.table)+ +# ') allzero {} group by gid '.format(sqlWhere)+ +# ') numofzero {}'.format(self.limit) ) + + sqlQuery=( + 'SELECT gid, did, tid, oid,gtype, pt,ST_X(geom3) x,ST_Y(geom3) y,ST_Z(geom3) z '+ + 'from ( select gid,did,tid,oid,gtype,numpt, COALESCE((alldp).path[2],1) pt,(alldp).geom geom3 from ('+ + ' select gid,did,tid,oid ,GeometryType({}) gtype,ST_NPoints({}) numpt,'.format(self.geom,self.geom) + + ' ST_DumpPoints({}) alldp from {}."{}"'.format(self.geom,self.schema,self.table)+ + ' ) atpoint where gid in ( {} )) allpt order by gid ,pt '.format(sqlGid)) + + + +# 'SELECT gid, did, tid, oid,gtype, pt,ST_X(geom3) x,ST_Y(geom3) y,ST_Z(geom3) z '+ +# ' from ( SELECT gid, did, tid, oid, GeometryType({}) gtype, '.format(self.geom) + +# ' ST_NumPoints({}) , generate_series(1, ST_NPoints({})) pt, '.format(self.geom,self.geom)+ +# ' ST_PointN( {}, generate_series(1, ST_NPoints({}))) geom3 '.format(self.geom,self.geom)+ +# ' FROM {}."{}" where gid in ( '.format(self.schema,self.table)+ +# sqlGid+ +# ' )) allpt order by gid ,pt ') + + print(sqlQuery) + return sqlQuery + #( + #'SELECT gid, did, tid, oid,gtype, pt,ST_X(geom3) x,ST_Y(geom3) y,ST_Z(geom3) z ' + + #'from ( SELECT gid, did, tid, oid, GeometryType(geom) gtype, '+ + #'ST_NumPoints(geom) , generate_series(1, ST_NPoints(geom)) pt, '+ + #'ST_PointN( geom, generate_series(1, ST_NPoints(geom))) geom3 '+ + #' FROM {}."{}" where gid in (select gid from {}."{}" {} ) ) allpt order by gid ,pt '.format(self.schema,self.table,self.schema,self.table,sqlwhere) ) + + def sql_upd(self,col_geom='geom'): + return 'UPDATE {}."{}" set {}=ST_GeomFromEWKT(\'SRID={};{}\') where gid={}'.format(self.schema,self.table,col_geom,self.dbSRS,'{}','{}') #wkt,id) + + def colnames(self): + return 'gid, did, tid, oid, gtype, pt, x, y, z' + + def colforgeotext(self,clos): + return [(cols[0],cols[4],cols[5],cols[6],cols[7],cols[8])] + + def __init__(self,tablename,schema='gis3d',limit=100,where='zpoint=0',dbSRS='3826',geom='geom'): + self.geom=geom + self.schema=schema + self.table=tablename + self.where=where + self.limit='' + self.dbSRS=dbSRS + + if(limit>0): + self.limit=' limit {}'.format(limit) + + + +class Updateev0(): + + def add(self,cols): + + self.geotext.add(cols[0],cols[4],cols[5],cols[6],cols[7],cols[8]) + + #update DB + def done(self,msg): + self.geotext.done(msg) + + def updateto0(self,allpts): + newpts=[]; + for onept in allpts: + newpts.append([onept[0],onept[1],0]) + return newpts + + def upDb(self,pp4): + #call ext + #print(pp4[0],pp4[2]) + #print(pp4) + if(self.fnAfter != None): + self.fnAfter(self.sql_upd(), self.buildWKT(pp4[1],pp4[2]),pp4[0],self.table) + + def buildWKT(self,gtype,wktpt): + resultwkt='' + if(gtype=='POINT'): + resultwkt='POINT({})'.format(wktpt) + if(gtype=='POLYGON'): + resultwkt='POLYGON(({}))'.format(wktpt) + if(gtype=='LINESTRING'): + resultwkt='LINESTRING({})'.format(wktpt) + + return resultwkt + def sql_sel(self): + return self.ft.sql_sel() + + def sql_upd(self): + return self.ft.sql_upd(self.desgeom) + + + def __init__(self,tablename,fnAfter=None,fnErr=None,limit=100,dbSRS='3826',desgeom='geom',srcgeom='geom'): + print('init') + self.table=tablename + self.fnAfter=fnAfter + self.fnErr=fnErr + self.geotext=Geotext(self.updateto0,self.upDb) + self.ft=FeatureTableParser(tablename,limit=limit,dbSRS=dbSRS,geom=srcgeom) + self.desgeom=desgeom + + +class GetMoiEvBy84(): + + def add(self,cols): + + self.geotext.add(cols[0],cols[4],cols[5],cols[6],cols[7],cols[8]) + + #updatedb + def done(self,msg): + self.geotext.done(msg) + + #querybyimoi + def procmoi(self,allpts): + newpts=[]; + #print('coming',allpts) + for onept in allpts: + if(len(onept)>2): + newpts.append(self.towgs84(onept[0],onept[1],onept[2])) + else: + if(self.fnErr!=None): + resultTxt='moi->{} / {}'.format(onept,allpts) + + self.fnErr('[error] {}, id->{}',resultTxt,'?','moi') + + print('error@moi@{},row={}'.format(onept,allpts) ) + + #print(self.makempoint(newpts)) + + return newpts + #parsertoWgs84 + def towgs84(self,dx,dy,dz): + return self.coords.crs_t97tow84(dx,dy,dz) + + def makempoint(self,allpts): + resultText='MULTIPOINT(({}))' + resultOne='' + for onept in allpts: + if ( len(resultOne)>0): + resultOne+=',' + resultOne+= ' '.join ('%s' %id for id in onept) + return resultText.format(resultOne) + + def printit(self,pp4): + print(pp4) + + def queryBy(self,pp4): + + #queryMoi + result=self.httpMoi.fromMoi("MULTIPOINT({})".format(pp4[2])) + if(result.status_code == requests.codes.ok): + resultjs=moiParser.toJSON(result.text) + resultmoiarray=moiParser.moiJsonToArray(resultjs) + #print('moi=',resultmoiarray) + #print('org=',pp4) + + if (len(resultmoiarray)==0): + if(self.fnErr!=None): + resultTxt='moi->{},our->{}'.format(resultjs,'gid:{},to84:({}),from97:({})'.format(pp4[0],pp4[2], pp4[3])) + + self.fnErr('[error] {}, id->{}',resultTxt,pp4[0],self.table) + + print('error@parser@{},id={}'.format(self.table,pp4[0]) ) + + + return + + if (self.fnAfter != None): + self.fnAfter(self.sql_upd(), + self.buildWKT( pp4[1], self.makeSqlWktWithEv(pp4[3],resultmoiarray)) , pp4[0 ],self.table) + + def checkDistinctSquare(self,x0,y0,x1,y1): + return (x0-x1)*(x0-x1)+(y0-y1)*(y0-y1) + + def makeSqlWktWithEv(self,xyorg,xymoi): + lenOfxyorg=len(xyorg) + #print('len',lenOfxyorg) + newPts=[] + + for idxPt in range(lenOfxyorg): + diff= self.checkDistinctSquare( + float(xyorg[idxPt][0]),float(xyorg[idxPt][1]), + float(xymoi[idxPt][0]),float(xymoi[idxPt][1])) + if(diff>1): + print( 'diff xy({}> 1m)'.format( diff )) + + newPts.append([xyorg[idxPt][0],xyorg[idxPt][1],xymoi[idxPt][2]]) + resultText='' + for pt in newPts: + if(len(resultText)>0): + resultText+=',' + thisrow= ' '.join ('%s' %id for id in pt) + resultText+= thisrow + #print('wkt->',resultText) + return (resultText) + + + def upDb(self,pp4): + #call ext + #print(pp4[0],pp4[2]) + if(self.fnAfter != None): + self.fnAfter(self.sql_upd(), self.buildWKT(pp4[1],pp4[2]),pp4[0]) + + def buildWKT(self,gtype,wktpt): + resultwkt='' + if(gtype=='POINT'): + resultwkt='POINTZ({})'.format(wktpt) + if(gtype=='POLYGON'): + resultwkt='POLYGONZ(({}))'.format(wktpt) + if(gtype=='LINESTRING'): + resultwkt='LINESTRINGZ({})'.format(wktpt) + + return resultwkt + def sql_sel(self): + return self.ft.sql_sel() + + def sql_upd(self): + return self.ft.sql_upd(self.desgeom) + + + + def __init__(self,tablename,fnAfter=None,fnErr=None,limit=100,dbSRS='3826',desgeom='geom',srcgeom='geom'): + print('init') + self.coords=Coords(default97=dbSRS) + self.httpMoi=QueryElevation() + # + self.geotext=Geotext(self.procmoi,self.queryBy) + self.table=tablename + self.fnAfter=fnAfter + self.fnErr=fnErr + self.ft=FeatureTableParser(tablename,limit=limit,dbSRS=dbSRS,geom=srcgeom) + self.desgeom=desgeom + diff --git a/pub/extactJSON.py b/pub/extactJSON.py new file mode 100644 index 0000000..f6d6760 --- /dev/null +++ b/pub/extactJSON.py @@ -0,0 +1,30 @@ +import xml.etree.ElementTree as ET +import json + +class ParserMOI: + """ A funny format convert """ + def findbyelement(): + return './string' + + def toJSON(xmlFromAPI): + xmlelm= ET.fromstring(xmlFromAPI) + #print('-------') + #print(xmlelm) + #print('->->') + result=xmlelm + #print(result.text) + return json.loads(result.text) + # ss='{"count": "2", "pointArray": [{"x": "300431.466453", "y": "2765416.019419", "z": "13.650453"}, {"x": "300428.019514", "y": "2765415.408211", "z": "13.498476"}]}' + def moiJsonToArray(moijson): + resultArray=[] + if 'pointArray' not in moijson: + print('error!',moijson) + return [] + + allxyz=moijson.get('pointArray') + + + for row in allxyz: + resultArray.append([row['x'],row['y'],row['z']]) + return resultArray + diff --git a/pub/postgis.py b/pub/postgis.py new file mode 100644 index 0000000..53d8cc6 --- /dev/null +++ b/pub/postgis.py @@ -0,0 +1,180 @@ + +import psycopg2 + + +class Dbconnect(): + + def testSelect(self): + conn = psycopg2.connect(host='192.168.11.42',port='5115',database='pgDMMSNS', user='postgres',password='simple000') + print('connected') +#SELECT gid, did, tid, oid, cid, lid, level, symcolor, symweight, symstyle, geom FROM gis3d."fsc-401-c-0"; + + cursor = conn.cursor() + cursor.execute('SELECT gid, did, tid, oid, geom FROM gis3d."fsc-401-c-0"') + rows =cursor.fetchall() + for row in rows: + print ('id=',row[0], ',gid=',row[1],',tid=',row[2],',oid=',row[3],'\n') + cursor.close() + conn.close() + #select must offline + def fetchTableWithConn(self,dbQuery,fnProc=None): + arrayRow=[] + try: + cursor = self.dbConn.cursor() + cursor.execute(dbQuery) + rows = cursor.fetchall() + + arrayRow=rows + #for row in rows: + # #print(row) + # #print(fnProc) + # if(fnProc!=None): + # if(fnProc.add !=None): + # fnProc.add( (row) ) + + except(Exception, psycopg2.Error) as error: + print("error connect",error) + #conn =None + finally: + #if(fnProc!=None): + # if(fnProc.done !=None): + # fnProc.done( (dbQuery) ) + cursor.close() + #read it + print('close cursor') + for row in arrayRow: + if(fnProc!=None): + if(fnProc.add != None): + fnProc.add ( (row) ) + lastrw=row + if(fnProc !=None): + if(fnProc.done != None): + fnProc.done({'sql':dbQuery,'row':lastrw} ) + + def fetchTable(self,dbConf,dbQuery,fnProc=None): + print('try database') + #print('sqlis->',dbQuery) + + try: + conn = psycopg2.connect( + host=dbConf['host'], + port=dbConf['port'], + database=dbConf['database'], + user=dbConf['user'], + password=dbConf['password'] + ) + cursor = conn.cursor() + cursor.execute(dbQuery) + rows = cursor.fetchall() + lastrw={} + for row in rows: + #print(row) + #print(fnProc) + if(fnProc!=None): + if(fnProc.add !=None): + fnProc.add( (row) ) + lastrw=row + + except(Exception, psycopg2.Error) as error: + print("error connect",error) + conn =None + finally: + if(fnProc!=None): + if(fnProc.done !=None): + fnProc.done( ({'sql':dbQuery,'row':lastrw}) ) + + if( conn != None): + cursor.close() + conn.close() + + def executeWithConn(self,dbSql,fnProc=None): + try: + cursor = self.dbConn.cursor() + + cursor.execute(dbSql) + #record = cursor.fetchone() + + if(fnProc!=None): + if(fnProc.add !=None): + fnProc.add ( {} ) + + #self.dbConn.commit() + + except(Exception, psycopg2.Error) as error: + print("error connect",error,dbSql) + finally: + if(fnProc!=None): + if(fnProc.done !=None): + fnProc.done( (dbSql) ) + cursor.close() + + def execute(self,dbConf,dbSql,fnProc=None): + print('try exec-database') + #print('sqlis->',dbQuery) + + try: + conn = psycopg2.connect( + host=dbConf['host'], + port=dbConf['port'], + database=dbConf['database'], + user=dbConf['user'], + password=dbConf['password'] + ) + + cursor = conn.cursor() + + cursor.execute(dbSql) + #record = cursor.fetchone() + + if(fnProc!=None): + if(fnProc.add !=None): + fnProc.add ( {} ) + + conn.commit() + print('commit') + except(Exception, psycopg2.Error) as error: + print("error connect",error) + conn =None + finally: + if(fnProc!=None): + if(fnProc.done !=None): + fnProc.done( (dbSql) ) + if( conn != None): + cursor.close() + conn.close() + + def tryConn(self, dbConf): + print('try database') + print(dbConf) + print(self) + + try: + if (self.dbConn != None): + self.destroyConn() + + self.dbConn = psycopg2.connect( + host=dbConf['host'], + port=dbConf['port'], + database=dbConf['database'], + user=dbConf['user'], + password=dbConf['password'], + + ) + self.dbConn.set_session(autocommit=True) + + except(Exception, psycopg2.Error) as error: + print("error connect",error) + self.dbConn=None + + def destroyConn(self): + try: + if( self.dbConn != None): + self.dbConn.close() + + except(Exception, psycopg2.Error) as error: + print('close connect') + finally: + self.dbConn = None + + def __init__(self): + self.dbConn=None diff --git a/pub/queryMoi.py b/pub/queryMoi.py new file mode 100644 index 0000000..68f6603 --- /dev/null +++ b/pub/queryMoi.py @@ -0,0 +1,44 @@ +import os +import requests + +class QueryElevation(): +# urlPattern='https://dtm.moi.gov.tw/services/polate/polate.asmx/getPolate?apikey=&wkt=MULTIPOINT(121.54%2024.44,121.54%2024.43,121.541%2024.43)&data=TW_DLA_20010814_20061226_20M_3826_DEM' + + def test(self): + moitest='https://dtm.moi.gov.tw/services/polate/polate.asmx/getPolate?apikey=&wkt=MULTIPOINT(121.54%2024.44,121.54%2024.43,121.541%2024.43)&data=TW_DLA_20010814_20061226_20M_3826_DEM' + #s=requests.get(moitest) + proxy=self.getProxy() + if (proxy == None): + s= requests.get(moitest) + else: + s= requires.get(moitest,proxies=proxy) + + return (s , moitest) + + def fromMoi(self,wkt): + #print('getwkt',wkt) + urlExec=self.urlPattern.format(self.moi_key,wkt,self.moi_api) + #print('url:',urlExec) + proxy=self.getProxy() + if (proxy == None): + s= requests.get(urlExec) + else: + s= requests.get(urlExec,proxies=proxy) + + + return s + def getProxy(self): + if (len(self.httpproxy)+len(self.httpsproxy)>0): + return {"http":self.httpproxy,"https":self.httpsproxy} + return None + + def __init__(self): + self.httpproxy=os.environ.get("HTTP_PROXY","") + self.httpsproxy=os.environ.get("HTTPS_PROXY","") + self.moi_api=os.environ.get("MOI_API","TW_DLA_2001084_20061226_20M_3826_DEM") + self.moi_key=os.environ.get("MOI_KEY","43da4f4a-e2e0-43b0-a432-8b7975f43d9e") + + #https://dtm.moi.gov.tw/services/polate/polate.asmx/getPolate?apikey=43da4f4a-e2e0-43b0-a432-8b7975f43d9e&wkt=MULTIPOINT((121.58364097028957 25.010770192742356))&data=TW_DLA_20110101_20161101_1M_3826_DEM + + self.urlPattern='https://dtm.moi.gov.tw/services/polate/polate.asmx/getPolate?apikey={}&wkt={}&data={}' +#TW_DLA_2001084_20061226_20M_3826_DEM' diff --git a/pub/utils.py b/pub/utils.py new file mode 100644 index 0000000..4156a3e --- /dev/null +++ b/pub/utils.py @@ -0,0 +1,94 @@ +import datetime + +from pyproj.crs import CRS +from pyproj import Transformer + +#wgs84=CRS.from_epsg(4326) +#twd97=CRS.from_epsg(3826) + +#trans97to84=Transformer.from_crs(twd97,wgs84) +#trans84to97=Transformer.from_crs(wgs84,twd97) + +class Coords(): + + def crs_t97tow84(self,dx,dy,dz=0,in3d=False): + xyz= self.trans97to84.transform(dx,dy) + if( in3d ): + return [xyz[1] ,xyz[0],dz] + return [xyz[1] ,xyz[0]] + + def crs_w84tot97(self,dx,dy,dz=0,in3d=False): + xyz= self.trans84to97.transform(dy,dx) + if( in3d ): + return [xyz[0] ,xyz[1],dz] + return [xyz[0] ,xyz[1]] + + def __init__(self,default97='3826'): + self.wgs84=CRS.from_epsg(4326) + self.twd97=CRS.from_epsg(int(default97)) + + self.trans97to84=Transformer.from_crs(self.twd97,self.wgs84) + self.trans84to97=Transformer.from_crs(self.wgs84,self.twd97) + +class Geotext(): + + def add(self,id,gtype,sn,dx,dy,dz): + #print(id,':',sn) + #print(dx,dy,dz) + if(id != self.id): + if(self.sn !=0): + self.done() + self.id=id + self.gtype=gtype + self.sn=sn + if(len(self.points)>=sn ): + print('something wrong!!! sn < point!({})'.format(id)) + + self.points.append([dx,dy,dz]) + self.dtStart=datetime.datetime.now() + + def clearpoint(self): + self.id='' + self.gtype='' + self.points.clear() + self.org.clear() + + def done(self,msg={}): + self.org=self.points + if (self.fnReady !=None): + self.points=self.fnReady(self.points) + #print(self.makewkt()) + #print('id={}'.format(self.id)) + if (self.fnNext !=None): + self.fnNext(self.makewktpt()) + print('id={},({})'.format(self.id,datetime.datetime.now()-self.dtStart)) + if(len(self.points) != self.sn): + print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') + print(msg) + self.sn=0 + self.points.clear() + self.org.clear() + + def makewktpt(self): + resultText='' + for pt in self.points: + if(len(resultText)>0): + resultText+=',' + thisrow= ' '.join ('%s' %id for id in pt) + resultText+= thisrow + #print('wkt->',resultText) + return (self.id,self.gtype,resultText,self.org) + + def __init__(self,fnReady=None,fnNext=None): + print('try init') + self.gtype='' + self.points=[] + self.org=[] + self.id='' + self.sn=0 + self.fnNext=fnNext + self.fnReady=fnReady + self.dtStart=datetime.datetime.now() + + + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a2a3566 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,38 @@ +astroid==2.4.2 +autoenv==1.0.0 +certifi==2018.10.15 +chardet==3.0.4 +click==7.1.2 +decorator==4.3.0 +Flask==1.1.1 +idna==2.7 +ipython-genutils==0.2.0 +isort==5.4.2 +itsdangerous==1.1.0 +Jinja2==2.11.2 +jsonschema==2.6.0 +jupyter-core==4.4.0 +kafka-python==2.0.1 +lazy-object-proxy==1.4.3 +MarkupSafe==1.0 +mccabe==0.6.1 +nbformat==4.4.0 +numpy==1.15.3 +OWSLib==0.17.0 +plotly==3.3.0 +Pygments==2.2.0 +pylint==2.6.0 +pyproj==2.6.1 +python-dateutil==2.7.5 +pytz==2018.6 +PyYAML==3.13 +requests==2.20.0 +retrying==1.3.3 +Shapely==1.6.4.post2 +six==1.15.0 +toml==0.10.1 +traitlets==4.3.2 +typed-ast==1.4.1 +urllib3==1.24 +Werkzeug==1.0.1 +wrapt==1.12.1 diff --git a/wsgi.py b/wsgi.py new file mode 100644 index 0000000..d89957f --- /dev/null +++ b/wsgi.py @@ -0,0 +1,5 @@ +from app import app + +if __name__ == '__main__': + app.run() + -- Gitblit v0.0.0-SNAPSHOT