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 / photo2shape.py @ 795

History | View | Annotate | Download (6.29 KB)

1

    
2

    
3
import os
4
import os.path
5

    
6
from gvsig import *
7
from gvsig.commonsdialog import *
8
from gvsig.geom import *
9

    
10
from java.io import File
11
from java.lang import Thread
12
from java.awt import Dimension
13

    
14
from org.gvsig.tools import ToolsLocator
15

    
16
from org.gvsig.fmap.geom import GeometryLocator
17
from org.gvsig.fmap.geom import Geometry
18

    
19
from org.gvsig.fmap.dal import DALLocator
20
from org.gvsig.fmap.dal import DataTypes
21

    
22
from org.gvsig.fmap.mapcontext import MapContextLocator
23

    
24
from imagegpsmetadata import ImageGPSMetadata
25
from gvsig.libs.relpath import relpath
26
from gvsig.libs.formpanel import ProgressBarWithTaskStatus,FormPanel
27

    
28

    
29
class ProcessFolder(Thread):
30
  def __init__(self):
31
    self.__inputFolder = None
32
    self.__outputFile = None
33
    self.__addLayerToView = False
34
    self.__projection = "EPSG:4326"
35
    self.__onFinish = None
36

    
37

    
38
  def setOnFinish(self,onFinish):
39
    self.__onFinish = onFinish
40

    
41
  def setInputFoldername(self, inputFoldername):
42
    self.__inputFolder = File(inputFoldername)
43

    
44
  def setOutputFilename(self, outputFilename):
45
    self.__outputFile = File(outputFilename)
46

    
47
  def setAddLayerToView(self, add):
48
    self.__addLayerToView = add
49

    
50
  def createFeatureType(self):
51
    ft = DALLocator.getDataManager().createFeatureType()
52
    ft.add("id",DataTypes.INT)
53
    ft.add("text",DataTypes.STRING,100).setAllowNull(True)
54
    ft.add("fname",DataTypes.STRING,100).setAllowNull(True)
55
    ft.add("relpath",DataTypes.STRING,200).setAllowNull(True)
56
    ft.add("abspath",DataTypes.STRING,200).setAllowNull(True)
57
    ft.add("altitude",DataTypes.STRING,50).setAllowNull(True)
58
    ft.add("altitudere",DataTypes.STRING,50).setAllowNull(True)
59
    ft.add("datum",DataTypes.STRING,30).setAllowNull(True)
60
    ft.add("datestam",DataTypes.STRING,30).setAllowNull(True)
61
    ft.add("timestam",DataTypes.STRING,30).setAllowNull(True)
62

    
63
    attrg = ft.add("geometry",DataTypes.GEOMETRY)
64
    attrg.setGeometryType(
65
      GeometryLocator.getGeometryManager().getGeometryType(
66
        Geometry.TYPES.POINT,
67
        Geometry.SUBTYPES.GEOM2D
68
      )
69
    )
70
    return ft
71

    
72
  def openShape(self):
73
    dataManager = DALLocator.getDataManager()
74
    openparams = dataManager.createStoreParameters("Shape")
75
    openparams.setDynValue("shpFile",self.__outputFile)
76
    openparams.setDynValue("crs",self.__projection)
77
    featurestore = dataManager.openStore("Shape",openparams)
78
    return featurestore
79

    
80
  def createShape(self):
81
    dataManager = DALLocator.getDataManager()
82

    
83
    serverparams = dataManager.createServerExplorerParameters("FilesystemExplorer")
84
    serverparams.setDynValue("root", self.__outputFile.getParent())
85
    server = dataManager.openServerExplorer("FilesystemExplorer", serverparams)
86
    addparams = server.getAddParameters("Shape")
87
    addparams.setDefaultFeatureType(self.createFeatureType())
88
    addparams.setDynValue("shpFile",self.__outputFile)
89
    addparams.setDynValue("crs",self.__projection)
90
    addparams.setDynValue("geometryType",Geometry.TYPES.POINT)
