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

Last change on this file since 360 was 360, checked in by djay, 12 years ago

Add support for multiple inputs values for the same identifier.

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