///////////////////////////////////////////////////////////
// //
// SAGA //
// //
// System for Automated Geoscientific Analyses //
// //
// User Interface //
// //
// Program: SAGA //
// //
//-------------------------------------------------------//
// //
// wksp_map_basemap.cpp //
// //
// Copyright (C) 2016 by Olaf Conrad //
// //
//-------------------------------------------------------//
// //
// This file is part of 'SAGA - System for Automated //
// Geoscientific Analyses'. SAGA is free software; you //
// can redistribute it and/or modify it under the terms //
// of the GNU General Public License as published by the //
// Free Software Foundation, either version 2 of the //
// License, or (at your option) any later version. //
// //
// SAGA is distributed in the hope that it will be //
// useful, but WITHOUT ANY WARRANTY; without even the //
// implied warranty of MERCHANTABILITY or FITNESS FOR A //
// PARTICULAR PURPOSE. See the GNU General Public //
// License for more details. //
// //
// You should have received a copy of the GNU General //
// Public License along with this program; if not, see //
// . //
// //
//-------------------------------------------------------//
// //
// contact: Olaf Conrad //
// Institute of Geography //
// University of Hamburg //
// Germany //
// //
// e-mail: oconrad@saga-gis.org //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#include
#include
#include
#include "helper.h"
#include "res_commands.h"
#include "res_dialogs.h"
#include "wksp_map.h"
#include "wksp_map_manager.h"
#include "wksp_map_basemap.h"
#include "wksp_map_dc.h"
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
CWKSP_Map_BaseMap::CWKSP_Map_BaseMap(CSG_MetaData *pEntry)
{
m_bShow = true;
m_pTool = NULL; // remember the last created base map tool instance
//-----------------------------------------------------
m_Parameters.Set_Name ("BASEMAP");
m_Parameters.Set_Identifier("BASEMAP");
//-----------------------------------------------------
m_Parameters.Add_Node("", "NODE_GENERAL",_TL("General") , _TL(""));
m_Parameters.Add_String("NODE_GENERAL",
"NAME" , _TL("Name"),
_TL(""),
_TL("Base Map")
);
m_Parameters.Add_Choice("NODE_GENERAL",
"SERVER" , _TL("Server"),
_TL(""),
CSG_String::Format("%s|%s|%s|%s|%s|%s|%s|%s|%s",
_TL("Open Street Map"),
_TL("Google Map"),
_TL("Google Satellite"),
_TL("Google Hybrid"),
_TL("Google Terrain"),
_TL("Google Terrain, Streets and Water"),
_TL("ArcGIS MapServer Tiles"),
_TL("TopPlusOpen"),
_TL("user defined")
), 0
);
m_Parameters.Add_String("SERVER",
"SERVER_USER", _TL("Server"),
_TL(""),
"tile.openstreetmap.org/${z}/${x}/${y}.png"
);
m_Parameters.Add_Bool("NODE_GENERAL",
"CACHE" , _TL("Cache"),
_TL("Enable local disk cache. Allows for offline operation."),
g_pMaps->Get_Parameter("CACHE")->asBool()
);
m_Parameters.Add_FilePath("CACHE",
"CACHE_DIR" , _TL("Cache Directory"),
_TL("If not specified the cache will be created in the current user's temporary directory."),
NULL, g_pMaps->Get_Parameter("CACHE_DIR")->asString(), false, true
);
//-----------------------------------------------------
m_Parameters.Add_Bool("NODE_GENERAL",
"SHOW_ALWAYS" , _TL("Show at all scales"),
_TL(""),
true
);
m_Parameters.Add_Range("NODE_GENERAL",
"SHOW_RANGE" , _TL("Scale Range"),
_TL("only show within scale range; values are given as extent measured in map units"),
100., 1000., 0., true
);
//-----------------------------------------------------
m_Parameters.Add_Node("", "NODE_DISPLAY",_TL("Display") , _TL(""));
m_Parameters.Add_Double("NODE_DISPLAY",
"TRANSPARENCY" , _TL("Transparency [%]"),
_TL(""),
0., 0., true, 100., true
);
m_Parameters.Add_Double("NODE_DISPLAY",
"BRIGHTNESS" , _TL("Maximum Brightness [%]"),
_TL("Brightness threshold below a pixel is displayed. Set to 100% to display all (default)."),
100., 0., true, 100., true
);
m_Parameters.Add_Bool("NODE_DISPLAY",
"GRAYSCALE" , _TL("Gray Scale Image"),
_TL(""),
false
);
m_Parameters.Add_Double("NODE_DISPLAY",
"RESOLUTION" , _TL("Resolution"),
_TL("resolution measured in screen pixels"),
1., 1., true
);
//-----------------------------------------------------
m_Parameters.Add_Choice("NODE_DISPLAY",
"POSITION" , _TL("Position"),
_TL(""),
CSG_String::Format("%s|%s",
_TL("top"),
_TL("bottom")
), 1
)->Set_Enabled(false);
//-----------------------------------------------------
if( pEntry )
{
Load(*pEntry);
}
}
//---------------------------------------------------------
CWKSP_Map_BaseMap::~CWKSP_Map_BaseMap(void)
{}
///////////////////////////////////////////////////////////
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CWKSP_Map_BaseMap::Load(CSG_MetaData &Entry)
{
return( m_Parameters.Serialize(Entry, false) );
}
//---------------------------------------------------------
bool CWKSP_Map_BaseMap::Save(CSG_MetaData &Entry)
{
return( m_Parameters.Serialize(*Entry.Add_Child("BASEMAP"), true) );
}
///////////////////////////////////////////////////////////
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
wxString CWKSP_Map_BaseMap::Get_Name(void)
{
wxString Name(m_Parameters("NAME")->asString());
return( !m_bShow ? "* " + Name : Name );
}
//---------------------------------------------------------
wxString CWKSP_Map_BaseMap::Get_Description(void)
{
wxString s;
//-----------------------------------------------------
s += wxString::Format("%s
", _TL("Base Map"));
s += "";
DESC_ADD_STR(_TL("Name" ), m_Parameters("NAME")->asString());
DESC_ADD_STR(_TL("Projection"), Get_Map()->Get_Projection().Get_Description().c_str());
s += wxT("
");
//-----------------------------------------------------
s += "
";
s += _TL("Be sure to read and understand the usage agreement or terms of service before you use a base map server.");
s += "";
//-----------------------------------------------------
return( s );
}
//---------------------------------------------------------
wxMenu * CWKSP_Map_BaseMap::Get_Menu(void)
{
wxMenu *pMenu = new wxMenu(m_Parameters("NAME")->asString());
CMD_Menu_Add_Item(pMenu, false, ID_CMD_WKSP_ITEM_CLOSE);
CMD_Menu_Add_Item(pMenu, true, ID_CMD_MAPS_LAYER_SHOW);
pMenu->AppendSeparator();
CMD_Menu_Add_Item(pMenu, false, ID_CMD_MAPS_MOVE_TOP);
CMD_Menu_Add_Item(pMenu, false, ID_CMD_MAPS_MOVE_UP);
CMD_Menu_Add_Item(pMenu, false, ID_CMD_MAPS_MOVE_DOWN);
CMD_Menu_Add_Item(pMenu, false, ID_CMD_MAPS_MOVE_BOTTOM);
return( pMenu );
}
///////////////////////////////////////////////////////////
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CWKSP_Map_BaseMap::On_Command(int Cmd_ID)
{
switch( Cmd_ID )
{
default:
return( CWKSP_Base_Item::On_Command(Cmd_ID) );
case ID_CMD_WKSP_ITEM_RETURN:
case ID_CMD_MAPS_LAYER_SHOW:
m_bShow = !m_bShow;
((wxTreeCtrl *)Get_Control())->SetItemText(GetId(), Get_Name());
((CWKSP_Map *)Get_Manager())->View_Refresh(true);
break;
case ID_CMD_MAPS_MOVE_TOP:
if( Get_Manager()->Move_Top(this) )
((CWKSP_Map *)Get_Manager())->View_Refresh(false);
break;
case ID_CMD_MAPS_MOVE_BOTTOM:
if( Get_Manager()->Move_Bottom(this) )
((CWKSP_Map *)Get_Manager())->View_Refresh(false);
break;
case ID_CMD_MAPS_MOVE_UP:
if( Get_Manager()->Move_Up(this) )
((CWKSP_Map *)Get_Manager())->View_Refresh(false);
break;
case ID_CMD_MAPS_MOVE_DOWN:
if( Get_Manager()->Move_Down(this) )
((CWKSP_Map *)Get_Manager())->View_Refresh(false);
break;
}
return( true );
}
//---------------------------------------------------------
bool CWKSP_Map_BaseMap::On_Command_UI(wxUpdateUIEvent &event)
{
switch( event.GetId() )
{
default:
return( CWKSP_Base_Item::On_Command_UI(event) );
case ID_CMD_MAPS_LAYER_SHOW:
event.Check(m_bShow);
break;
case ID_CMD_MAPS_MOVE_TOP:
case ID_CMD_MAPS_MOVE_UP:
event.Enable(Get_Index() > 0);
break;
case ID_CMD_MAPS_MOVE_DOWN:
case ID_CMD_MAPS_MOVE_BOTTOM:
event.Enable(Get_Index() < Get_Manager()->Get_Count() - 1);
break;
}
return( true );
}
///////////////////////////////////////////////////////////
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
int CWKSP_Map_BaseMap::On_Parameter_Changed(CSG_Parameters *pParameters, CSG_Parameter *pParameter, int Flags)
{
if( Flags & PARAMETER_CHECK_ENABLE )
{
if( pParameter->Cmp_Identifier("SHOW_ALWAYS") )
{
pParameters->Set_Enabled("SHOW_RANGE" , pParameter->asBool() == false);
}
if( pParameter->Cmp_Identifier("SERVER") )
{
pParameters->Set_Enabled("SERVER_USER", pParameter->asInt() >= pParameter->asChoice()->Get_Count() - 1); // user defined
}
if( pParameter->Cmp_Identifier("CACHE") )
{
pParameters->Set_Enabled("CACHE_DIR" , pParameter->asBool());
}
}
return( CWKSP_Base_Item::On_Parameter_Changed(pParameters, pParameter, Flags) );
}
//---------------------------------------------------------
void CWKSP_Map_BaseMap::Parameters_Changed(void)
{
CWKSP_Base_Item::Parameters_Changed();
m_BaseMap.Destroy(); // forcing a base map refresh
Get_Map()->View_Refresh(true);
}
///////////////////////////////////////////////////////////
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CWKSP_Map_BaseMap::Dlg_Parameters(void)
{
m_Parameters("POSITION")->Set_Enabled(true);
bool bResult = DLG_Parameters(&m_Parameters);
m_Parameters("POSITION")->Set_Enabled(false);
return( bResult );
}
///////////////////////////////////////////////////////////
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CWKSP_Map_BaseMap::Set_BaseMap(const CSG_Grid_System &System)
{
CSG_Tool *pTool;
if( !Get_Map()->Get_Projection().is_Okay() || !(pTool = SG_Get_Tool_Library_Manager().Create_Tool("io_gdal", 9)) )
{
m_BaseMap.Destroy();
return( false );
}
SG_UI_ProgressAndMsg_Lock(true);
//-----------------------------------------------------
CSG_Grid BaseMap;
if( m_Parameters("RESOLUTION")->asDouble() > 1. )
{
BaseMap.Create(CSG_Grid_System(m_Parameters("RESOLUTION")->asDouble() * System.Get_Cellsize(), System.Get_Extent(true)), SG_DATATYPE_Int);
}
else
{
BaseMap.Create(System);
}
BaseMap.Get_Projection() = Get_Map()->Get_Projection();
m_pTool = pTool; // remember the last created base map tool instance
pTool->Set_Manager(NULL);
if( pTool->Set_Parameter("TARGET" , &BaseMap)
&& pTool->Set_Parameter("TARGET_MAP" , &BaseMap)
&& pTool->Set_Parameter("SERVER" , m_Parameters("SERVER" ))
&& pTool->Set_Parameter("SERVER_USER", m_Parameters("SERVER_USER"))
&& pTool->Set_Parameter("CACHE" , m_Parameters("CACHE" ))
&& pTool->Set_Parameter("CACHE_DIR" , m_Parameters("CACHE_DIR" ))
&& pTool->Set_Parameter("GRAYSCALE" , m_Parameters("GRAYSCALE" ))
&& pTool->On_Before_Execution() && pTool->Execute() && pTool == m_pTool )
{
m_pTool = NULL;
m_BaseMap.Create(System, SG_DATATYPE_Int);
if( System == BaseMap.Get_System() )
{
#pragma omp parallel for
for(int i=0; iasDouble() < 100. )
{
int Threshold = (int)(0.5 + 3 * 255 * m_Parameters("BRIGHTNESS")->asDouble() / 100.);
#pragma omp parallel for
for(int i=0; iasBool() )
{
CSG_Parameter_Range *pRange = m_Parameters("SHOW_RANGE")->asRange();
double dRange = dc_Map.m_rWorld.Get_XRange() > dc_Map.m_rWorld.Get_YRange() ? dc_Map.m_rWorld.Get_XRange() : dc_Map.m_rWorld.Get_YRange();
if( dRange < pRange->Get_Min() || pRange->Get_Max() < dRange )
{
return( false );
}
}
//-----------------------------------------------------
CSG_Grid_System System(dc_Map.m_DC2World, dc_Map.m_rWorld.Get_XMin(), dc_Map.m_rWorld.Get_YMin(), dc_Map.m_rDC.GetWidth(), dc_Map.m_rDC.GetHeight());
if( !System.is_Equal(m_BaseMap.Get_System()) && !Set_BaseMap(System) )
{
return( false );
}
//-----------------------------------------------------
if( dc_Map.IMG_Draw_Begin(m_Parameters("TRANSPARENCY")->asDouble() / 100.) )
{
#pragma omp parallel for
for(int y=0; y