📄 wksp_map.cpp
字号:
{
CSG_Rect rWorld(Get_World(r));
double d = rWorld.Get_XRange() / r.GetWidth();
Stream.Printf(wxT("%.10f\n%.10f\n%.10f\n%.10f\n%.10f\n%.10f\n"),
d, 0.0, 0.0,-d,
rWorld.Get_XMin() - Frame * d,
rWorld.Get_YMax() + Frame * d
);
}
}
if( m_Img_Parms("LG")->asBool() && Get_Legend_Size(s, 1.0, m_Img_Parms("LZ")->asDouble()) )
{
wxFileName fn(file);
file = fn.GetName();
file.Append(wxT("_legend"));
fn.SetName(file);
file = fn.GetFullPath();
BMP.Create(s.GetWidth(), s.GetHeight());
dc.SelectObject(BMP);
dc.SetBackground(*wxWHITE_BRUSH);
dc.Clear();
Draw_Legend(dc, 1.0, m_Img_Parms("LZ")->asDouble(), wxPoint(0, 0));
dc.SelectObject(wxNullBitmap);
BMP.SaveFile(file, (wxBitmapType)type);
}
Set_Buisy_Cursor(false);
}
//---------------------------------------------------------
void CWKSP_Map::SaveAs_PDF_Indexed(void)
{
static CSG_Parameters Parameters(NULL, LNG("[CAP] Save to PDF"), LNG(""), NULL, false);
//-----------------------------------------------------
if( Parameters.Get_Count() == 0 )
{
Parameters.Add_FilePath(
NULL , "FILENAME" , LNG("[FLD] PDF Document"),
LNG(""),
wxString::Format(wxT("%s%s"),
LNG("PDF Documents (*.pdf)|*.pdf|"),
LNG("All Files|*.*")), NULL, true, false
);
Parameters.Add_Choice(
NULL , "PAPER_SIZE" , LNG("[FLD] Paper Format"),
LNG(""),
CSG_String::Format(wxT("%s|%s|%s|%s|"),
LNG("A4 Portrait"),
LNG("A4 Landscape"),
LNG("A3 Portrait"),
LNG("A3 Landscape")
)
);
Parameters.Add_String(
NULL , "NAME" , LNG("[FLD] Title"),
LNG(""),
LNG("")
);
Parameters.Add_Shapes(
NULL , "SHAPES" , LNG("[FLD] Shapes"),
LNG(""),
PARAMETER_INPUT_OPTIONAL
);
Parameters.Add_Table_Field(
Parameters("SHAPES") , "FIELD" , LNG("[FLD] Attribute"),
LNG("")
);
// Parameters.Add_Grid(
// NULL , "GRID" , LNG("[FLD] Grid"),
// LNG(""),
// PARAMETER_INPUT_OPTIONAL
// );
Parameters.Add_FilePath(
NULL , "FILEICON" , LNG("[FLD] Icon"),
LNG(""),
CSG_String::Format(wxT("%s|*.png;*.jpg|%s|*.png|%s|*.jpg|%s|*.*"),
LNG("All Recognised Files"),
LNG("PNG Files"),
LNG("JPG Files"),
LNG("All Files")
), NULL, false, false
);
Parameters.Add_Value(
NULL , "ROUNDSCALE" , LNG("[FLD] Round Scale"),
LNG(""),
PARAMETER_TYPE_Bool, true
);
}
//-----------------------------------------------------
if( DLG_Parameters(&Parameters) )
{
bool bResult, bRoundScale;
int iField;
CSG_String Name, FileName, FileName_Icon, FilePath_Maps;
CSG_Rect rOverview, rMap;
CSG_Shapes *pShapes;
// CSG_Grid *pGrid;
CSG_Doc_PDF PDF;
MSG_General_Add(wxString::Format(wxT("%s..."), LNG("[MSG] Save to PDF")), true, true);
bResult = false;
Name = Parameters("NAME") ->asString(); if( Name.Length() < 1 ) Name = LNG("Maps");
FileName = Parameters("FILENAME") ->asString();
FileName_Icon = Parameters("FILEICON") ->asString();
pShapes = Parameters("SHAPES") ->asShapes();
// pGrid = Parameters("GRID") ->asGrid();
iField = Parameters("FIELD") ->asInt();
bRoundScale = Parameters("ROUNDSCALE") ->asBool();
switch( Parameters("PAPER_SIZE")->asInt() )
{
default:
case 0: PDF.Open(PDF_PAGE_SIZE_A4, PDF_PAGE_ORIENTATION_PORTRAIT , Name); break; // A4 Portrait
case 1: PDF.Open(PDF_PAGE_SIZE_A4, PDF_PAGE_ORIENTATION_LANDSCAPE, Name); break; // A4 Landscape
case 2: PDF.Open(PDF_PAGE_SIZE_A3, PDF_PAGE_ORIENTATION_PORTRAIT , Name); break; // A3 Portrait
case 3: PDF.Open(PDF_PAGE_SIZE_A3, PDF_PAGE_ORIENTATION_LANDSCAPE, Name); break; // A3 Landscape
}
//-------------------------------------------------
if( PDF.Is_Open() )
{
PDF.Layout_Set_Box_Space(5, false);
PDF.Layout_Add_Box( 0.0, 0.0, 100.0, 75.0, "MAP");
PDF.Layout_Add_Box( 0.0, 75.0, 50.0, 100.0, "DIVISIONS");
PDF.Layout_Add_Box( 50.0, 75.0, 60.0, 80.0, "ICON");
PDF.Layout_Add_Box( 60.0, 75.0, 100.0, 80.0, "TITLE");
PDF.Layout_Add_Box( 50.0, 80.0, 100.0, 100.0, "DESCRIPTION");
FilePath_Maps = SG_File_Make_Path(SG_File_Get_Path(FileName), SG_File_Get_Name(FileName, false));
rOverview = pShapes ? pShapes->Get_Extent() : Get_Extent();
// rOverview = pShapes ? pShapes->Get_Extent() : (pGrid ? pGrid->Get_Extent() : Get_Extent());
//---------------------------------------------
// PDF.Draw_Text (PDF.Layout_Get_Box("TITLE").Get_XMin(), PDF.Layout_Get_Box("TITLE").Get_YCenter(), LNG("This is a Test!!!"), 24);
// PDF.Draw_Rectangle (PDF.Layout_Get_Box("DIVISIONS"));
// PDF.Draw_Grid (PDF.Layout_Get_Box("DIVISIONS"), Parameters("GRID")->asGrid(), CSG_Colors(), 0.0, 0.0, 0, &rOverview);
// PDF.Draw_Shapes (PDF.Layout_Get_Box("DIVISIONS"), pShapes, PDF_STYLE_POLYGON_STROKE, SG_COLOR_GREEN, SG_COLOR_BLACK, 1, &rOverview);
// PDF.Draw_Graticule (PDF.Layout_Get_Box("DIVISIONS"), rOverview);
//---------------------------------------------
Draw_PDF(&PDF, FilePath_Maps, -1, FileName_Icon, Name, rOverview, bRoundScale, iField, pShapes);
if( pShapes )
{
for(int i=0; i<pShapes->Get_Count() && SG_UI_Process_Set_Progress(i, pShapes->Get_Count()); i++)
{
Draw_PDF(&PDF, FilePath_Maps, i, FileName_Icon, Name, pShapes->Get_Shape(i)->Get_Extent(), bRoundScale, iField, pShapes);
}
}
//---------------------------------------------
PROCESS_Set_Okay(true);
Set_Buisy_Cursor(true);
bResult = PDF.Save(FileName);
Set_Buisy_Cursor(false);
}
MSG_General_Add(bResult ? LNG("[MSG] okay") : LNG("[MSG] failed"), false, false);
}
}
//---------------------------------------------------------
void CWKSP_Map::Draw_PDF(CSG_Doc_PDF *pPDF, const wxChar *FilePath_Maps, int Image_ID, const wxChar *FileName_Icon, const wxChar *Title, CSG_Rect rWorld, bool bRoundScale, int iField, CSG_Shapes *pShapes)
{
int FrameSize_1 = 20, FrameSize_2 = 10;
double d, e, Scale, Ratio;
CSG_String FileName, Description, s;
CSG_Rect rBox;
wxRect rBMP;
wxBitmap BMP;
wxMemoryDC dc;
if( pPDF && rWorld.Get_XRange() > 0.0 && rWorld.Get_YRange() > 0.0 && pPDF->Add_Page() )
{
rWorld.Inflate(5.0, true);
//-------------------------------------------------
rBox = pPDF->Layout_Get_Box("MAP");
rBox.Deflate(FrameSize_1, false);
rBMP = wxRect(0, 0, (int)rBox.Get_XRange(), (int)rBox.Get_YRange());
BMP.Create(rBMP.GetWidth(), rBMP.GetHeight());
dc.SelectObject(BMP);
dc.SetBackground(*wxWHITE_BRUSH);
dc.Clear();
if( bRoundScale )
{
Scale = rWorld.Get_XRange() / (pPDF->Get_Page_To_Meter() * (double)rBMP.GetWidth());
// if( Scale > 1000 )
// {
Ratio = ((ceil(Scale / 1000.)) / (Scale / 1000.) - 1);
rWorld.Inflate(Ratio * 100, true);
// }
}
Scale = rWorld.Get_XRange() / (pPDF->Get_Page_To_Meter() * rBMP.GetWidth());
Draw_Map(dc, rWorld, 1.0, rBMP, false);
dc.SelectObject(wxNullBitmap);
SG_Dir_Create(FilePath_Maps);
FileName = SG_File_Make_Path(FilePath_Maps, wxString::Format(wxT("image_%03d"), Image_ID + 1), wxT("png"));
BMP.SaveFile(FileName.c_str(), wxBITMAP_TYPE_PNG);
pPDF->Draw_Image (rBox, FileName);
pPDF->Draw_Graticule(rBox, rWorld, FrameSize_1);
//-------------------------------------------------
rBox = pPDF->Layout_Get_Box("ICON");
if( FileName_Icon )
{
pPDF->Draw_Image(rBox, FileName_Icon);
}
else
{
pPDF->Draw_Rectangle(rBox);
}
//-------------------------------------------------
rBox = pPDF->Layout_Get_Box("DIVISIONS");
pPDF->Draw_Rectangle(rBox);
if( pShapes )
{
CSG_Rect rShapes(pShapes->Get_Extent());
rShapes.Inflate(5.0, true);
rBox.Deflate(FrameSize_2, false);
pPDF->Draw_Graticule(rBox, rShapes, FrameSize_2);
pPDF->Draw_Shapes(rBox, pShapes, PDF_STYLE_POLYGON_FILLSTROKE, SG_COLOR_GREEN, SG_COLOR_BLACK, 0, &rShapes);
if( Image_ID >= 0 && Image_ID < pShapes->Get_Count() )
{
pPDF->Draw_Shape(rBox, pShapes->Get_Shape(Image_ID), PDF_STYLE_POLYGON_FILLSTROKE, SG_COLOR_YELLOW, SG_COLOR_RED, 1, &rShapes);
}
}
//-------------------------------------------------
rBox = pPDF->Layout_Get_Box("TITLE");
pPDF->Draw_Text(rBox.Get_XMin(), rBox.Get_YCenter(), Title, 20, PDF_STYLE_TEXT_ALIGN_H_LEFT|PDF_STYLE_TEXT_ALIGN_V_CENTER|PDF_STYLE_TEXT_UNDERLINE);
//-------------------------------------------------
rBox = pPDF->Layout_Get_Box("DESCRIPTION");
Description.Append(wxString::Format(wxT("%d. %s\n"), Image_ID + 2, LNG("Map")));
if( pShapes && Image_ID >= 0 && Image_ID < pShapes->Get_Count() )
{
switch( pShapes->Get_Type() )
{
default:
break;
case SHAPE_TYPE_Line:
d = ((CSG_Shape_Line *)pShapes->Get_Shape(Image_ID))->Get_Length();
e = d > 1000.0 ? 1000.0 : 1.0;
s = d > 1000.0 ? wxT("km") : wxT("m");
Description.Append(wxString::Format(wxT("%s: %f%s\n"), LNG("Length") , d / e, s.c_str()));
break;
case SHAPE_TYPE_Polygon:
d = ((CSG_Shape_Polygon *)pShapes->Get_Shape(Image_ID))->Get_Area();
e = d > 1000000.0 ? 1000000.0 : (d > 10000.0 ? 10000.0 : 1.0);
s = d > 1000000.0 ? wxT("km\xc2\xb2") : (d > 10000.0 ? wxT("ha") : wxT("m\xc2\xb2"));
Description.Append(wxString::Format(wxT("%s: %f%s\n"), LNG("Area") , d / e, s.c_str()));
d = ((CSG_Shape_Polygon *)pShapes->Get_Shape(Image_ID))->Get_Perimeter();
e = d > 1000.0 ? 1000.0 : 1.0;
s = d > 1000.0 ? wxT("km") : wxT("m");
Description.Append(wxString::Format(wxT("%s: %f%s\n"), LNG("Perimeter") , d / e, s.c_str()));
Description.Append(wxString::Format(wxT("%s: %d\n") , LNG("Parts") , ((CSG_Shape_Polygon *)pShapes->Get_Shape(Image_ID))->Get_Part_Count()));
break;
}
if( iField >= 0 && iField < pShapes->Get_Table().Get_Field_Count() )
{
Description.Append(wxString::Format(wxT("%s: %s\n"), pShapes->Get_Table().Get_Field_Name(iField), pShapes->Get_Shape(Image_ID)->Get_Record()->asString(iField)));
}
}
Description.Append(wxString::Format(wxT("%s 1:%s"), LNG("Scale"), SG_Get_String(Scale, 2).c_str()));
pPDF->Draw_Text(rBox.Get_XMin(), rBox.Get_YMax(), Description, 12, PDF_STYLE_TEXT_ALIGN_H_LEFT|PDF_STYLE_TEXT_ALIGN_V_TOP);
}
}
//---------------------------------------------------------
void CWKSP_Map::SaveAs_Interactive_SVG(void)
{
static CSG_Parameters Parameters(NULL, LNG("[CAP] Save As Interactive SVG"), LNG(""), NULL, false);
//-----------------------------------------------------
if( Parameters.Get_Count() == 0 )
{
Parameters.Add_FilePath(
NULL , "FILENAME" , LNG("[FLD] SVG File"),
LNG(""),
wxString::Format(wxT("%s|*.svg|%s|*.*"),
LNG("SVG - Scalable Vector Graphics Files (*.svg)"),
LNG("All Files")
), NULL, true, false
);
Parameters.Add_Shapes(
NULL , "SHAPES" , LNG("[FLD] Index Layer"),
LNG(""),
PARAMETER_INPUT_OPTIONAL
);
}
//-----------------------------------------------------
if( DLG_Parameters(&Parameters) )
{
CSG_String FileName;
CSG_Shapes *pIndexLayer;
CSVG_Interactive_Map SVG;
MSG_General_Add(wxString::Format(wxT("%s..."), LNG("[MSG] Save as Interactive SVG")), true, true);
pIndexLayer = Parameters("SHAPES") ->asShapes();
FileName = Parameters("FILENAME") ->asString();
SVG.Create_From_Map(this, pIndexLayer, FileName);
MSG_General_Add(LNG("[MSG] okay"), false, false);
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
void CWKSP_Map::Draw_Map(wxDC &dc, double Zoom, const wxRect &rClient, bool bEdit, int Background)
{
Draw_Map(dc, Get_World(rClient), Zoom, rClient, bEdit, Background);
}
//---------------------------------------------------------
void CWKSP_Map::Draw_Map(wxDC &dc, const CSG_Rect &rWorld, double Zoom, const wxRect &rClient, bool bEdit, int Background)
{
CWKSP_Layer *pLayer;
CWKSP_Map_DC dc_Map(rWorld, rClient, Zoom, Background);
for(int i=Get_Count()-1; i>=0; i--)
{
pLayer = Get_Layer(i)->Get_Layer();
if( pLayer->do_Show(Get_Extent()) )
{
pLayer->Draw(dc_Map, bEdit && pLayer == Get_Active_Layer());
}
}
dc_Map.Draw(dc);
}
//---------------------------------------------------------
void CWKSP_Map::Draw_Frame(wxDC &dc, wxRect rMap, int Width)
{
Draw_Frame(dc, Get_World(rMap), rMap, Width);
}
void CWKSP_Map::Draw_Frame(wxDC &dc, const CSG_Rect &rWorld, wxRect rMap, int Width)
{
wxRect r, rFrame(rMap);
Draw_Edge(dc, EDGE_STYLE_SIMPLE, rMap.GetLeft(), rMap.GetTop(), rMap.GetRight(), rMap.GetBottom());
rFrame.Inflate(Width);
r = wxRect(rMap.GetLeft() , rFrame.GetTop() , rMap.GetWidth(), Width);
Draw_Scale(dc, r, rWorld.Get_XMin(), rWorld.Get_XMax() , true , true , false);
r = wxRect(rMap.GetLeft() , rMap.GetBottom() , rMap.GetWidth(), Width);
Draw_Scale(dc, r, 0.0 , rWorld.Get_XRange(), true , true , true);
r = wxRect(rFrame.GetLeft() , rMap.GetTop() , Width, rMap.GetHeight());
Draw_Scale(dc, r, rWorld.Get_YMin(), rWorld.Get_YMax() , false, false, false);
r = wxRect(rMap.GetRight() , rMap.GetTop() , Width, rMap.GetHeight());
Draw_Scale(dc, r, 0.0 , rWorld.Get_YRange(), false, false, true);
Draw_Edge(dc, EDGE_STYLE_SIMPLE, rFrame.GetLeft(), rFrame.GetTop(), rFrame.GetRight(), rFrame.GetBottom());
}
//---------------------------------------------------------
bool CWKSP_Map::Draw_Legend(wxDC &dc, double Zoom_Map, double Zoom, wxPoint Position, wxSize *pSize, int Layout)
{
bool bVertical;
int i, n;
wxSize s, Size;
Size.x = 0;
Size.y = 0;
bVertical = (Layout & LEGEND_LAYOUT_VERTICAL) != 0;
for(i=0, n=0; i<Get_Count(); i++)
{
if( Get_Layer(i)->Get_Layer()->do_Legend() )
{
n++;
Get_Layer(i)->Get_Layer()->Get_Legend()->Draw(dc, Zoom, Zoom_Map, Position, &s, bVertical);
if( bVertical )
{
s.y += (int)(Zoom * LEGEND_SPACE);
Position.y += s.y;
Size.y += s.y;
if( Size.x < s.x )
Size.x = s.x;
}
else
{
s.x += (int)(Zoom * LEGEND_SPACE);
Position.x += s.x;
Size.x += s.x;
if( Size.y < s.y )
Size.y = s.y;
}
}
}
if( pSize )
{
*pSize = Size;
}
return( n > 0 );
}
//---------------------------------------------------------
bool CWKSP_Map::Get_Legend_Size(wxSize &Size, double Zoom_Map, double Zoom, int Layout)
{
wxMemoryDC dc;
return( Draw_Legend(dc, Zoom_Map, Zoom, wxPoint(0, 0), &Size, Layout) );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -