Ver código fonte

Backport from develbranch_6 r39554. Major enhancement and fix. All projection parameters now selectable by user. Summary page shows g.proj output (i.e., what will show up in GRASS). State Plane projection will bring up a warning box instructing user to use EPSG or custom PROJ4 string. Fixed a number of minor and a few major bugs.

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@39573 15284696-431f-4ddb-bdfa-cd5b030d7da7
Michael Barton 15 anos atrás
pai
commit
28d47f86c9
1 arquivos alterados com 300 adições e 247 exclusões
  1. 300 247
      gui/wxpython/gui_modules/location_wizard.py

+ 300 - 247
gui/wxpython/gui_modules/location_wizard.py

@@ -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()