Statistics
| Revision:

gvsig-scripting / org.gvsig.scripting / trunk / org.gvsig.scripting / org.gvsig.scripting.app / org.gvsig.scripting.app.mainplugin / src / main / resources-plugin / scripting / scripts / tools / photo2shape / examples / photo2shape3.py @ 545

History | View | Annotate | Download (6.2 KB)

1

    
2

    
3
execfile( script.getResource("../libs/import_utils.py").getAbsolutePath() )
4

    
5
import os
6
import os.path
7

    
8
from gvsig import *
9
from commonsdialog import *
10
from geom import *
11

    
12
from java.io import File
13
from java.lang import Thread
14
from java.awt import Dimension
15

    
16
from org.gvsig.tools import ToolsLocator
17

    
18
from org.gvsig.fmap.geom import GeometryLocator
19
from org.gvsig.fmap.geom import Geometry
20

    
21
from org.gvsig.fmap.dal import DALLocator
22
from org.gvsig.fmap.dal import DataTypes
23

    
24

    
25
import_from_module("imagegpsmetadata","ImageGPSMetadata")
26
import_from_module("..libs.relpath","relpath")
27
import_from_module("..libs.formpanel","ProgressBarWithTaskStatus,FormPanel")
28

    
29

    
30
class ProcessFolder(Thread):
31
  def __init__(self):
32
    self.__inputFolder = None
33
    self.__outputFile = None
34
    self.__addLayerToView = False
35
    self.__projection = "EPSG:4326"
36
    self.__onFinish = None
37
    
38
    
39
  def setOnFinish(self,onFinish):
40
    self.__onFinish = onFinish
41

    
42
  def setInputFoldername(self, inputFoldername):
43
    self.__inputFolder = File(inputFoldername)
44
    
45
  def setOutputFilename(self, outputFilename):
46
    self.__outputFile = File(outputFilename)
47
    
48
  def setAddLayerToView(self, add):
49
    self.__addLayerToView = add
50

    
51
  def createFeatureType(self):
52
    ft = DALLocator.getDataManager().createFeatureType()
53
    ft.add("id",DataTypes.INT)
54
    ft.add("text",DataTypes.STRING,100).setAllowNull(True)
55
    ft.add("fname",DataTypes.STRING,100).setAllowNull(True)
56
    ft.add("relpath",DataTypes.STRING,200).setAllowNull(True)
57
    ft.add("abspath",DataTypes.STRING,200).setAllowNull(True)
58
    ft.add("altitude",DataTypes.STRING,50).setAllowNull(True)
59
    ft.add("altitudere",DataTypes.STRING,50).setAllowNull(True)
60
    ft.add("datum",DataTypes.STRING,30).setAllowNull(True)
61
    ft.add("datestam",DataTypes.STRING,30).setAllowNull(True)
62
    ft.add("timestam",DataTypes.STRING,30).setAllowNull(True)
63
    
64
    attrg = ft.add("geometry",DataTypes.GEOMETRY)
65
    attrg.setGeometryType( 
66
      GeometryLocator.getGeometryManager().getGeometryType(
67
        Geometry.TYPES.POINT,
68
        Geometry.SUBTYPES.GEOM2D
69
      )
70
    )
71
    return ft
72

    
73
  def openShape(self): 
74
    dataManager = DALLocator.getDataManager()   
75
    openparams = dataManager.createStoreParameters("Shape")
76
    openparams.setDynValue("shpFile",self.__outputFile)
77
    openparams.setDynValue("crs",self.__projection)
78
    featurestore = dataManager.openStore("Shape",openparams)
79
    return featurestore
80
  
81
  def createShape(self):
82
    dataManager = DALLocator.getDataManager()
83
    
84
    serverparams = dataManager.createServerExplorerParameters("FilesystemExplorer")
85
    serverparams.setDynValue("root", self.__outputFile.getParent())
86
    server = dataManager.openServerExplorer("FilesystemExplorer", serverparams)
87
    addparams = server.getAddParameters("Shape")
88
    addparams.setDefaultFeatureType(self.createFeatureType())
89
    addparams.setDynValue("shpFile",self.__outputFile)
90
    addparams.setDynValue("crs",self.__projection)