91
    server.add("Shape",addparams, False)
92

    
93
  def run(self):
94
    root = self.__outputFile.getParentFile()
95
    metadata_reader = ImageGPSMetadata()
96
    files = self.__inputFolder.list()
97
    if self.__outputFile.exists():
98
        self.__onFinish()
99
        return
100

    
101
    self.createShape()
102

    
103
    store = self.openShape()
104
    store.edit()
105
    n = 0
106
    for fname  in files:
107
      n += 1
108
      base, ext = os.path.splitext(fname)
109
      if not ext.lower() in (".jpg",".png",".jpeg"):
110
        continue
111
      f  = File(self.__inputFolder,fname)
112

    
113
      metadata_reader.load(f)
114
      feature = store.createNewFeature()
115
      feature.setDefaultGeometry(metadata_reader.getPoint())
116
      feature.set("id", n)
117
      feature.set("text", fname)
118
      feature.set("fname", fname)
119
      feature.set("relpath", relpath(f.getAbsolutePath(),root.getAbsolutePath()))
120
      feature.set("abspath", f.getAbsolutePath())
121
      feature.set("altitude", metadata_reader.getAltitude(""))
122
      feature.set("altitudere", metadata_reader.getAltitudeRef(""))
123
      feature.set("datum", metadata_reader.getDatum(""))
124
      feature.set("datestam", metadata_reader.getDate(""))
125
      feature.set("timestam", metadata_reader.getTime(""))
126
      store.insert(feature)
127

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

    
137

    
138

    
139
class Photo2shapePanel(FormPanel):
140
  def __init__(self):
141
    FormPanel.__init__(self,getResource(__file__,"photo2shape.xml"))
142
    self.getPanel().setPreferredSize(Dimension(500,140))
143
    self.txtInputFolder.setText(getResource(__file__,"data/test-images")) #.getAbsolutePath())
144
    self.txtOutputFile.setText(getTempFile("phots",".shp")) #getResource(__file__,"data/photos.shp")) #.getAbsolutePath())
145

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

    
149
  def btnInputFolder_click(self, *args):
150
    f = openFolderDialog("Select input folder")
151
    if f == None or len(f)<1:
152
      return
153
    self.txtInputFolder.setText(f[0]) #.getAbsolutePath())
154

    
155
  def btnOutputFile_click(self, *args):
156
    f = saveFileDialog("Select output shape")
157
    if f == None or len(f)<1:
158
      return
159
    self.txtOutputFile.setText(f[0]) #.getAbsolutePath())
160

    
161
  def btnClose_click(self, *args):
162
    self.hide()
163

    
164
  def btnMakeShape_click(self, *args):
165
    if currentView() == None and self.chkInsertLayer.isSelected() :
166
      msgbox("Need a view to add layer to it.")
167
      return
168

    
169
    if self.chkRemoveShape.isSelected():
170
      try:
171
        f = os.path.splitext(self.txtOutputFile.getText())[0]
172
        os.remove(f+".shp")
173
        os.remove(f+".shx")
174
        os.remove(f+".dbf")
175
      except:
176
        pass
177
    if os.path.exists(self.txtOutputFile.getText()) :
178
      msgbox("output shapefile already exist")
179
      return
180

    
181
    self.btnMakeShape.setEnabled(False)
182
    self.btnClose.setEnabled(False)
183

    
184
    process = ProcessFolder()
185
    process.setInputFoldername(self.txtInputFolder.getText())
186
    process.setOutputFilename(self.txtOutputFile.getText())
187
    process.setAddLayerToView(self.chkInsertLayer.isSelected())
188
    process.setOnFinish(self.processFinished)
189
    process.start()
190

    
191
  def processFinished(self):
192
    self.btnMakeShape.setEnabled(True)
193
    self.btnClose.setEnabled(True)
194

    
195

    
196

    
197
def main(*args):
198
    win = Photo2shapePanel()
199
    win.showWindow()
200

    
201