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 |
|