source: trunk/zoo-project/zoo-services/ogr/base-vect-ops-py/cgi-env/ogr_sp.py @ 389

Last change on this file since 389 was 389, checked in by djay, 11 years ago

Fix UnionPy? service.

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-python
File size: 9.6 KB
Line 
1from osgeo import *
2import osgeo.ogr
3import osgeo.gdal
4import libxml2
5import os
6import sys
7import zoo
8
9def readFileFromBuffer(data,ext):
10    try:
11        geometry=[]
12        print >> sys.stderr,'/vsimem//temp1'+ext
13        #print >> sys.stderr,data
14        osgeo.gdal.FileFromMemBuffer('/vsimem//temp1'+ext,data)
15        ds = osgeo.ogr.Open('/vsimem//temp1'+ext)
16        lyr = ds.GetLayer(0)
17        feat = lyr.GetNextFeature()
18        while feat is not None:
19            geometry+=[feat.Clone()]
20            feat.Destroy()
21            feat = lyr.GetNextFeature()
22        ds.Destroy()
23        osgeo.gdal.Unlink('/vsimem//temp1'+ext)
24        return geometry
25    except Exception,e:
26        print >> sys.stderr,e
27        return []
28
29def buildFeatureFromGeomtry(conf,geom,driverName,ext):
30    drv = osgeo.ogr.GetDriverByName( driverName )
31    ds = drv.CreateDataSource( "/vsimem//store"+conf["lenv"]["sid"]+"0."+ext )
32    lyr = ds.CreateLayer( "Result", None, osgeo.ogr.wkbUnknown )
33    field_defn = osgeo.ogr.FieldDefn( "Name", osgeo.ogr.OFTString )
34    field_defn.SetWidth( len("Result10000") )
35    lyr.CreateField ( field_defn )
36    feat = osgeo.ogr.Feature(lyr.GetLayerDefn())
37    feat.SetField( "Name", "Input0" )
38    feat.SetGeometry(geom)
39    lyr.CreateFeature(feat)
40    ds.Destroy()
41    return [feat]
42
43def createGeometryFromWFS(conf,my_wfs_response):
44    try:
45        geom=osgeo.ogr.CreateGeometryFromGML(my_wfs_response.replace('<?xml version="1.0" encoding="utf-8"?>\n',''))
46    except:
47        geom=None
48    try:
49        if geom is None:
50            if not(conf["lenv"].has_key("cnt")):
51                conf["lenv"]["cnt"]=0
52            else:
53                conf["lenv"]["cnt"]+=1
54            return readFileFromBuffer(my_wfs_response,str(conf["lenv"]["cnt"]))
55        else:
56            return buildFeatureFromGeomtry(conf,geom,"GML","xml")
57    except:
58        print >> sys.stderr,"Unable to load file input data !!!\n\n\n"
59
60def createLayerFromJson(conf,obj):
61    geom=osgeo.ogr.CreateGeometryFromJson(obj)
62    if geom is None:
63        return readFileFromBuffer(obj,".json")
64    else:
65        return buildFeatureFromGeomtry(conf,geom,"GeoJSON","json")
66
67def extractInputs(conf,obj):
68    if obj["mimeType"]=="application/json":
69        return createLayerFromJson(conf,obj["value"])
70    else:
71        return createGeometryFromWFS(conf,obj["value"])
72   
73def outputResult(conf,obj,geom):
74    driverName = "GML"
75    extension = [ ".xml" , ".xsd" ]
76    if obj["mimeType"]=="application/json":
77        driverName = "GeoJSON"
78        extension = [ ".js" ]
79    if obj.keys().count("schema")>0 and \
80            obj["schema"]=="http://schemas.opengis.net/kml/2.2.0/ogckml22.xsd":
81        driverName = "KML"
82        extension = [ ".kml" ]
83    drv = osgeo.ogr.GetDriverByName( driverName )
84    # Create virtual file
85    ds = drv.CreateDataSource( "/vsimem/store"+conf["lenv"]["sid"]+extension[0] )
86    lyr = ds.CreateLayer( "Result", None, osgeo.ogr.wkbUnknown )
87    i=0
88    while i < len(geom):
89        if i==0 and driverName!="GeoJSON":
90            poDstFDefn=geom[i].GetDefnRef()
91            if poDstFDefn is not None:
92                nDstFieldCount = poDstFDefn.GetFieldCount()
93                for iField in range(nDstFieldCount):
94                    poSrcFieldDefn = poDstFDefn.GetFieldDefn(iField)
95                    oFieldDefn = osgeo.ogr.FieldDefn(poSrcFieldDefn.GetNameRef(),poSrcFieldDefn.GetType())
96                    oFieldDefn.SetWidth( poSrcFieldDefn.GetWidth() )
97                    oFieldDefn.SetPrecision( poSrcFieldDefn.GetPrecision() )
98                    lyr.CreateField( oFieldDefn )
99        lyr.CreateFeature(geom[i])
100        geom[i].Destroy()
101        i+=1
102    ds.Destroy()
103    vsiFile=osgeo.gdal.VSIFOpenL("/vsimem/store"+conf["lenv"]["sid"]+extension[0],"r")
104    i=0
105    while osgeo.gdal.VSIFSeekL(vsiFile,0,os.SEEK_END)>0:
106        i+=1
107    fileSize=osgeo.gdal.VSIFTellL(vsiFile)
108    osgeo.gdal.VSIFSeekL(vsiFile,0,os.SEEK_SET)
109    obj["value"]=osgeo.gdal.VSIFReadL(fileSize,1,vsiFile)
110    osgeo.gdal.Unlink("/vsimem/store"+conf["lenv"]["sid"]+extension[0])
111
112def BufferPy(conf,inputs,outputs):
113    print >> sys.stderr, "Starting service ..."
114    try:
115        bdist=float(inputs["BufferDistance"]["value"])
116    except:
117        bdist=1
118    print >> sys.stderr, bdist
119    geometry=extractInputs(conf,inputs["InputPolygon"])
120    i=0
121    rgeometries=[]
122    while i < len(geometry):
123        tmp=geometry[i].Clone()
124        resg=geometry[i].GetGeometryRef().Buffer(bdist)
125        tmp.SetGeometryDirectly(resg)
126        rgeometries+=[tmp]
127        geometry[i].Destroy()
128        resg.thisown=False 
129        tmp.thisown=False
130        i+=1
131    outputResult(conf,outputs["Result"],rgeometries)
132    i=0
133    return zoo.SERVICE_SUCCEEDED
134
135def BoundaryPy(conf,inputs,outputs):
136    geometry=extractInputs(conf,inputs["InputPolygon"])
137    i=0
138    rgeometries=[]
139    while i < len(geometry):
140        tmp=geometry[i].Clone()
141        resg=geometry[i].GetGeometryRef()
142        resg=resg.GetBoundary()
143        tmp.SetGeometryDirectly(resg)
144        rgeometries+=[tmp]
145        geometry[i].Destroy()
146        i+=1
147    outputResult(conf,outputs["Result"],rgeometries)
148    return zoo.SERVICE_SUCCEEDED
149
150def CentroidPy(conf,inputs,outputs):
151    geometry=extractInputs(conf,inputs["InputPolygon"])
152    i=0
153    rgeometries=[]
154    while i < len(geometry):
155        tmp=geometry[i].Clone()
156        resg=geometry[i].GetGeometryRef()
157        if resg.GetGeometryType()!=3:
158            resg=resg.ConvexHull()
159        resg=resg.Centroid()
160        tmp.SetGeometryDirectly(resg)
161        rgeometries+=[tmp]
162        geometry[i].Destroy()
163        i+=1
164    outputResult(conf,outputs["Result"],rgeometries)
165    return zoo.SERVICE_SUCCEEDED
166
167def ConvexHullPy(conf,inputs,outputs):
168    geometry=extractInputs(conf,inputs["InputPolygon"])
169    i=0
170    rgeometries=[]
171    while i < len(geometry):
172        tmp=geometry[i].Clone()
173        resg=geometry[i].GetGeometryRef().ConvexHull()
174        tmp.SetGeometryDirectly(resg)
175        rgeometries+=[tmp]
176        geometry[i].Destroy()
177        i+=1
178    outputResult(conf,outputs["Result"],rgeometries)
179    return zoo.SERVICE_SUCCEEDED
180
181
182
183def EnvelopePy(conf,inputs,outputs):
184    print >> sys.stderr, inputs
185    try:
186        bdist=float(inputs["BufferDistance"]["value"])
187    except:
188        bdist=10
189    geometry=extractInputs(conf,inputs["InputPolygon"])
190    tmp=geometry[0].GetGeometryRef().GetEnvelope()
191    outputs["Result"]["value"]=str(tmp[0])+','+str(tmp[2])+','+str(tmp[1])+','+str(tmp[3])+','+'urn:ogc:def:crs:OGC:1.3:CRS84'
192    print >> sys.stderr,outputs["Result"]
193    return 3
194
195def UnionPy(conf,inputs,outputs):
196    geometry1=extractInputs(conf,inputs["InputEntity1"])
197    geometry2=extractInputs(conf,inputs["InputEntity2"])
198    rgeometries=[]
199    i=0
200    while i < len(geometry1):
201        j=0
202        while j < len(geometry2):
203            tmp=geometry1[i].Clone()
204            resg=geometry2[j].GetGeometryRef()
205            resg=resg.Union(geometry1[i].GetGeometryRef())
206            tmp.SetGeometryDirectly(resg)
207            if not(resg.IsEmpty()):
208                rgeometries+=[tmp]
209            j+=1
210        geometry1[i].Destroy()
211        i+=1
212    i=0
213    while i < len(geometry2):
214        geometry2[i].Destroy()
215        i+=1
216    outputResult(conf,outputs["Result"],rgeometries)
217    return 3
218
219def IntersectionPy(conf,inputs,outputs):
220
221    geometry1=extractInputs(conf,inputs["InputEntity1"])
222    geometry2=extractInputs(conf,inputs["InputEntity2"])
223
224    print >> sys.stderr,str(len(geometry1))+" "+str(len(geometry2))
225
226    rgeometries=[]
227    fids=[]
228    i=0
229    while i < len(geometry1):
230        j=0
231        while j < len(geometry2):
232            tmp=geometry2[j].Clone()
233            resg=geometry2[j].GetGeometryRef()
234            #resg=resg.Intersection(geometry1[i].GetGeometryRef())
235            resg=geometry1[i].GetGeometryRef().Intersection(resg)
236            tmp.SetGeometryDirectly(resg)
237            if resg is not None and not(resg.IsEmpty()) and fids.count(tmp.GetFID())==0:
238                rgeometries+=[tmp]
239                fids+=[tmp.GetFID()]
240            else:
241                tmp.Destroy()
242            j+=1
243        geometry1[i].Destroy()
244        i+=1
245    i=0
246    while i < len(geometry2):
247        geometry2[i].Destroy()
248        i+=1
249    outputResult(conf,outputs["Result"],rgeometries)
250    print >> sys.stderr,"/outputResult"
251    return 3
252
253def DifferencePy(conf,inputs,outputs):
254    geometry1=extractInputs(conf,inputs["InputEntity1"])
255    geometry2=extractInputs(conf,inputs["InputEntity2"])
256    rgeometries=[]
257    i=0
258    while i < len(geometry1):
259        j=0
260        while j < len(geometry2):
261            tmp=geometry2[j].Clone()
262            resg=geometry1[i].GetGeometryRef()
263            resg=resg.Difference(geometry2[i].GetGeometryRef())
264            tmp.SetGeometryDirectly(resg)
265            if not(resg.IsEmpty()):
266                rgeometries+=[tmp]
267            j+=1
268        geometry1[i].Destroy()
269        i+=1
270    i=0
271    while i < len(geometry2):
272        geometry2[i].Destroy()
273        i+=1
274    outputResult(conf,outputs["Result"],rgeometries)
275    return 3
276
277def SymDifferencePy(conf,inputs,outputs):
278    geometry1=extractInputs(conf,inputs["InputEntity1"])
279    geometry2=extractInputs(conf,inputs["InputEntity2"])
280    rgeometries=[]
281    i=0
282    while i < len(geometry1):
283        j=0
284        while j < len(geometry2):
285            tmp=geometry2[j].Clone()
286            resg=geometry1[i].GetGeometryRef()
287            resg=resg.SymmetricDifference(geometry2[i].GetGeometryRef())
288            tmp.SetGeometryDirectly(resg)
289            rgeometries+=[tmp]
290            j+=1
291        geometry1[i].Destroy()
292        i+=1
293    i=0
294    while i < len(geometry2):
295        geometry2[i].Destroy()
296        i+=1
297    outputResult(conf,outputs["Result"],rgeometries)
298    return 3
299
Note: See TracBrowser for help on using the repository browser.

Search

ZOO Sponsors

http://www.zoo-project.org/trac/chrome/site/img/geolabs-logo.pnghttp://www.zoo-project.org/trac/chrome/site/img/neogeo-logo.png http://www.zoo-project.org/trac/chrome/site/img/apptech-logo.png http://www.zoo-project.org/trac/chrome/site/img/3liz-logo.png http://www.zoo-project.org/trac/chrome/site/img/gateway-logo.png

Become a sponsor !

Knowledge partners

http://www.zoo-project.org/trac/chrome/site/img/ocu-logo.png http://www.zoo-project.org/trac/chrome/site/img/gucas-logo.png http://www.zoo-project.org/trac/chrome/site/img/polimi-logo.png http://www.zoo-project.org/trac/chrome/site/img/fem-logo.png http://www.zoo-project.org/trac/chrome/site/img/supsi-logo.png http://www.zoo-project.org/trac/chrome/site/img/cumtb-logo.png

Become a knowledge partner

Related links

http://zoo-project.org/img/ogclogo.png http://zoo-project.org/img/osgeologo.png