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 / photo2shape2.py @ 545

History | View | Annotate | Download (4.72 KB)

1

    
2

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

    
5
import os
6

    
7
from gvsig import *
8
from commonsdialog import *
9

    
10
from java.io import File
11
from java.lang import Thread
12

    
13
from org.gvsig.tools import ToolsLocator
14

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

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

    
21

    
22
import_from_module("imagegpsmetadata","ImageGPSMetadata")
23
import_from_module("..libs.relpath","relpath")
24

    
25

    
26
class ProcessFolder(Thread):
27
  def __init__(self):
28
    self.__inputFolder = None
29
    self.__outputFile = None
30
    self.__recurseInSubfolders = False
31
    self.__addLayerToView = False
32
    self.__projection = "EPSG:4326"
33
    
34
  def setInputFoldername(self, inputFoldername):
35
    self.__inputFolder = File(inputFoldername)
36
    
37
  def setOutputFilename(self, outputFilename):
38
    self.__outputFile = File(outputFilename)
39
    
40
  def setRecurseInSubfolders(self, recurse):
41
    self.__recurseInSubfolders = recurse
42
    
43
  def setAddLayerToView(self, add):
44
    self.__addLayerToView = add
45

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

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

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

    
124
    store.finishEditing()
125
    if self.__addLayerToView:
126
      layer = MapContextLocator.getMapContextManager().createLayer(
127
        self.__outputFile.getName(),
128
        store
129
      )
130
      currentView().getMapContext().getLayers().addLayer(layer)
131

    
132

    
133
def main(*args):
134
    inputFolder = script.getResource("data/test-images").getAbsolutePath()
135
    outputFilename = script.getResource("data/photos.shp").getAbsolutePath()
136

    
137
    process = ProcessFolder()
138
    process.setInputFoldername(inputFolder)
139
    process.setOutputFilename(outputFilename)
140
    process.setRecurseInSubfolders(False)
141
    process.setAddLayerToView(True)
142
    process.run()
143

    
144