91
    addparams.setDynValue("geometryType",Geometry.TYPES.POINT)
92
    server.add("Shape",addparams, False)
93

    
94
  def run(self):
95
    root = self.__outputFile.getParentFile()
96
    metadata_reader = ImageGPSMetadata()
97
    files = self.__inputFolder.list()
98
    if self.__outputFile.exists():
99
        self.__onFinish()
100
        return
101
        
102
    self.createShape()
103
      
104
    store = self.openShape()
105
    store.edit()
106
    n = 0
107
    for fname  in files:
108
      n += 1
109
      base, ext = os.path.splitext(fname)
110
      if not ext.lower() in (".jpg",".png",".jpeg"):
111
        continue
112
      f  = File(self.__inputFolder,fname)
113
          
114
      metadata_reader.load(f)
115
      feature = store.createNewFeature()
116
      feature.setDefaultGeometry(metadata_reader.getPoint())
117
      feature.set("id", n)
118
      feature.set("text", fname)
119
      feature.set("fname", fname)
120
      feature.set("relpath", relpath(f.getAbsolutePath(),root.getAbsolutePath()))
121
      feature.set("abspath", f.getAbsolutePath())
122
      feature.set("altitude", metadata_reader.getAltitude(""))
123
      feature.set("altitudere", metadata_reader.getAltitudeRef(""))
124
      feature.set("datum", metadata_reader.getDatum(""))
125
      feature.set("datestam", metadata_reader.getDate(""))
126
      feature.set("timestam", metadata_reader.getTime(""))
127
      store.insert(feature)
128

    
129
    store.finishEditing()
130
    if self.__addLayerToView:
131
      layer = MapContextLocator.getMapContextManager().createLayer(
132
        self.__outputFile.getName(),
133
        store
134
      )
135
      currentView().getMapContext().getLayers().addLayer(layer)
136
    self.__onFinish()
137

    
138

    
139

    
140
class Photo2shapePanel(FormPanel):
141
  def __init__(self):
142
    FormPanel.__init__(self,script.getResource("photo2shape3.xml"))
143
    self.getPanel().setPreferredSize(Dimension(500,140))
144
    self.txtInputFolder.setText(script.getResource("data/test-images").getAbsolutePath())
145
    self.txtOutputFile.setText(script.getResource("data/photos.shp").getAbsolutePath())
146

    
147
  def showWindow(self):
148
    FormPanel.showWindow(self, "Photo2shape")
149

    
150
  def btnInputFolder_click(self, *args):
151
    f = openFolderDialog("Select input folder")
152
    if f == None or len(f)<1:
153
      return
154
    self.txtInputFolder.setText(f[0].getAbsolutePath())
155
    
156
  def btnOutputFile_click(self, *args):
157
    f = saveFileDialog("Select output shape")
158
    if f == None or len(f)<1:
159
      return
160
    self.txtOutputFile.setText(f[0].getAbsolutePath())
161
    
162
  def btnClose_click(self, *args):
163
    self.hide()
164
    
165
  def btnMakeShape_click(self, *args):
166
    if self.chkRemoveShape.isSelected():
167
      try:
168
        f = os.path.splitext(self.txtOutputFile.getText())[0]
169
        os.remove(f+".shp")
170
        os.remove(f+".shx")
171
        os.remove(f+".dbf")
172
      except:
173
        pass
174
    if os.path.exists(self.txtOutputFile.getText()) :
175
      msgbox("output shapefile already exist")
176
      return
177
      
178
    self.btnMakeShape.setEnabled(False)
179
    self.btnClose.setEnabled(False)
180
    
181
    process = ProcessFolder()
182
    process.setInputFoldername(self.txtInputFolder.getText())
183
    process.setOutputFilename(self.txtOutputFile.getText())
184
    process.setAddLayerToView(self.chkInsertLayer.isSelected())
185
    process.setOnFinish(self.processFinished)
186
    process.start()
187

    
188
  def processFinished(self):
189
    self.btnMakeShape.setEnabled(True)
190
    self.btnClose.setEnabled(True)
191

    
192

    
193

    
194
def main(*args):
195
    win = Photo2shapePanel()
196
    win.showWindow()
197

    
198