123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- """
- @package datacatalog.dialogs
- @brief Dialogs used in data catalog
- Classes:
- - dialogs::CatalogReprojectionDialog
- (C) 2017 by the GRASS Development Team
- This program is free software under the GNU General Public License
- (>=v2). Read the file COPYING that comes with GRASS for details.
- @author Anna Petrasova <kratochanna gmail.com>
- """
- import wx
- from gui_core.widgets import FloatValidator, IntegerValidator
- from core.giface import Notification
- from core.gcmd import RunCommand
- from gui_core.wrap import Button, StaticText, TextCtrl
- from grass.script import parse_key_val, region_env
- class CatalogReprojectionDialog(wx.Dialog):
- def __init__(
- self,
- parent,
- giface,
- inputGisdbase,
- inputLocation,
- inputMapset,
- inputLayer,
- inputEnv,
- outputGisdbase,
- outputLocation,
- outputMapset,
- outputLayer,
- etype,
- outputEnv,
- callback,
- id=wx.ID_ANY,
- title=_("Reprojection"),
- style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER,
- ):
- self.parent = parent
- self._giface = giface
- wx.Dialog.__init__(
- self, parent, id, title, style=style, name="ReprojectionDialog"
- )
- self.panel = wx.Panel(parent=self)
- self.iGisdbase = inputGisdbase
- self.iLocation = inputLocation
- self.iMapset = inputMapset
- self.iLayer = inputLayer
- self.iEnv = inputEnv
- self.oGisdbase = outputGisdbase
- self.oLocation = outputLocation
- self.oMapset = outputMapset
- self.oLayer = outputLayer
- self.etype = etype
- self.oEnv = outputEnv
- self.callback = callback
- self._widgets()
- self._doLayout()
- if self.etype == "raster":
- self._estimateResampling()
- self._estimateResolution()
- def _widgets(self):
- if self.etype == "raster":
- self.resolution = TextCtrl(self.panel, validator=FloatValidator())
- self.resampling = wx.Choice(
- self.panel,
- size=(200, -1),
- choices=[
- "nearest",
- "bilinear",
- "bicubic",
- "lanczos",
- "bilinear_f",
- "bicubic_f",
- "lanczos_f",
- ],
- )
- else:
- self.vsplit = TextCtrl(self.panel, validator=IntegerValidator())
- self.vsplit.SetValue("10000")
- #
- # buttons
- #
- self.btn_close = Button(parent=self.panel, id=wx.ID_CLOSE)
- self.SetEscapeId(self.btn_close.GetId())
- # run
- self.btn_run = Button(parent=self.panel, id=wx.ID_OK, label=_("Reproject"))
- if self.etype == "raster":
- self.btn_run.SetToolTip(_("Reproject raster"))
- elif self.etype == "vector":
- self.btn_run.SetToolTip(_("Reproject vector"))
- self.btn_run.SetDefault()
- self.btn_run.Bind(wx.EVT_BUTTON, self.OnReproject)
- def _doLayout(self):
- """Do layout"""
- dialogSizer = wx.BoxSizer(wx.VERTICAL)
- optionsSizer = wx.GridBagSizer(5, 5)
- label = _(
- "Map layer <{ml}> needs to be reprojected.\n"
- "Please review and modify reprojection parameters:"
- ).format(ml=self.iLayer)
- dialogSizer.Add(
- StaticText(self.panel, label=label), flag=wx.ALL | wx.EXPAND, border=10
- )
- if self.etype == "raster":
- optionsSizer.Add(
- StaticText(self.panel, label=_("Estimated resolution:")),
- pos=(0, 0),
- flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL,
- )
- optionsSizer.Add(self.resolution, pos=(0, 1), flag=wx.EXPAND)
- optionsSizer.Add(
- StaticText(self.panel, label=_("Resampling method:")),
- pos=(1, 0),
- flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL,
- )
- optionsSizer.Add(self.resampling, pos=(1, 1), flag=wx.EXPAND)
- else:
- optionsSizer.Add(
- StaticText(self.panel, label=_("Maximum segment length:")),
- pos=(1, 0),
- flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL,
- )
- optionsSizer.Add(self.vsplit, pos=(1, 1), flag=wx.EXPAND)
- optionsSizer.AddGrowableCol(1)
- dialogSizer.Add(optionsSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=10)
- helptext = StaticText(
- self.panel,
- label="For more reprojection options,"
- " please see {module}".format(
- module="r.proj" if self.etype == "raster" else "v.proj"
- ),
- )
- dialogSizer.Add(helptext, proportion=0, flag=wx.ALL | wx.EXPAND, border=10)
- #
- # buttons
- #
- btnStdSizer = wx.StdDialogButtonSizer()
- btnStdSizer.AddButton(self.btn_run)
- btnStdSizer.AddButton(self.btn_close)
- btnStdSizer.Realize()
- dialogSizer.Add(btnStdSizer, proportion=0, flag=wx.ALL | wx.EXPAND, border=5)
- self.panel.SetSizer(dialogSizer)
- dialogSizer.Fit(self.panel)
- self.Layout()
- self.SetSize(self.GetBestSize())
- def _estimateResolution(self):
- output = RunCommand(
- "r.proj",
- flags="g",
- quiet=False,
- read=True,
- input=self.iLayer,
- dbase=self.iGisdbase,
- location=self.iLocation,
- mapset=self.iMapset,
- env=self.oEnv,
- ).strip()
- params = parse_key_val(output, vsep=" ")
- output = RunCommand(
- "g.region",
- flags="ug",
- quiet=False,
- read=True,
- env=self.oEnv,
- parse=lambda x: parse_key_val(x, val_type=float),
- **params,
- )
- cell_ns = (output["n"] - output["s"]) / output["rows"]
- cell_ew = (output["e"] - output["w"]) / output["cols"]
- estimate = (cell_ew + cell_ns) / 2.0
- self.resolution.SetValue(str(estimate))
- self.params = params
- def _estimateResampling(self):
- output = RunCommand(
- "r.info",
- flags="g",
- quiet=False,
- read=True,
- map=self.iLayer,
- env=self.iEnv,
- parse=parse_key_val,
- )
- if output["datatype"] == "CELL":
- self.resampling.SetStringSelection("nearest")
- else:
- self.resampling.SetStringSelection("bilinear")
- def OnReproject(self, event):
- cmd = []
- if self.etype == "raster":
- cmd.append("r.proj")
- cmd.append("dbase=" + self.iGisdbase)
- cmd.append("location=" + self.iLocation)
- cmd.append("mapset=" + self.iMapset)
- cmd.append("input=" + self.iLayer)
- cmd.append("output=" + self.oLayer)
- cmd.append("method=" + self.resampling.GetStringSelection())
- self.oEnv["GRASS_REGION"] = region_env(
- n=self.params["n"],
- s=self.params["s"],
- e=self.params["e"],
- w=self.params["w"],
- flags="a",
- res=float(self.resolution.GetValue()),
- env=self.oEnv,
- )
- else:
- cmd.append("v.proj")
- cmd.append("dbase=" + self.iGisdbase)
- cmd.append("location=" + self.iLocation)
- cmd.append("mapset=" + self.iMapset)
- cmd.append("input=" + self.iLayer)
- cmd.append("output=" + self.oLayer)
- cmd.append("smax=" + self.vsplit.GetValue())
- self._giface.RunCmd(
- cmd,
- env=self.oEnv,
- compReg=False,
- addLayer=False,
- onDone=self._onDone,
- userData=None,
- notification=Notification.MAKE_VISIBLE,
- )
- event.Skip()
- def _onDone(self, event):
- self.callback()
|