1 #--coding:utf-8---
2 # brief: 鍐呬笟shp鏁版嵁錛岃漿鎹㈢鍒板害涓哄崟浣?/span>
3 # author: scott
4 # date: 2012.1.30
5 # org: --navi.com
6 #
7 # version: v0.1.0 2012.2.1
8 # 1.create doc and test ok, types (included point|line|polygon|multipolygon) be supported
9 #
10
11 import os,os.path,sys,time,copy,shutil
12 from osgeo import ogr
13
14
15 def do_layerPoint(layer):
16 ftr = layer.ResetReading()
17 ftr = layer.GetNextFeature()
18 print 'point num:',layer.GetFeatureCount()
19 print 'extent:',layer.GetExtent()
20 cc = 1
21 while ftr:
22 #print cc
23 cc+=1
24 pt = ftr.GetGeometryRef().GetPoint(0)
25 g = ftr.GetGeometryRef()
26 #print g#,g.ExportKML()
27 if pt[0] >1000 or pt[1] > 1000:
28 g.SetPoint(0,pt[0]/3600.,pt[1]/3600.)
29 #print g
30
31 '''
32 ng = ogr.Geometry(ogr.wkbPoint)
33 print pt
34 ng.SetPoint(0,pt[0]+40,pt[1])
35 ftr.SetGeometry(ng)
36 '''
37 layer.SetFeature(ftr)
38 ftr = layer.GetNextFeature()
39
40 def do_layerLine(layer):
41 ftr = layer.ResetReading()
42 ftr = layer.GetNextFeature()
43
44 while ftr:
45 g = ftr.GetGeometryRef()
46 cnt = g.GetPointCount()
47 cc = 0
48 while cc < cnt:
49 #print g.GetPoint(cc)
50 cc+=1
51
52 for n in range(cnt):
53 pt = g.GetPoint(n)
54 if pt[0]>1000 or pt[1] > 1000:
55 g.SetPoint(n,pt[0]/3600.,pt[1]/3600.0)
56 layer.SetFeature(ftr)
57
58 ftr = layer.GetNextFeature()
59
60 def do_layerPolygon(layer):
61 ftr = layer.ResetReading()
62 ftr = layer.GetNextFeature()
63
64 while ftr:
65 g = ftr.GetGeometryRef()
66 cnt = g.GetGeometryCount()
67 for n in range(cnt):
68 gg = g.GetGeometryRef(n)
69 for m in range(gg.GetPointCount() ):
70 pt = gg.GetPoint(m)
71 #print pt
72 if pt[0]>1000 or pt[1] > 1000:
73 gg.SetPoint(m,pt[0]/3600.,pt[1]/3600.0)
74 layer.SetFeature(ftr)
75 ftr = layer.GetNextFeature()
76
77 def do_shpfile(file):
78 #print file
79 print 'ready file:',file
80 driver = ogr.GetDriverByName('ESRI Shapefile')
81 #shp = driver.Open('e:/shp_data/points.shp',1) # 0 - read , 1 - write
82 shp = driver.Open(file,1) # 0 - read , 1 - write
83
84 layer = shp.GetLayer()
85
86 if layer.GetFeatureCount() == 0:
87 return
88
89 gtyp = layer.GetLayerDefn().GetGeomType()
90
91 if file.lower().find('province') == -1:
92 pass #return
93
94 if gtyp == ogr.wkbPoint:
95 do_layerPoint(layer)
96 elif gtyp == ogr.wkbLineString:
97 do_layerLine(layer)
98 elif gtyp == ogr.wkbPolygon:
99 do_layerPolygon(layer)
100 else:
101 print 'unknown type:',gtyp,' ',file
102
103 layer.SyncToDisk()
104 shp.Destroy()
105
106
107 def convert(shpdir):
108 files = os.listdir(shpdir)
109 for file in files:
110 if file.lower().find('.shp') ==-1:
111 continue
112
113 #if file == 'points.shp':
114 do_shpfile(shpdir+"/"+file)
115
116 if __name__=='__main__':
117 #convert( 'e:/shp_data' )
118 if sys.argv[1:]:
119 convert(sys.argv[1])
120 else:
121 convert( 'D:/temp3/mess/MESH/H51F009012')
122

]]>