|
@@ -11,7 +11,7 @@ Classes:
|
|
|
- CoordinateSystemPage
|
|
|
- ProjectionsPage
|
|
|
- ItemList
|
|
|
- - ProjTypePage
|
|
|
+ - ProjParamsPage
|
|
|
- DatumPage
|
|
|
- EllipsePage
|
|
|
- GeoreferencedFilePage
|
|
@@ -111,26 +111,24 @@ class TitledPage(BaseClass, wiz.WizardPageSimple):
|
|
|
self.title = wx.StaticText(parent=self, id=wx.ID_ANY, label=title)
|
|
|
self.title.SetFont(wx.Font(13, wx.SWISS, wx.NORMAL, wx.BOLD))
|
|
|
|
|
|
- # main sizer
|
|
|
+ # main sizers
|
|
|
+ self.pagesizer = wx.BoxSizer(wx.VERTICAL)
|
|
|
self.sizer = wx.GridBagSizer(vgap=0, hgap=0)
|
|
|
|
|
|
def DoLayout(self):
|
|
|
"""!Do page layout"""
|
|
|
|
|
|
- tmpsizer = wx.BoxSizer(wx.VERTICAL)
|
|
|
|
|
|
- tmpsizer.Add(item=self.title, proportion=0,
|
|
|
+ self.pagesizer.Add(item=self.title, proportion=0,
|
|
|
flag=wx.ALIGN_CENTRE | wx.ALL,
|
|
|
border=5)
|
|
|
- tmpsizer.Add(item=wx.StaticLine(self, -1), proportion=0,
|
|
|
+ self.pagesizer.Add(item=wx.StaticLine(self, -1), proportion=0,
|
|
|
flag=wx.EXPAND | wx.ALL,
|
|
|
border=0)
|
|
|
- tmpsizer.Add(item=self.sizer, proportion=1,
|
|
|
- flag=wx.EXPAND | wx.ALL,
|
|
|
- border=5)
|
|
|
+ self.pagesizer.Add(item=self.sizer)
|
|
|
|
|
|
self.SetAutoLayout(True)
|
|
|
- self.SetSizer(tmpsizer)
|
|
|
+ self.SetSizer(self.pagesizer)
|
|
|
# tmpsizer.Fit(self)
|
|
|
self.Layout()
|
|
|
|
|
@@ -300,8 +298,25 @@ class CoordinateSystemPage(TitledPage):
|
|
|
|
|
|
def OnEnterPage(self, event):
|
|
|
global coordsys
|
|
|
- if event.GetDirection() and not coordsys:
|
|
|
+
|
|
|
+ if not coordsys:
|
|
|
coordsys = "proj"
|
|
|
+ self.radio1.SetValue(True)
|
|
|
+ else:
|
|
|
+ if coordsys == 'proj':
|
|
|
+ self.radio1.SetValue(True)
|
|
|
+ if coordsys == "epsg":
|
|
|
+ self.radio2.SetValue(True)
|
|
|
+ if coordsys == "file":
|
|
|
+ self.radio3.SetValue(True)
|
|
|
+ if coordsys == "wkt":
|
|
|
+ self.radio4.SetValue(True)
|
|
|
+ if coordsys == "custom":
|
|
|
+ self.radio5.SetValue(True)
|
|
|
+ if coordsys == "xy":
|
|
|
+ self.radio6.SetValue(True)
|
|
|
+
|
|
|
+ if event.GetDirection():
|
|
|
self.SetNext(self.parent.projpage)
|
|
|
self.parent.sumpage.SetPrev(self.parent.datumpage)
|
|
|
|
|
@@ -346,6 +361,7 @@ class ProjectionsPage(TitledPage):
|
|
|
self.parent = parent
|
|
|
self.proj = ''
|
|
|
self.projdesc = ''
|
|
|
+ self.p4proj = ''
|
|
|
|
|
|
# text input
|
|
|
self.tproj = self.MakeTextCtrl("", size=(200,-1))
|
|
@@ -355,7 +371,7 @@ class ProjectionsPage(TitledPage):
|
|
|
style=wx.TE_PROCESS_ENTER)
|
|
|
|
|
|
# projection list
|
|
|
- self.projlist = ItemList(self, data=self.parent.projections.items(),
|
|
|
+ self.projlist = ItemList(self, data=self.parent.projdesc.items(),
|
|
|
columns=[_('Code'), _('Description')])
|
|
|
self.projlist.resizeLastColumn(30)
|
|
|
|
|
@@ -394,27 +410,31 @@ class ProjectionsPage(TitledPage):
|
|
|
# self.Layout()
|
|
|
|
|
|
def OnPageChanging(self,event):
|
|
|
- if event.GetDirection() and self.proj not in self.parent.projections:
|
|
|
+ if event.GetDirection() and self.proj not in self.parent.projections.keys():
|
|
|
event.Veto()
|
|
|
- if self.proj == 'utm':
|
|
|
- self.parent.projtypepage.text_utm.SetEditable(True)
|
|
|
- self.parent.projtypepage.hemischoices = ['north','south']
|
|
|
- else:
|
|
|
- self.parent.projtypepage.text_utm.SetValue('')
|
|
|
- self.parent.projtypepage.text_utm.SetEditable(False)
|
|
|
- self.parent.projtypepage.hemischoices = []
|
|
|
|
|
|
def OnText(self, event):
|
|
|
"""!Projection name changed"""
|
|
|
self.proj = event.GetString().lower()
|
|
|
+ self.p4proj = ''
|
|
|
nextButton = wx.FindWindowById(wx.ID_FORWARD)
|
|
|
if len(self.proj) == 0 and nextButton.IsEnabled():
|
|
|
nextButton.Enable(False)
|
|
|
|
|
|
- if self.proj in self.parent.projections:
|
|
|
- self.projdesc = self.parent.projections[self.proj]
|
|
|
- if not nextButton.IsEnabled():
|
|
|
- nextButton.Enable()
|
|
|
+ if self.proj in self.parent.projections.keys():
|
|
|
+ if self.proj == 'stp':
|
|
|
+ wx.MessageBox('State Plan Projection must be entered as an EPSG code or a custom PROJ4 string',
|
|
|
+ 'Warning', wx.ICON_WARNING)
|
|
|
+ self.proj = ''
|
|
|
+ self.tproj.SetValue(self.proj)
|
|
|
+ nextButton.Enable(False)
|
|
|
+ return
|
|
|
+ elif self.proj.lower() == 'll':
|
|
|
+ self.p4proj = '+proj=longlat'
|
|
|
+ else:
|
|
|
+ self.p4proj = '+proj=' + self.proj.lower()
|
|
|
+ self.projdesc = self.parent.projections[self.proj][0]
|
|
|
+ nextButton.Enable()
|
|
|
|
|
|
def OnEnterPage(self, event):
|
|
|
if len(self.proj) == 0:
|
|
@@ -432,7 +452,7 @@ class ProjectionsPage(TitledPage):
|
|
|
self.proj, self.projdesc = self.projlist.Search(index=[0,1], pattern=event.GetString())
|
|
|
except:
|
|
|
self.proj = self.projdesc = ''
|
|
|
-
|
|
|
+
|
|
|
event.Skip()
|
|
|
|
|
|
def OnItemSelected(self, event):
|
|
@@ -441,8 +461,9 @@ class ProjectionsPage(TitledPage):
|
|
|
|
|
|
# set values
|
|
|
self.proj = self.projlist.GetItem(index, 0).GetText().lower()
|
|
|
- self.projdesc = self.projlist.GetItem(index, 0).GetText()
|
|
|
self.tproj.SetValue(self.proj)
|
|
|
+
|
|
|
+ event.Skip()
|
|
|
|
|
|
class ItemList(wx.ListCtrl,
|
|
|
listmix.ListCtrlAutoWidthMixin,
|
|
@@ -524,26 +545,15 @@ class ItemList(wx.ListCtrl,
|
|
|
self.DeleteAllItems()
|
|
|
row = 0
|
|
|
for value in data:
|
|
|
- # index = self.InsertStringItem(sys.maxint, str(value[0]))
|
|
|
self.itemDataMap[row] = [value[0]]
|
|
|
for i in range(1, len(value)):
|
|
|
- # try:
|
|
|
- # self.SetStringItem(index, i, str(value[i]))
|
|
|
- # except:
|
|
|
- # self.SetStringItem(index, i, unicode(str(value[i]), 'latin1'))
|
|
|
- self.itemDataMap[row].append(value[i])
|
|
|
- # self.SetItemData(index, row)
|
|
|
+ self.itemDataMap[row].append(value[i])
|
|
|
self.itemIndexMap.append(row)
|
|
|
row += 1
|
|
|
|
|
|
self.SetItemCount(row)
|
|
|
|
|
|
# set column width
|
|
|
-# for i in range(self.GetColumnCount()):
|
|
|
-# self.SetColumnWidth(i, wx.LIST_AUTOSIZE)
|
|
|
-# for i in range(self.GetColumnCount()):z
|
|
|
-# if self.GetColumnWidth(i) < 80:
|
|
|
-# self.SetColumnWidth(i, 80)
|
|
|
self.SetColumnWidth(0, 80)
|
|
|
self.SetColumnWidth(1, 300)
|
|
|
|
|
@@ -633,107 +643,173 @@ class ItemList(wx.ListCtrl,
|
|
|
|
|
|
data = []
|
|
|
pattern = pattern.lower()
|
|
|
- for idx in index:
|
|
|
- for i in range(len(self.sourceData)):
|
|
|
+ for i in range(len(self.sourceData)):
|
|
|
+ for idx in index:
|
|
|
try:
|
|
|
value = str(self.sourceData[i][idx]).lower()
|
|
|
if pattern in value:
|
|
|
data.append(self.sourceData[i])
|
|
|
+ break
|
|
|
except UnicodeDecodeError:
|
|
|
# osgeo4w problem (should be fixed)
|
|
|
pass
|
|
|
|
|
|
self.Populate(data)
|
|
|
if len(data) > 0:
|
|
|
-
|
|
|
return data[0]
|
|
|
else:
|
|
|
# self.Populate(self.sourceData)
|
|
|
return []
|
|
|
|
|
|
-class ProjTypePage(TitledPage):
|
|
|
+class ProjParamsPage(TitledPage):
|
|
|
"""
|
|
|
Wizard page for selecting method of setting coordinate system parameters
|
|
|
(select coordinate system option)
|
|
|
"""
|
|
|
|
|
|
def __init__(self, wizard, parent):
|
|
|
- TitledPage.__init__(self, wizard, _("Choose method of specifying georeferencing parameters"))
|
|
|
+ TitledPage.__init__(self, wizard, _("Choose projection parameters"))
|
|
|
global coordsys
|
|
|
|
|
|
self.utmzone = ''
|
|
|
self.utmhemisphere = ''
|
|
|
self.hemischoices = ["north","south"]
|
|
|
self.parent = parent
|
|
|
+ self.panel = ''
|
|
|
+ self.prjparamsizer = ''
|
|
|
+ self.pentry = {}
|
|
|
+ self.pdesc = {}
|
|
|
+ self.ptype = {}
|
|
|
+ self.pval = {}
|
|
|
+ self.proj4param = {}
|
|
|
+ self.pcount = 0
|
|
|
+ self.paramlist = []
|
|
|
+ self.p4projparams = ''
|
|
|
+ self.projdesc = ''
|
|
|
+
|
|
|
+ radioSBox = wx.StaticBox(parent=self, id=wx.ID_ANY,
|
|
|
+ label=" %s " % _("Select datum or ellipsoid (next page)"))
|
|
|
+ radioSBSizer = wx.StaticBoxSizer(radioSBox)
|
|
|
+ self.sizer.Add(radioSBSizer, pos=(0,1), span=(1,2),
|
|
|
+ flag=wx.EXPAND | wx.ALIGN_TOP | wx.TOP, border=10)
|
|
|
|
|
|
- self.radio1 = wx.RadioButton(parent=self, id=wx.ID_ANY, label=_("Select datum with associated ellipsoid"),
|
|
|
- style = wx.RB_GROUP)
|
|
|
+ self.radio1 = wx.RadioButton(parent=self, id=wx.ID_ANY,
|
|
|
+ label=_("Datum with associated ellipsoid"),
|
|
|
+ style = wx.RB_GROUP)
|
|
|
self.radio2 = wx.RadioButton(parent=self, id=wx.ID_ANY,
|
|
|
- label=_("Select ellipsoid"))
|
|
|
- self.title_utm = self.MakeLabel(_("Set zone for UTM projection:"))
|
|
|
- self.text_utm = self.MakeTextCtrl(size=(100,-1))
|
|
|
- self.label_utm = self.MakeLabel(_("Zone:"))
|
|
|
- self.hemisphere = wx.Choice(parent=self, id=wx.ID_ANY, size=(100, -1),
|
|
|
- choices=self.hemischoices)
|
|
|
- self.label_hemisphere = self.MakeLabel(_("Hemisphere for zone:"))
|
|
|
+ label=_("Ellipsoid only"))
|
|
|
|
|
|
- # layout
|
|
|
- self.sizer.AddGrowableCol(2)
|
|
|
- self.sizer.Add(item=self.radio1,
|
|
|
- flag=wx.ALIGN_LEFT, pos=(1, 1), span=(1, 2))
|
|
|
- self.sizer.Add(item=self.radio2,
|
|
|
- flag=wx.ALIGN_LEFT, pos=(2, 1), span=(1, 2))
|
|
|
- self.sizer.Add(item=self.title_utm,
|
|
|
- flag=wx.ALIGN_LEFT | wx.ALL,
|
|
|
- border=5, pos=(4, 1), span=(1, 2))
|
|
|
- self.sizer.Add(item=self.label_utm,
|
|
|
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
|
|
|
- border=5, pos=(5, 1), span=(1, 1))
|
|
|
- self.sizer.Add(item=self.text_utm,
|
|
|
- flag=wx.ALIGN_LEFT | wx.ALL, border=5,
|
|
|
- pos=(5, 2), span=(1, 1))
|
|
|
- self.sizer.Add(item=self.label_hemisphere,
|
|
|
- flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL,
|
|
|
- border=5, pos=(6, 1), span=(1, 1))
|
|
|
- self.sizer.Add(item=self.hemisphere,
|
|
|
- flag=wx.ALIGN_LEFT|wx.ALL,
|
|
|
- border=5, pos=(6, 2), span=(1, 1))
|
|
|
-
|
|
|
- self.title_utm.Hide()
|
|
|
- self.text_utm.Hide()
|
|
|
- self.label_utm.Hide()
|
|
|
- self.hemisphere.Hide()
|
|
|
- self.label_hemisphere.Hide()
|
|
|
+ radioSBSizer.Add(item=self.radio1,
|
|
|
+ flag=wx.ALIGN_LEFT | wx.RIGHT, border=20)
|
|
|
+ radioSBSizer.Add(item=self.radio2,
|
|
|
+ flag=wx.ALIGN_LEFT)
|
|
|
|
|
|
# bindings
|
|
|
self.Bind(wx.EVT_RADIOBUTTON, self.SetVal, id=self.radio1.GetId())
|
|
|
self.Bind(wx.EVT_RADIOBUTTON, self.SetVal, id=self.radio2.GetId())
|
|
|
self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChange)
|
|
|
self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
|
|
|
-
|
|
|
- # do page layout
|
|
|
- # self.DoLayout()
|
|
|
+
|
|
|
+ def OnParamEntry(self, event):
|
|
|
+ self.pval[event.GetId() - 2000] = event.GetString()
|
|
|
|
|
|
def OnPageChange(self,event=None):
|
|
|
- if event.GetDirection() and self.parent.projpage.proj == 'utm' and self.utmzone == '':
|
|
|
- wx.MessageBox('You must set a zone for a UTM projection')
|
|
|
- event.Veto()
|
|
|
- self.title_utm.Hide()
|
|
|
- self.text_utm.Hide()
|
|
|
- self.label_utm.Hide()
|
|
|
- self.hemisphere.Hide()
|
|
|
- self.label_hemisphere.Hide()
|
|
|
+ if event.GetDirection():
|
|
|
+ self.p4projparams = ''
|
|
|
+ for num in range(self.pcount + 1):
|
|
|
+ if self.ptype[num] == 'bool':
|
|
|
+ if self.pval[num] == 'N':
|
|
|
+ continue
|
|
|
+ else:
|
|
|
+ self.p4projparams += (' +' + self.proj4param[num])
|
|
|
+ else:
|
|
|
+ if self.pval[num] == '':
|
|
|
+ wx.MessageBox('You must enter a value for %s' % self.pdesc[num],
|
|
|
+ 'Something is missing!', wx.ICON_ERROR)
|
|
|
+ event.Veto()
|
|
|
+ else:
|
|
|
+ self.p4projparams += (' +' + self.proj4param[num] + '=' + self.pval[num])
|
|
|
|
|
|
def OnEnterPage(self,event):
|
|
|
- if self.parent.projpage.proj == 'utm':
|
|
|
- self.title_utm.Show()
|
|
|
- self.text_utm.Show()
|
|
|
- self.label_utm.Show()
|
|
|
- self.hemisphere.Show()
|
|
|
- self.label_hemisphere.Show()
|
|
|
+ self.projdesc = self.parent.projections[self.parent.projpage.proj][0]
|
|
|
+ try:
|
|
|
+ # page already formatted
|
|
|
+ if self.pagesizer.GetItem(self.panel) != '':
|
|
|
+ pass
|
|
|
+ except:
|
|
|
+ # entering page for the first time
|
|
|
+ paramSBox = wx.StaticBox(parent=self, id=wx.ID_ANY,
|
|
|
+ label=_(" Enter parameters for %s projection ") % self.projdesc)
|
|
|
+ paramSBSizer = wx.StaticBoxSizer(paramSBox)
|
|
|
+
|
|
|
+ self.panel = scrolled.ScrolledPanel(self, wx.ID_ANY)
|
|
|
+ self.prjparamsizer = wx.GridBagSizer(vgap=0, hgap=0)
|
|
|
+
|
|
|
+ self.panel.SetupScrolling()
|
|
|
+
|
|
|
+# this ought to work but it doesn't
|
|
|
+# self.sizer.Add(paramSBSizer, pos=(2,1), span=(3,2),
|
|
|
+# flag=wx.EXPAND )
|
|
|
+
|
|
|
+ self.pagesizer.Add(paramSBSizer, proportion=1,
|
|
|
+ flag=wx.EXPAND | wx.ALIGN_TOP | wx.ALL, border=10)
|
|
|
+ paramSBSizer.Add(self.panel, proportion=1,
|
|
|
+ flag=wx.ALIGN_CENTER|wx.EXPAND)
|
|
|
+
|
|
|
+ paramSBSizer.Fit(self.panel)
|
|
|
+ self.panel.SetSizer(self.prjparamsizer)
|
|
|
+
|
|
|
+ if event.GetDirection():
|
|
|
+ self.pcount = 0
|
|
|
+ self.prjparamsizer.Clear(True)
|
|
|
+ num = 0
|
|
|
|
|
|
- self.Bind(wx.EVT_CHOICE, self.OnHemisphere, self.hemisphere)
|
|
|
- self.Bind(wx.EVT_TEXT, self.GetUTM, self.text_utm)
|
|
|
+ for paramgrp in self.parent.projections[self.parent.projpage.proj][1]:
|
|
|
+
|
|
|
+ # get parameters
|
|
|
+ self.pcount = num
|
|
|
+ self.ptype[num] = self.parent.paramdesc[paramgrp[0]][0]
|
|
|
+ self.proj4param[num] = self.parent.paramdesc[paramgrp[0]][1]
|
|
|
+ self.pdesc[num] = self.parent.paramdesc[paramgrp[0]][2]
|
|
|
+
|
|
|
+ # default values
|
|
|
+ if self.ptype[num] == 'bool': self.pval[num] = 'N'
|
|
|
+ elif self.ptype[num] == 'zone': self.pval[num] = '30'
|
|
|
+ else: self.pval[num] = paramgrp[2]
|
|
|
+
|
|
|
+ label = wx.StaticText(self.panel, id=1000+num, label=self.pdesc[num],
|
|
|
+ style=wx.ALIGN_RIGHT | wx.ST_NO_AUTORESIZE)
|
|
|
+ if self.ptype[num] == 'bool':
|
|
|
+ self.pentry[num] = wx.Choice(self.panel, id=2000+num, size=(100,-1),
|
|
|
+ choices = ['N','Y'])
|
|
|
+ self.pentry[num].SetStringSelection(self.pval[num])
|
|
|
+ self.Bind(wx.EVT_CHOICE, self.OnParamEntry)
|
|
|
+ elif self.ptype[num] == 'zone':
|
|
|
+ zone = []
|
|
|
+ for i in range(1, 61):
|
|
|
+ zone.append(str(i))
|
|
|
+ self.pentry[num] = wx.Choice(self.panel, id=2000+num, size=(100,-1),
|
|
|
+ choices = zone)
|
|
|
+ self.pentry[num].SetStringSelection(self.pval[num])
|
|
|
+ self.Bind(wx.EVT_CHOICE, self.OnParamEntry)
|
|
|
+ else:
|
|
|
+ self.pentry[num] = wx.TextCtrl(self.panel, id=2000+num, value=self.pval[num],
|
|
|
+ size=(100,-1))
|
|
|
+ self.Bind(wx.EVT_TEXT, self.OnParamEntry)
|
|
|
+ if paramgrp[1] == 'noask':
|
|
|
+ self.pentry[num].SetEditable(False)
|
|
|
+
|
|
|
+ self.prjparamsizer.Add(item=label, pos=(num, 1),
|
|
|
+ flag=wx.ALIGN_RIGHT | wx.RIGHT, border=5)
|
|
|
+ self.prjparamsizer.Add(item=self.pentry[num], pos=(num, 2),
|
|
|
+ flag=wx.ALIGN_LEFT | wx.LEFT, border=5)
|
|
|
+ num += 1
|
|
|
+
|
|
|
+ self.panel.SetSize(self.panel.GetBestSize())
|
|
|
+ self.panel.Layout()
|
|
|
+ self.Layout()
|
|
|
+ self.Update()
|
|
|
+
|
|
|
|
|
|
if not wx.FindWindowById(wx.ID_FORWARD).IsEnabled():
|
|
|
wx.FindWindowById(wx.ID_FORWARD).Enable()
|
|
@@ -827,45 +903,46 @@ class DatumPage(TitledPage):
|
|
|
|
|
|
def OnPageChanging(self, event):
|
|
|
self.proj4params = ''
|
|
|
- if event.GetDirection() and self.datum not in self.parent.datums:
|
|
|
- event.Veto()
|
|
|
- else:
|
|
|
- # check for datum tranforms
|
|
|
- proj4string = self.parent.CreateProj4String() + ' +datum=%s' % self.datum
|
|
|
- ret = gcmd.RunCommand('g.proj',
|
|
|
- read = True,
|
|
|
- proj4 = proj4string,
|
|
|
- datumtrans = '-1')
|
|
|
-
|
|
|
- if ret != '':
|
|
|
- dtrans = ''
|
|
|
- # open a dialog to select datum transform number
|
|
|
- dlg = SelectTransformDialog(self.parent.parent, transforms=ret)
|
|
|
+ if event.GetDirection():
|
|
|
+ if self.datum not in self.parent.datums:
|
|
|
+ event.Veto()
|
|
|
+ else:
|
|
|
+ # check for datum tranforms
|
|
|
+ proj4string = self.parent.CreateProj4String() + ' +datum=%s' % self.datum
|
|
|
+ ret = gcmd.RunCommand('g.proj',
|
|
|
+ read = True,
|
|
|
+ proj4 = proj4string,
|
|
|
+ datumtrans = '-1')
|
|
|
|
|
|
- if dlg.ShowModal() == wx.ID_OK:
|
|
|
- dtrans = dlg.GetTransform()
|
|
|
- if dtrans == '':
|
|
|
+ if ret != '':
|
|
|
+ dtrans = ''
|
|
|
+ # open a dialog to select datum transform number
|
|
|
+ dlg = SelectTransformDialog(self.parent.parent, transforms=ret)
|
|
|
+
|
|
|
+ if dlg.ShowModal() == wx.ID_OK:
|
|
|
+ dtrans = dlg.GetTransform()
|
|
|
+ if dtrans == '':
|
|
|
+ dlg.Destroy()
|
|
|
+ event.Veto()
|
|
|
+ return 'Datum transform is required.'
|
|
|
+ else:
|
|
|
dlg.Destroy()
|
|
|
event.Veto()
|
|
|
return 'Datum transform is required.'
|
|
|
- else:
|
|
|
- dlg.Destroy()
|
|
|
- event.Veto()
|
|
|
- return 'Datum transform is required.'
|
|
|
-
|
|
|
- self.parent.datumtrans = dtrans
|
|
|
+
|
|
|
+ self.parent.datumtrans = dtrans
|
|
|
|
|
|
self.GetNext().SetPrev(self)
|
|
|
-
|
|
|
- self.GetNext().SetPrev(self)
|
|
|
self.parent.ellipsepage.ellipseparams = self.parent.ellipsoids[self.ellipsoid][1]
|
|
|
|
|
|
def OnEnterPage(self,event):
|
|
|
- if len(self.datum) == 0:
|
|
|
- # disable 'next' button by default
|
|
|
- wx.FindWindowById(wx.ID_FORWARD).Enable(False)
|
|
|
- else:
|
|
|
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
|
|
|
+ self.parent.datumtrans = 0
|
|
|
+ if event.GetDirection():
|
|
|
+ if len(self.datum) == 0:
|
|
|
+ # disable 'next' button by default when entering from previous page
|
|
|
+ wx.FindWindowById(wx.ID_FORWARD).Enable(False)
|
|
|
+ else:
|
|
|
+ wx.FindWindowById(wx.ID_FORWARD).Enable(True)
|
|
|
|
|
|
event.Skip()
|
|
|
|
|
@@ -873,14 +950,17 @@ class DatumPage(TitledPage):
|
|
|
self.datum = event.GetString().lower()
|
|
|
|
|
|
nextButton = wx.FindWindowById(wx.ID_FORWARD)
|
|
|
- if len(self.datum) == 0 and nextButton.IsEnabled():
|
|
|
+ if len(self.datum) == 0 or self.datum not in self.parent.datums:
|
|
|
nextButton.Enable(False)
|
|
|
- elif self.datum in self.parent.datums:
|
|
|
+ else:
|
|
|
self.datumdesc = self.parent.datums[self.datum][0]
|
|
|
self.ellipsoid = self.parent.datums[self.datum][1]
|
|
|
self.datumparams = self.parent.datums[self.datum][2]
|
|
|
+ for p in self.datumparams:
|
|
|
+ if p in ['dx=0.0','dy=0.0','dz=0.0']: self.datumparams.remove(p)
|
|
|
nextButton.Enable(True)
|
|
|
|
|
|
+ self.Update()
|
|
|
event.Skip()
|
|
|
|
|
|
def OnDSearch(self, event):
|
|
@@ -892,14 +972,11 @@ class DatumPage(TitledPage):
|
|
|
|
|
|
event.Skip()
|
|
|
|
|
|
- def OnDatumSelected(self,event):
|
|
|
+ def OnDatumSelected(self, event):
|
|
|
index = event.m_itemIndex
|
|
|
item = event.GetItem()
|
|
|
|
|
|
self.datum = self.datumlist.GetItem(index, 0).GetText()
|
|
|
- self.datumdesc = self.parent.datums[self.datum][0]
|
|
|
- self.ellipsoid = self.parent.datums[self.datum][1]
|
|
|
- self.datumparams = self.parent.datums[self.datum][2]
|
|
|
self.tdatum.SetValue(self.datum)
|
|
|
|
|
|
event.Skip()
|
|
@@ -934,6 +1011,7 @@ class EllipsePage(TitledPage):
|
|
|
|
|
|
self.ellipselist = ItemList(self, data=data,
|
|
|
columns=[_('Code'), _('Description')])
|
|
|
+ self.ellipselist.resizeLastColumn(30)
|
|
|
|
|
|
# layout
|
|
|
self.sizer.AddGrowableCol(4)
|
|
@@ -968,9 +1046,6 @@ class EllipsePage(TitledPage):
|
|
|
self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
|
|
|
self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
|
|
|
|
|
|
- # do page layout
|
|
|
- # self.DoLayout()
|
|
|
-
|
|
|
def OnEnterPage(self,event):
|
|
|
if len(self.ellipse) == 0:
|
|
|
# disable 'next' button by default
|
|
@@ -987,14 +1062,13 @@ class EllipsePage(TitledPage):
|
|
|
self.proj4params = ''
|
|
|
self.GetNext().SetPrev(self)
|
|
|
self.parent.datumpage.datumparams = ''
|
|
|
- self.parent.datumpage.transparams = ''
|
|
|
# self.GetNext().SetPrev(self) (???)
|
|
|
|
|
|
def OnText(self, event):
|
|
|
"""!Ellipspoid code changed"""
|
|
|
self.ellipse = event.GetString()
|
|
|
nextButton = wx.FindWindowById(wx.ID_FORWARD)
|
|
|
- if len(self.ellipse) == 0 and nextButton.IsEnabled():
|
|
|
+ if len(self.ellipse) == 0 or self.ellipse not in self.parent.ellipsoids:
|
|
|
nextButton.Enable(False)
|
|
|
self.ellipsedesc = ''
|
|
|
self.ellipseparams = ''
|
|
@@ -1002,22 +1076,16 @@ class EllipsePage(TitledPage):
|
|
|
elif self.ellipse in self.parent.ellipsoids:
|
|
|
self.ellipsedesc = self.parent.ellipsoids[self.ellipse][0]
|
|
|
self.ellipseparams = self.parent.ellipsoids[self.ellipse][1]
|
|
|
- if not nextButton.IsEnabled():
|
|
|
- nextButton.Enable()
|
|
|
+ nextButton.Enable(True)
|
|
|
|
|
|
def OnSearch(self, event):
|
|
|
"""!Search ellipsoid by desc"""
|
|
|
- str = event.GetString()
|
|
|
try:
|
|
|
self.ellipse, self.ellipsedesc = \
|
|
|
self.ellipselist.Search(index=[0,1], pattern=event.GetString())
|
|
|
self.ellipseparams = self.parent.ellipsoids[self.ellipse][1]
|
|
|
- self.proj4params = self.parent.ellipsoids[self.ellipse][2]
|
|
|
except:
|
|
|
- self.ellipse = self.ellipsedesc = ''
|
|
|
- self.ellipseparams = self.proj4params = ''
|
|
|
-
|
|
|
- self.tellipse.SetValue(self.ellipse)
|
|
|
+ self.ellipse = self.ellipsedesc = self.ellipseparams = ''
|
|
|
|
|
|
event.Skip()
|
|
|
|
|
@@ -1026,10 +1094,9 @@ class EllipsePage(TitledPage):
|
|
|
item = event.GetItem()
|
|
|
|
|
|
self.ellipse = self.ellipselist.GetItem(index, 0).GetText()
|
|
|
- self.ellipsedesc = self.parent.ellipsoids[self.ellipse][0]
|
|
|
- self.ellipseparams = self.parent.ellipsoids[self.ellipse][1]
|
|
|
-
|
|
|
self.tellipse.SetValue(self.ellipse)
|
|
|
+
|
|
|
+ event.Skip()
|
|
|
|
|
|
class GeoreferencedFilePage(TitledPage):
|
|
|
"""
|
|
@@ -1141,9 +1208,6 @@ class WKTPage(TitledPage):
|
|
|
self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
|
|
|
self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
|
|
|
|
|
|
- # do page layout
|
|
|
- # self.DoLayout()
|
|
|
-
|
|
|
def OnEnterPage(self, event):
|
|
|
if len(self.wktfile) == 0:
|
|
|
# disable 'next' button by default
|
|
@@ -1284,15 +1348,14 @@ class EPSGPage(TitledPage):
|
|
|
self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
|
|
|
self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
|
|
|
|
|
|
- # do page layout
|
|
|
- # self.DoLayout()
|
|
|
-
|
|
|
def OnEnterPage(self, event):
|
|
|
- if not self.epsgcode:
|
|
|
- # disable 'next' button by default
|
|
|
- wx.FindWindowById(wx.ID_FORWARD).Enable(False)
|
|
|
- else:
|
|
|
- wx.FindWindowById(wx.ID_FORWARD).Enable(True)
|
|
|
+ self.parent.datumtrans = 0
|
|
|
+ if event.GetDirection():
|
|
|
+ if not self.epsgcode:
|
|
|
+ # disable 'next' button by default
|
|
|
+ wx.FindWindowById(wx.ID_FORWARD).Enable(False)
|
|
|
+ else:
|
|
|
+ wx.FindWindowById(wx.ID_FORWARD).Enable(True)
|
|
|
|
|
|
# load default epsg database file
|
|
|
self.OnBrowseCodes(None)
|
|
@@ -1444,9 +1507,6 @@ class CustomPage(TitledPage):
|
|
|
self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
|
|
|
self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
|
|
|
|
|
|
- # do page layout
|
|
|
- # self.DoLayout()
|
|
|
-
|
|
|
def OnEnterPage(self, event):
|
|
|
if len(self.customstring) == 0:
|
|
|
# disable 'next' button by default
|
|
@@ -1557,13 +1617,6 @@ class SummaryPage(TitledPage):
|
|
|
self.sizer.Add(item=(10,20),
|
|
|
flag=wx.ALIGN_CENTER_HORIZONTAL | wx.ALL,
|
|
|
border=5, pos=(5, 0), span=(1, 2))
|
|
|
- # self.sizer.AddGrowableRow(6)
|
|
|
- #self.sizer.Add(item=self.MakeLabel(_("You can set the default extents "
|
|
|
- # "and resolution after creating new location%s"
|
|
|
- # "or you can set them during a working session.") % os.linesep,
|
|
|
- # style=wx.ALIGN_CENTER),
|
|
|
- # flag=wx.ALIGN_CENTRE | wx.ALL, border=5, pos=(6, 0),
|
|
|
- # span=(1, 2))
|
|
|
|
|
|
def OnEnterPage(self,event):
|
|
|
"""
|
|
@@ -1572,7 +1625,10 @@ class SummaryPage(TitledPage):
|
|
|
|
|
|
database = self.parent.startpage.grassdatabase
|
|
|
location = self.parent.startpage.location
|
|
|
-
|
|
|
+ proj4string = self.parent.CreateProj4String()
|
|
|
+ epsgcode = self.parent.epsgpage.epsgcode
|
|
|
+ dtrans = self.parent.datumtrans
|
|
|
+
|
|
|
global coordsys
|
|
|
if coordsys not in ['proj', 'epsg']:
|
|
|
self.lproj4stringLabel.Hide()
|
|
@@ -1583,25 +1639,39 @@ class SummaryPage(TitledPage):
|
|
|
self.lproj4string.Show()
|
|
|
self.lproj4stringLabel.SetLabel(_("PROJ.4 definition:"))
|
|
|
if coordsys == 'proj':
|
|
|
- self.lproj4string.SetLabel(self.parent.CreateProj4String())
|
|
|
+ ret, msg, err = gcmd.RunCommand('g.proj',
|
|
|
+ flags = 'j',
|
|
|
+ proj4 = proj4string,
|
|
|
+ datumtrans = dtrans,
|
|
|
+ location = location,
|
|
|
+ getErrorMsg = True,
|
|
|
+ read = True)
|
|
|
+ elif coordsys == 'epsg':
|
|
|
+ ret, msg, err = gcmd.RunCommand('g.proj',
|
|
|
+ flags = 'j',
|
|
|
+ epsg = epsgcode,
|
|
|
+ datumtrans = dtrans,
|
|
|
+ location = location,
|
|
|
+ getErrorMsg = True,
|
|
|
+ read = True)
|
|
|
+
|
|
|
+ if ret == 0:
|
|
|
+ projlabel = ''
|
|
|
+ for line in msg.splitlines():
|
|
|
+ projlabel = projlabel + '%s ' % line
|
|
|
+ self.lproj4string.SetLabel(projlabel)
|
|
|
else:
|
|
|
- self.lproj4string.SetLabel(self.parent.epsgpage.epsgCodeDict[self.parent.epsgpage.epsgcode][1])
|
|
|
+ wx.MessageBox(err, 'Error', wx.ICON_ERROR)
|
|
|
+
|
|
|
self.lproj4string.Wrap(400)
|
|
|
|
|
|
- projection = self.parent.projpage.proj
|
|
|
projdesc = self.parent.projpage.projdesc
|
|
|
- utmzone = self.parent.projtypepage.utmzone
|
|
|
- utmhemisphere = self.parent.projtypepage.utmhemisphere
|
|
|
- ellipse = self.parent.ellipsepage.ellipse
|
|
|
ellipsedesc = self.parent.ellipsepage.ellipsedesc
|
|
|
- datum = self.parent.datumpage.datum
|
|
|
datumdesc = self.parent.datumpage.datumdesc
|
|
|
- ellipsoid = self.parent.datumpage.ellipsoid
|
|
|
- datumparams = self.parent.datumpage.datumparams
|
|
|
-
|
|
|
self.ldatabase.SetLabel(str(database))
|
|
|
self.llocation.SetLabel(str(location))
|
|
|
label = ''
|
|
|
+
|
|
|
if coordsys == 'epsg':
|
|
|
label = 'EPSG code %s (%s)' % (self.parent.epsgpage.epsgcode, self.parent.epsgpage.epsgdesc)
|
|
|
self.lprojection.SetLabel(label)
|
|
@@ -1612,7 +1682,7 @@ class SummaryPage(TitledPage):
|
|
|
label = 'matches file %s' % self.parent.wktpage.wktfile
|
|
|
self.lprojection.SetLabel(label)
|
|
|
elif coordsys == 'proj':
|
|
|
- label = ('%s, %s%s' % (projdesc, datumdesc, ellipsedesc))
|
|
|
+ label = ('%s, %s %s' % (projdesc, datumdesc, ellipsedesc))
|
|
|
self.lprojection.SetLabel(label)
|
|
|
elif coordsys == 'xy':
|
|
|
label = ('XY coordinate system (not projected).')
|
|
@@ -1661,6 +1731,7 @@ class LocationWizard(wx.Object):
|
|
|
# datum transform number and list of datum transforms
|
|
|
#
|
|
|
self.datumtrans = 0
|
|
|
+ self.proj4string = ''
|
|
|
|
|
|
#
|
|
|
# define wizard pages
|
|
@@ -1671,7 +1742,7 @@ class LocationWizard(wx.Object):
|
|
|
self.csystemspage = CoordinateSystemPage(self.wizard, self)
|
|
|
self.projpage = ProjectionsPage(self.wizard, self)
|
|
|
self.datumpage = DatumPage(self.wizard, self)
|
|
|
- self.projtypepage = ProjTypePage(self.wizard,self)
|
|
|
+ self.paramspage = ProjParamsPage(self.wizard,self)
|
|
|
self.epsgpage = EPSGPage(self.wizard, self)
|
|
|
self.filepage = GeoreferencedFilePage(self.wizard, self)
|
|
|
self.wktpage = WKTPage(self.wizard, self)
|
|
@@ -1689,15 +1760,15 @@ class LocationWizard(wx.Object):
|
|
|
self.csystemspage.SetNext(self.sumpage)
|
|
|
|
|
|
self.projpage.SetPrev(self.csystemspage)
|
|
|
- self.projpage.SetNext(self.projtypepage)
|
|
|
+ self.projpage.SetNext(self.paramspage)
|
|
|
|
|
|
- self.projtypepage.SetPrev(self.projpage)
|
|
|
- self.projtypepage.SetNext(self.datumpage)
|
|
|
+ self.paramspage.SetPrev(self.projpage)
|
|
|
+ self.paramspage.SetNext(self.datumpage)
|
|
|
|
|
|
- self.datumpage.SetPrev(self.projtypepage)
|
|
|
+ self.datumpage.SetPrev(self.paramspage)
|
|
|
self.datumpage.SetNext(self.sumpage)
|
|
|
|
|
|
- self.ellipsepage.SetPrev(self.projtypepage)
|
|
|
+ self.ellipsepage.SetPrev(self.paramspage)
|
|
|
self.ellipsepage.SetNext(self.sumpage)
|
|
|
|
|
|
self.epsgpage.SetPrev(self.csystemspage)
|
|
@@ -1721,7 +1792,7 @@ class LocationWizard(wx.Object):
|
|
|
self.csystemspage.DoLayout()
|
|
|
self.projpage.DoLayout()
|
|
|
self.datumpage.DoLayout()
|
|
|
- self.projtypepage.DoLayout()
|
|
|
+ self.paramspage.DoLayout()
|
|
|
self.epsgpage.DoLayout()
|
|
|
self.filepage.DoLayout()
|
|
|
self.wktpage.DoLayout()
|
|
@@ -1778,16 +1849,27 @@ class LocationWizard(wx.Object):
|
|
|
|
|
|
def __readData(self):
|
|
|
"""!Get georeferencing information from tables in $GISBASE/etc"""
|
|
|
- # read projection definitions
|
|
|
- f = open(os.path.join(globalvar.ETCDIR, "projections"), "r")
|
|
|
+
|
|
|
+ # read projection and parameters
|
|
|
+ f = open(os.path.join(globalvar.ETCDIR, "proj-parms.table"), "r")
|
|
|
self.projections = {}
|
|
|
+ self.projdesc = {}
|
|
|
for line in f.readlines():
|
|
|
- line = line.expandtabs(1)
|
|
|
line = line.strip()
|
|
|
- if line == '' or line[0] == "#":
|
|
|
+ try:
|
|
|
+ proj, projdesc, params = line.split(':')
|
|
|
+ paramslist = params.split(';')
|
|
|
+ plist = []
|
|
|
+ for p in paramslist:
|
|
|
+ if p == '': continue
|
|
|
+ p1, pdefault = p.split(',')
|
|
|
+ pterm, pask = p1.split('=')
|
|
|
+ p = [pterm.strip(), pask.strip(), pdefault.strip()]
|
|
|
+ plist.append(p)
|
|
|
+ self.projections[proj.lower().strip()] = (projdesc.strip(), plist)
|
|
|
+ self.projdesc[proj.lower().strip()] = projdesc.strip()
|
|
|
+ except:
|
|
|
continue
|
|
|
- proj, projdesc = line.split(":", 1)
|
|
|
- self.projections[proj.strip()] = projdesc.strip()
|
|
|
f.close()
|
|
|
|
|
|
# read datum definitions
|
|
@@ -1808,34 +1890,6 @@ class LocationWizard(wx.Object):
|
|
|
self.datums[datum] = (datumdesc.replace('_', ' '), ellipsoid, paramlist)
|
|
|
f.close()
|
|
|
|
|
|
- # read datum transforms parameters
|
|
|
- f = open(os.path.join(globalvar.ETCDIR, "datumtransform.table"), "r")
|
|
|
- self.transforms = {}
|
|
|
- j = 1
|
|
|
- for line in f.readlines():
|
|
|
- if j < 10:
|
|
|
- transcode = 'T0' + str(j)
|
|
|
- else:
|
|
|
- transcode = 'T' + str(j)
|
|
|
- line = line.expandtabs(1)
|
|
|
- line = line.strip()
|
|
|
- if line == '' or line[0] == "#":
|
|
|
- continue
|
|
|
- datum, rest = line.split(" ", 1)
|
|
|
- rest = rest.strip('" ')
|
|
|
- params, rest = rest.split('"', 1)
|
|
|
- params = params.strip()
|
|
|
- rest = rest.strip('" ')
|
|
|
- try:
|
|
|
- region, info = rest.split('"', 1)
|
|
|
- info = info.strip('" ')
|
|
|
- info = region + ': ' + info
|
|
|
- except:
|
|
|
- info = rest
|
|
|
- self.transforms[transcode] = (datum, info, params)
|
|
|
- j += 1
|
|
|
- f.close()
|
|
|
-
|
|
|
# read ellipsiod definitions
|
|
|
f = open(os.path.join(globalvar.ETCDIR, "ellipse.table"), "r")
|
|
|
self.ellipsoids = {}
|
|
@@ -1851,6 +1905,18 @@ class LocationWizard(wx.Object):
|
|
|
paramslist = params.split()
|
|
|
self.ellipsoids[ellipse] = (desc, paramslist)
|
|
|
f.close()
|
|
|
+
|
|
|
+ # read projection parameter description and parsing table
|
|
|
+ f = open(os.path.join(globalvar.ETCDIR, "proj-desc.table"), "r")
|
|
|
+ self.paramdesc = {}
|
|
|
+ for line in f.readlines():
|
|
|
+ line = line.strip()
|
|
|
+ try:
|
|
|
+ pparam, datatype, proj4term, desc = line.split(':')
|
|
|
+ self.paramdesc[pparam] = (datatype, proj4term, desc)
|
|
|
+ except:
|
|
|
+ continue
|
|
|
+ f.close()
|
|
|
|
|
|
def OnWizFinished(self):
|
|
|
database = self.startpage.grassdatabase
|
|
@@ -1965,19 +2031,16 @@ class LocationWizard(wx.Object):
|
|
|
def CreateProj4String(self):
|
|
|
"""!Constract PROJ.4 string"""
|
|
|
location = self.startpage.location
|
|
|
- proj = self.projpage.proj
|
|
|
+ proj = self.projpage.p4proj
|
|
|
projdesc = self.projpage.projdesc
|
|
|
-
|
|
|
- utmzone = self.projtypepage.utmzone
|
|
|
- utmhemisphere = self.projtypepage.utmhemisphere
|
|
|
-
|
|
|
+ proj4params = self.paramspage.p4projparams
|
|
|
+
|
|
|
datum = self.datumpage.datum
|
|
|
if self.datumpage.datumdesc:
|
|
|
datumdesc = self.datumpage.datumdesc +' - ' + self.datumpage.ellipsoid
|
|
|
else:
|
|
|
datumdesc = ''
|
|
|
- datumparams = self.datumpage.datumparams
|
|
|
-
|
|
|
+ datumparams = self.datumpage.datumparams
|
|
|
ellipse = self.ellipsepage.ellipse
|
|
|
ellipsedesc = self.ellipsepage.ellipsedesc
|
|
|
ellipseparams = self.ellipsepage.ellipseparams
|
|
@@ -1985,33 +2048,24 @@ class LocationWizard(wx.Object):
|
|
|
#
|
|
|
# creating PROJ.4 string
|
|
|
#
|
|
|
- if proj == 'll':
|
|
|
- proj4string = '+proj=longlat'
|
|
|
- elif proj == 'utm':
|
|
|
- proj4string = '+proj=%s +zone=%s' % (utm, utmzone)
|
|
|
- if utmhemisphere == 'south':
|
|
|
- proj4string += '+south'
|
|
|
- else:
|
|
|
- proj4string = '+proj=%s ' % (proj)
|
|
|
-
|
|
|
- self.shortproj4string = proj4string
|
|
|
+
|
|
|
+ proj4string = '%s %s' % (proj, proj4params)
|
|
|
|
|
|
- proj4params = ''
|
|
|
# set ellipsoid parameters
|
|
|
for item in ellipseparams:
|
|
|
if item[:4] == 'f=1/':
|
|
|
item = '+rf='+item[4:]
|
|
|
else:
|
|
|
item = '+'+item
|
|
|
- proj4params = '%s %s' % (proj4params, item)
|
|
|
+ proj4string = '%s %s' % (proj4string, item)
|
|
|
# set datum and transform parameters if relevant
|
|
|
if datumparams:
|
|
|
for item in datumparams:
|
|
|
- proj4params = '%s +%s' % (proj4params,item)
|
|
|
-
|
|
|
- proj4params = '%s +no_defs' % proj4params
|
|
|
+ proj4string = '%s +%s' % (proj4string,item)
|
|
|
|
|
|
- return '%s %s' % (proj4string, proj4params)
|
|
|
+ proj4string = '%s +no_defs' % proj4string
|
|
|
+
|
|
|
+ return proj4string
|
|
|
|
|
|
def Proj4Create(self, proj4string):
|
|
|
"""!Create a new location for selected projection
|
|
@@ -2691,7 +2745,6 @@ class SelectTransformDialog(wx.Dialog):
|
|
|
|
|
|
sizer.Fit(panel)
|
|
|
|
|
|
-
|
|
|
self.SetSize(self.GetBestSize())
|
|
|
self.Layout()
|
|
|
|