//--------------------------------------------------------- void CGrid_Filler::Parameters_Add(CSG_Parameters &Parameters) { Parameters.Add_Grid("", "GRID" , _TL("Grid"), _TL(""), PARAMETER_INPUT ); Parameters.Add_Grid("", "GRID_OUT" , _TL("Changed Grid"), _TL(""), PARAMETER_OUTPUT_OPTIONAL ); Parameters.Add_Choice("", "REPLACE" , _TL("Value to be replaced"), _TL(""), CSG_String::Format("%s|%s|", _TL("value at mouse position"), _TL("fixed value") ), 0 ); Parameters.Add_Double("REPLACE", "REPLACE_VALUE" , _TL("Fixed value to be replaced"), _TL("Replace only this value with respect to the specified tolerance."), 0.0 ); Parameters.Add_Double("REPLACE", "TOLERANCE" , _TL("Tolerance"), _TL(""), 1.0, 0.0, true ); Parameters.Add_Bool("REPLACE", "IGNORE_NODATA" , _TL("Ignore No-Data"), _TL("Do not fill areas representing no-data."), true ); Parameters.Add_Bool("", "FILL_NODATA" , _TL("Fill with No-Data"), _TL(""), false ); Parameters.Add_Double("FILL_NODATA", "FILL_VALUE" , _TL("Fill Value"), _TL(""), 0.0 ); }
//--------------------------------------------------------- void CVIEW_Table_Control::On_Field_Sort(wxCommandEvent &event) { CSG_String sFields, sOrder; CSG_Parameter *pNode; CSG_Parameters P; //----------------------------------------------------- for(int i=0; i<m_pTable->Get_Field_Count(); i++) { sFields.Append(m_pTable->Get_Field_Name(i)); sFields.Append('|'); } sOrder.Printf(SG_T("%s|%s|%s|"), _TL("unsorted"), _TL("ascending"), _TL("descending") ); //----------------------------------------------------- P.Set_Name(_TL("Sort Table")); pNode = P.Add_Choice(NULL , "FIELD_1" , _TL("Sort first by") , _TL(""), sFields , !m_pTable->is_Indexed() ? 0 : m_pTable->Get_Index_Field(0)); pNode = P.Add_Choice(pNode, "ORDER_1" , _TL("Direction") , _TL(""), sOrder , !m_pTable->is_Indexed() ? 1 : m_pTable->Get_Index_Order(0)); pNode = P.Add_Choice(NULL , "FIELD_2" , _TL("Sort second by") , _TL(""), sFields , !m_pTable->is_Indexed() ? 0 : m_pTable->Get_Index_Field(1)); pNode = P.Add_Choice(pNode, "ORDER_2" , _TL("Direction") , _TL(""), sOrder , !m_pTable->is_Indexed() ? 0 : m_pTable->Get_Index_Order(1)); pNode = P.Add_Choice(NULL , "FIELD_3" , _TL("Sort third by") , _TL(""), sFields , !m_pTable->is_Indexed() ? 0 : m_pTable->Get_Index_Field(2)); pNode = P.Add_Choice(pNode, "ORDER_3" , _TL("Direction") , _TL(""), sOrder , !m_pTable->is_Indexed() ? 0 : m_pTable->Get_Index_Order(2)); //----------------------------------------------------- if( DLG_Parameters(&P) ) { m_pTable->Set_Index( P("FIELD_1")->asInt(), P("ORDER_1")->asInt() == 1 ? TABLE_INDEX_Ascending : P("ORDER_1")->asInt() == 2 ? TABLE_INDEX_Descending : TABLE_INDEX_None, P("FIELD_2")->asInt(), P("ORDER_2")->asInt() == 1 ? TABLE_INDEX_Ascending : P("ORDER_2")->asInt() == 2 ? TABLE_INDEX_Descending : TABLE_INDEX_None, P("FIELD_3")->asInt(), P("ORDER_3")->asInt() == 1 ? TABLE_INDEX_Ascending : P("ORDER_3")->asInt() == 2 ? TABLE_INDEX_Descending : TABLE_INDEX_None ); _Set_Records(); } }
//--------------------------------------------------------- void CVIEW_Table_Control::On_Field_Type(wxCommandEvent &event) { int i, *Types = new int[m_pTable->Get_Field_Count()]; CSG_Parameters P; P.Set_Name(_TL("Change Field Type")); for(i=0; i<m_pTable->Get_Field_Count(); i++) { switch( m_pTable->Get_Field_Type(i) ) { default: case SG_DATATYPE_String: Types[i] = 0; break; case SG_DATATYPE_Date: Types[i] = 1; break; case SG_DATATYPE_Color: Types[i] = 2; break; case SG_DATATYPE_Byte: Types[i] = 3; break; case SG_DATATYPE_Char: Types[i] = 4; break; case SG_DATATYPE_Word: Types[i] = 5; break; case SG_DATATYPE_Short: Types[i] = 6; break; case SG_DATATYPE_DWord: Types[i] = 7; break; case SG_DATATYPE_Int: Types[i] = 8; break; case SG_DATATYPE_ULong: Types[i] = 9; break; case SG_DATATYPE_Long: Types[i] = 10; break; case SG_DATATYPE_Float: Types[i] = 11; break; case SG_DATATYPE_Double: Types[i] = 12; break; case SG_DATATYPE_Binary: Types[i] = 13; break; } P.Add_Choice(NULL, "", m_pTable->Get_Field_Name(i), _TL(""), CSG_String::Format(SG_T("%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|"), SG_Data_Type_Get_Name(SG_DATATYPE_String).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Date ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Color ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Byte ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Char ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Word ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Short ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_DWord ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Int ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_ULong ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Long ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Float ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Double).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Binary).c_str() ), Types[i] ); } //----------------------------------------------------- if( DLG_Parameters(&P) ) { bool bChanged = false; for(i=0; i<m_pTable->Get_Field_Count(); i++) { TSG_Data_Type Type; switch( P(i)->asInt() ) { default: case 0: Type = SG_DATATYPE_String; break; case 1: Type = SG_DATATYPE_Date; break; case 2: Type = SG_DATATYPE_Color; break; case 3: Type = SG_DATATYPE_Byte; break; case 4: Type = SG_DATATYPE_Char; break; case 5: Type = SG_DATATYPE_Word; break; case 6: Type = SG_DATATYPE_Short; break; case 7: Type = SG_DATATYPE_DWord; break; case 8: Type = SG_DATATYPE_Int; break; case 9: Type = SG_DATATYPE_ULong; break; case 10: Type = SG_DATATYPE_Long; break; case 11: Type = SG_DATATYPE_Float; break; case 12: Type = SG_DATATYPE_Double; break; case 13: Type = SG_DATATYPE_Binary; break; } if( Type != Types[i] ) { m_pTable->Set_Field_Type(i, Type); bChanged = true; } } if( bChanged ) { Update_Table(); g_pData->Update(m_pTable, NULL); } } }
//--------------------------------------------------------- void CVIEW_Table_Control::On_Field_Add(wxCommandEvent &event) { int i; CSG_String sFields; CSG_Parameters P; //----------------------------------------------------- for(i=0; i<m_pTable->Get_Field_Count(); i++) { sFields.Append(m_pTable->Get_Field_Name(i)); sFields.Append(wxT('|')); } //----------------------------------------------------- P.Set_Name(_TL("Add Field")); P.Add_String( NULL , "NAME" , _TL("Name"), _TL(""), _TL("Field") ); P.Add_Choice( NULL , "TYPE" , _TL("Field Type"), _TL(""), CSG_String::Format(SG_T("%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|"), SG_Data_Type_Get_Name(SG_DATATYPE_String).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Date ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Color ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Byte ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Char ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Word ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Short ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_DWord ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Int ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_ULong ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Long ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Float ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Double).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Binary).c_str() ), 0 ); P.Add_Choice( NULL , "FIELD" , _TL("Insert Position"), _TL(""), sFields, m_pTable->Get_Field_Count() - 1 ); P.Add_Choice( NULL , "INSERT" , _TL("Insert Method"), _TL(""), CSG_String::Format(SG_T("%s|%s|"), _TL("before"), _TL("after") ), 1 ); //----------------------------------------------------- if( DLG_Parameters(&P) ) { int Position; TSG_Data_Type Type; switch( P("TYPE")->asInt() ) { default: case 0: Type = SG_DATATYPE_String; break; case 1: Type = SG_DATATYPE_Date; break; case 2: Type = SG_DATATYPE_Color; break; case 3: Type = SG_DATATYPE_Byte; break; case 4: Type = SG_DATATYPE_Char; break; case 5: Type = SG_DATATYPE_Word; break; case 6: Type = SG_DATATYPE_Short; break; case 7: Type = SG_DATATYPE_DWord; break; case 8: Type = SG_DATATYPE_Int; break; case 9: Type = SG_DATATYPE_ULong; break; case 10: Type = SG_DATATYPE_Long; break; case 11: Type = SG_DATATYPE_Float; break; case 12: Type = SG_DATATYPE_Double; break; case 13: Type = SG_DATATYPE_Binary; break; } Position = P("FIELD")->asInt() + P("INSERT")->asInt(); m_pTable->Add_Field(P("NAME")->asString(), Type, Position); g_pData->Update(m_pTable, NULL); } }
//--------------------------------------------------------- void CActive_Attributes_Control::On_Field_Type(wxCommandEvent &event) { if( !g_pActive->Get_Active_Data_Item() || g_pActive->Get_Active_Data_Item()->Get_Type() != WKSP_ITEM_Grids ) { return; } CSG_Grids *pGrids = ((CWKSP_Grids *)g_pActive->Get_Active_Data_Item())->Get_Grids(); //----------------------------------------------------- int i, *Types = new int[m_pTable->Get_Field_Count()]; CSG_Parameters P; P.Set_Name(_TL("Change Field Type")); for(i=0; i<m_pTable->Get_Field_Count(); i++) { switch( m_pTable->Get_Field_Type(i) ) { default: case SG_DATATYPE_String: Types[i] = 0; break; case SG_DATATYPE_Date : Types[i] = 1; break; case SG_DATATYPE_Color : Types[i] = 2; break; case SG_DATATYPE_Byte : Types[i] = 3; break; case SG_DATATYPE_Char : Types[i] = 4; break; case SG_DATATYPE_Word : Types[i] = 5; break; case SG_DATATYPE_Short : Types[i] = 6; break; case SG_DATATYPE_DWord : Types[i] = 7; break; case SG_DATATYPE_Int : Types[i] = 8; break; case SG_DATATYPE_ULong : Types[i] = 9; break; case SG_DATATYPE_Long : Types[i] = 10; break; case SG_DATATYPE_Float : Types[i] = 11; break; case SG_DATATYPE_Double: Types[i] = 12; break; case SG_DATATYPE_Binary: Types[i] = 13; break; } P.Add_Choice("", SG_Get_String(i), m_pTable->Get_Field_Name(i), _TL(""), CSG_String::Format("%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|%s|", SG_Data_Type_Get_Name(SG_DATATYPE_String).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Date ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Color ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Byte ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Char ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Word ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Short ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_DWord ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Int ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_ULong ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Long ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Float ).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Double).c_str(), SG_Data_Type_Get_Name(SG_DATATYPE_Binary).c_str() ), Types[i] ); } //----------------------------------------------------- if( DLG_Parameters(&P) ) { bool bChanged = false; for(i=0; i<m_pTable->Get_Field_Count(); i++) { TSG_Data_Type Type; switch( P(i)->asInt() ) { default: Type = SG_DATATYPE_String; break; case 1: Type = SG_DATATYPE_Date ; break; case 2: Type = SG_DATATYPE_Color ; break; case 3: Type = SG_DATATYPE_Byte ; break; case 4: Type = SG_DATATYPE_Char ; break; case 5: Type = SG_DATATYPE_Word ; break; case 6: Type = SG_DATATYPE_Short ; break; case 7: Type = SG_DATATYPE_DWord ; break; case 8: Type = SG_DATATYPE_Int ; break; case 9: Type = SG_DATATYPE_ULong ; break; case 10: Type = SG_DATATYPE_Long ; break; case 11: Type = SG_DATATYPE_Float ; break; case 12: Type = SG_DATATYPE_Double; break; case 13: Type = SG_DATATYPE_Binary; break; } if( Type != m_pTable->Get_Field_Type(i) ) { pGrids->Get_Attributes_Ptr()->Set_Field_Type(i, Type); bChanged = true; } } if( bChanged ) { Update_Table(); g_pData->Update(pGrids, NULL); } } }
//--------------------------------------------------------- bool CPointCloud_From_Text_File::On_Execute(void) { CSG_String fileName; int iField, iType; TSG_Data_Type Type; CSG_String Name, Types, s; CSG_PointCloud *pPoints; CSG_Parameters P; CSG_Parameter *pNode; int xField, yField, zField, nAttribs, max_iField; bool bSkipHeader; char fieldSep; std::vector<int> vCol; std::ifstream tabStream; std::string tabLine; double lines; long cntPt, cntInvalid; double x, y, z, value; //----------------------------------------------------- fileName = Parameters("FILE") ->asString(); xField = Parameters("XFIELD") ->asInt() - 1; yField = Parameters("YFIELD") ->asInt() - 1; zField = Parameters("ZFIELD") ->asInt() - 1; nAttribs = Parameters("ATTRIBS") ->asInt(); bSkipHeader = Parameters("SKIP_HEADER") ->asBool(); switch (Parameters("FIELDSEP")->asInt()) { default: case 0: fieldSep = '\t'; break; case 1: fieldSep = ' '; break; case 2: fieldSep = ','; break; } Types.Printf(SG_T("%s|%s|%s|%s|%s|"), _TL("1 byte integer"), _TL("2 byte integer"), _TL("4 byte integer"), _TL("4 byte floating point"), _TL("8 byte floating point") ); P.Set_Name(_TL("Attribute Field Properties")); for(iField=1; iField<=nAttribs; iField++) { s.Printf(SG_T("NODE_%03d") , iField); pNode = P.Add_Node(NULL, s, CSG_String::Format(SG_T("%d. %s"), iField, _TL("Field")), _TL("")); s.Printf(SG_T("FIELD_%03d"), iField); P.Add_String(pNode, s, _TL("Name"), _TL(""), s); s.Printf(SG_T("COLUMN_%03d"), iField); P.Add_Value(pNode, s, _TL("Attribute is Column ..."), _TL(""), PARAMETER_TYPE_Int, iField+3, 1, true); s.Printf(SG_T("TYPE_%03d") , iField); P.Add_Choice(pNode, s, _TL("Type"), _TL(""), Types, 3); } //----------------------------------------------------- if( nAttribs > 0 ) { if( Dlg_Parameters(&P, _TL("Field Properties")) ) { pPoints = SG_Create_PointCloud(); pPoints->Set_Name(SG_File_Get_Name(fileName, false)); Parameters("POINTS")->Set_Value(pPoints); for(iField=0; iField<nAttribs; iField++) { Name = P(CSG_String::Format(SG_T("FIELD_%03d" ), iField + 1).c_str())->asString(); iType = P(CSG_String::Format(SG_T("TYPE_%03d" ), iField + 1).c_str())->asInt(); vCol.push_back(P(CSG_String::Format(SG_T("COLUMN_%03d"), iField + 1).c_str())->asInt() - 1); switch( iType ) { default: case 0: Type = SG_DATATYPE_Char; break; case 1: Type = SG_DATATYPE_Short; break; case 2: Type = SG_DATATYPE_Int; break; case 3: Type = SG_DATATYPE_Float; break; case 4: Type = SG_DATATYPE_Double; break; } pPoints->Add_Field(Name, Type); } } else return( false ); } else { pPoints = SG_Create_PointCloud(); pPoints->Create(); pPoints->Set_Name(SG_File_Get_Name(fileName, false)); Parameters("POINTS")->Set_Value(pPoints); } max_iField = M_GET_MAX(xField, yField); max_iField = M_GET_MAX(max_iField, zField); for( unsigned int i=0; i<vCol.size(); i++ ) { if( max_iField < vCol.at(i) ) max_iField = vCol.at(i); } // open input stream //--------------------------------------------------------- tabStream.open(fileName.b_str(), std::ifstream::in); if( !tabStream ) { SG_UI_Msg_Add_Error(CSG_String::Format(_TL("Unable to open input file!"))); return (false); } tabStream.seekg(0, std::ios::end); // get length of file lines = (double)tabStream.tellg(); tabStream.seekg(0, std::ios::beg); std::getline(tabStream, tabLine); // as a workaround we assume the number of lines from the length of the first line lines = lines / (double)tabStream.tellg(); if( !bSkipHeader ) { tabStream.clear(); // let's forget we may have reached the EOF tabStream.seekg(0, std::ios::beg); // and rewind to the beginning } // import //--------------------------------------------------------- cntPt = cntInvalid = 0; SG_UI_Process_Set_Text(CSG_String::Format(_TL("Importing data ..."))); while( std::getline(tabStream, tabLine) ) { std::istringstream stream(tabLine); std::vector<std::string> tabCols; std::string tabEntry; if( cntPt%10000 == 0 ) SG_UI_Process_Set_Progress((double)cntPt, lines); cntPt++; while( std::getline(stream, tabEntry, fieldSep) ) // read every column in this line and fill vector { if (tabEntry.length() == 0) continue; tabCols.push_back(tabEntry); } if ((int)tabCols.size() < max_iField - 1 ) { SG_UI_Msg_Add(CSG_String::Format(_TL("WARNING: Skipping misformatted line (%.0f)!"), cntPt), true); cntInvalid++; continue; } x = strtod(tabCols[xField].c_str(), NULL); y = strtod(tabCols[yField].c_str(), NULL); z = strtod(tabCols[zField].c_str(), NULL); pPoints->Add_Point(x, y, z); for( int i=0; i<nAttribs; i++ ) { value = strtod(tabCols.at(vCol.at(i)).c_str(), NULL); pPoints->Set_Attribute(i, value); } } // finalize //--------------------------------------------------------- tabStream.close(); CSG_Parameters sParms; DataObject_Get_Parameters(pPoints, sParms); if (sParms("COLORS_ATTRIB") && sParms("COLORS_TYPE") && sParms("METRIC_COLORS") && sParms("METRIC_ZRANGE") && sParms("COLORS_AGGREGATE")) { sParms("COLORS_AGGREGATE")->Set_Value(3); // highest z sParms("COLORS_TYPE")->Set_Value(2); // graduated color sParms("METRIC_COLORS")->asColors()->Set_Count(255); // number of colors sParms("COLORS_ATTRIB")->Set_Value(2); // z attrib sParms("METRIC_ZRANGE")->asRange()->Set_Range(pPoints->Get_Minimum(2),pPoints->Get_Maximum(2)); DataObject_Set_Parameters(pPoints, sParms); DataObject_Update(pPoints); } if (cntInvalid > 0) SG_UI_Msg_Add(CSG_String::Format(_TL("WARNING: Skipped %d invalid points!"), cntInvalid), true); SG_UI_Msg_Add(CSG_String::Format(_TL("%d points sucessfully imported."), (cntPt-cntInvalid)), true); return( true ); }
//--------------------------------------------------------- bool CSG_Direct_Georeferencer::Add_Parameters(CSG_Parameters &Parameters) { CSG_Parameter *pNode; //----------------------------------------------------- pNode = Parameters.Add_Node( NULL , "NODE_POS" , _TL("Position"), _TL("") ); Parameters.Add_Value( pNode , "X" , _TL("X"), _TL(""), PARAMETER_TYPE_Double , 0.0 ); Parameters.Add_Value( pNode , "Y" , _TL("Y"), _TL(""), PARAMETER_TYPE_Double , 0.0 ); Parameters.Add_Value( pNode , "Z" , _TL("Flying Height"), _TL(""), PARAMETER_TYPE_Double , 1000.0 ); //----------------------------------------------------- pNode = Parameters.Add_Node( NULL , "NODE_DIR" , _TL("Orientation"), _TL("") ); Parameters.Add_Choice( pNode , "ORIENTATION" , _TL("Orientation"), _TL(""), CSG_String::Format(SG_T("%s|%s|"), _TL("BLUH"), _TL("PATB") ), 0 ); Parameters.Add_Value( pNode , "OMEGA" , _TL("Omega [degree]"), _TL("rotation around the X axis (roll)"), PARAMETER_TYPE_Double , 0.0 ); Parameters.Add_Value( pNode , "PHI" , _TL("Phi [degree]"), _TL("rotation around the Y axis (pitch)"), PARAMETER_TYPE_Double , 0.0 ); Parameters.Add_Value( pNode , "KAPPA" , _TL("Kappa [degree]"), _TL("rotation around the Z axis (heading)"), PARAMETER_TYPE_Double , 0.0 ); Parameters.Add_Value( pNode , "KAPPA_OFF" , _TL("Kappa Offset [degree]"), _TL("origin adjustment for Z axis (heading)"), PARAMETER_TYPE_Double , 90.0 ); //----------------------------------------------------- pNode = Parameters.Add_Node( NULL , "NODE_CAMERA" , _TL("Camera"), _TL("") ); Parameters.Add_Value( pNode , "CFL" , _TL("Focal Length [mm]"), _TL(""), PARAMETER_TYPE_Double , 80, 0.0, true ); Parameters.Add_Value( pNode , "PXSIZE" , _TL("CCD Physical Pixel Size [micron]"), _TL(""), PARAMETER_TYPE_Double , 5.2, 0.0, true ); //----------------------------------------------------- return( true ); }
//--------------------------------------------------------- bool CPointCloud_From_Text_File::On_Execute(void) { CSG_String fileName; int iField, iType; CSG_String Name, Types, s; CSG_PointCloud *pPoints; CSG_Parameters P; CSG_Parameter *pNode; int xField, yField, zField, nAttribs; bool bSkipHeader; char fieldSep; std::vector<int> vCol; std::ifstream tabStream; std::string tabLine; double lines; long cntPt, cntInvalid; double x, y, z; //----------------------------------------------------- fileName = Parameters("FILE") ->asString(); xField = Parameters("XFIELD") ->asInt() - 1; yField = Parameters("YFIELD") ->asInt() - 1; zField = Parameters("ZFIELD") ->asInt() - 1; bSkipHeader = Parameters("SKIP_HEADER") ->asBool(); switch (Parameters("FIELDSEP")->asInt()) { default: case 0: fieldSep = '\t'; break; case 1: fieldSep = ' '; break; case 2: fieldSep = ','; break; } pPoints = SG_Create_PointCloud(); pPoints->Create(); pPoints->Set_Name(SG_File_Get_Name(fileName, false)); Parameters("POINTS")->Set_Value(pPoints); DataObject_Add(pPoints); //----------------------------------------------------- if (SG_UI_Get_Window_Main()) { nAttribs = Parameters("ATTRIBS") ->asInt(); Types.Printf(SG_T("%s|%s|%s|%s|%s|"), _TL("1 byte integer"), _TL("2 byte integer"), _TL("4 byte integer"), _TL("4 byte floating point"), _TL("8 byte floating point") ); P.Set_Name(_TL("Attribute Field Properties")); for(iField=1; iField<=nAttribs; iField++) { s.Printf(SG_T("NODE_%03d") , iField); pNode = P.Add_Node(NULL, s, CSG_String::Format(SG_T("%d. %s"), iField, _TL("Field")), _TL("")); s.Printf(SG_T("FIELD_%03d"), iField); P.Add_String(pNode, s, _TL("Name"), _TL(""), s); s.Printf(SG_T("COLUMN_%03d"), iField); P.Add_Value(pNode, s, _TL("Attribute is Column ..."), _TL(""), PARAMETER_TYPE_Int, iField+3, 1, true); s.Printf(SG_T("TYPE_%03d") , iField); P.Add_Choice(pNode, s, _TL("Type"), _TL(""), Types, 3); } //----------------------------------------------------- if( nAttribs > 0 ) { if( Dlg_Parameters(&P, _TL("Field Properties")) ) { for(iField=0; iField<nAttribs; iField++) { Name = P(CSG_String::Format(SG_T("FIELD_%03d" ), iField + 1).c_str())->asString(); iType = P(CSG_String::Format(SG_T("TYPE_%03d" ), iField + 1).c_str())->asInt(); vCol.push_back(P(CSG_String::Format(SG_T("COLUMN_%03d"), iField + 1).c_str())->asInt() - 1); pPoints->Add_Field(Name, Get_Data_Type(iType)); } } else return( false ); } } else // CMD { CSG_String sFields, sNames, sTypes; CSG_String token; int iValue; std::vector<int> vTypes; sFields = Parameters("FIELDS")->asString(); sNames = Parameters("FIELDNAMES")->asString(); sTypes = Parameters("FIELDTYPES")->asString(); CSG_String_Tokenizer tkz_fields(sFields, ";", SG_TOKEN_STRTOK); while( tkz_fields.Has_More_Tokens() ) { token = tkz_fields.Get_Next_Token(); if( token.Length() == 0 ) break; if( !token.asInt(iValue) ) { SG_UI_Msg_Add_Error(_TL("Error parsing attribute fields: can't convert to number")); return( false ); } iValue -= 1; if( iValue < 1) { SG_UI_Msg_Add_Error(_TL("Error parsing attribute fields: field index out of range")); return( false ); } else vCol.push_back(iValue); } CSG_String_Tokenizer tkz_datatypes(sTypes, ";", SG_TOKEN_STRTOK); while( tkz_datatypes.Has_More_Tokens() ) { token = tkz_datatypes.Get_Next_Token(); if( token.Length() == 0 ) break; if( !token.asInt(iValue) ) { SG_UI_Msg_Add_Error(_TL("Error parsing field type: can't convert to number")); return( false ); } vTypes.push_back(iValue); } CSG_String_Tokenizer tkz_datanames(sNames, ";", SG_TOKEN_STRTOK); int iter = 0; while( tkz_datanames.Has_More_Tokens() ) { token = tkz_datanames.Get_Next_Token(); if( token.Length() == 0 ) break; pPoints->Add_Field(token, Get_Data_Type(vTypes.at(iter))); iter++; } if( vCol.size() != vTypes.size() || (int)vCol.size() != iter ) { SG_UI_Msg_Add_Error(CSG_String::Format(_TL("Number of arguments for attribute fields (%d), names (%d) and types (%d) do not match!"), vCol.size(), iter, vTypes.size())); return( false ); } } // open input stream //--------------------------------------------------------- tabStream.open(fileName.b_str(), std::ifstream::in); if( !tabStream ) { SG_UI_Msg_Add_Error(CSG_String::Format(_TL("Unable to open input file!"))); return (false); } tabStream.seekg(0, std::ios::end); // get length of file lines = (double)tabStream.tellg(); tabStream.seekg(0, std::ios::beg); std::getline(tabStream, tabLine); // as a workaround we assume the number of lines from the length of the first line lines = lines / (double)tabStream.tellg(); if( !bSkipHeader ) { tabStream.clear(); // let's forget we may have reached the EOF tabStream.seekg(0, std::ios::beg); // and rewind to the beginning } // import //--------------------------------------------------------- cntPt = cntInvalid = 0; SG_UI_Process_Set_Text(CSG_String::Format(_TL("Importing data ..."))); while( std::getline(tabStream, tabLine) ) { std::istringstream stream(tabLine); std::vector<std::string> tabCols; std::string tabEntry; if( cntPt%10000 == 0 ) { SG_UI_Process_Set_Progress((double)cntPt, lines); } cntPt++; while( std::getline(stream, tabEntry, fieldSep) ) // read every column in this line and fill vector { if (tabEntry.length() == 0) continue; tabCols.push_back(tabEntry); } if ((int)tabCols.size() < (vCol.size() + 3) ) { SG_UI_Msg_Add(CSG_String::Format(_TL("WARNING: Skipping misformatted line: %d!"), cntPt), true); cntInvalid++; continue; } //parse line tokens std::vector<double> fieldValues; fieldValues.resize(vCol.size()); x = strtod(tabCols[xField].c_str(), NULL); y = strtod(tabCols[yField].c_str(), NULL); z = strtod(tabCols[zField].c_str(), NULL); for( int i=0; i<(int)vCol.size(); i++ ) { fieldValues[i] = strtod(tabCols.at(vCol.at(i)).c_str(), NULL); } pPoints->Add_Point(x, y, z); for( int i=0; i<(int)vCol.size(); i++ ) { pPoints->Set_Attribute(i, fieldValues[i]); } } // finalize //--------------------------------------------------------- tabStream.close(); CSG_Parameters sParms; DataObject_Get_Parameters(pPoints, sParms); if (sParms("METRIC_ATTRIB") && sParms("COLORS_TYPE") && sParms("METRIC_COLORS") && sParms("METRIC_ZRANGE") && sParms("DISPLAY_VALUE_AGGREGATE")) { sParms("DISPLAY_VALUE_AGGREGATE")->Set_Value(3); // highest z sParms("COLORS_TYPE")->Set_Value(2); // graduated color sParms("METRIC_COLORS")->asColors()->Set_Count(255); // number of colors sParms("METRIC_ATTRIB")->Set_Value(2); // z attrib sParms("METRIC_ZRANGE")->asRange()->Set_Range(pPoints->Get_Minimum(2),pPoints->Get_Maximum(2)); DataObject_Set_Parameters(pPoints, sParms); DataObject_Update(pPoints); } if (cntInvalid > 0) SG_UI_Msg_Add(CSG_String::Format(SG_T("%s: %d %s"), _TL("WARNING"), cntInvalid, _TL("invalid points have been skipped")), true); SG_UI_Msg_Add(CSG_String::Format(SG_T("%d %s"), (cntPt-cntInvalid), _TL("points have been imported with success")), true); return( true ); }
//--------------------------------------------------------- bool CWMS_Import::Get_Map(wxHTTP *pServer, const CSG_String &Directory, CWMS_Capabilities &Cap) { bool bResult = false; int i, n; CSG_Rect r(Cap.m_Extent); CSG_Parameters p; //----------------------------------------------------- // if( Cap.m_MaxWidth > 2 && NX > Cap.m_MaxWidth ) NX = Cap.m_MaxWidth; // if( Cap.m_MaxHeight > 2 && NY > Cap.m_MaxHeight ) NY = Cap.m_MaxHeight; p.Add_Range (NULL , "X_RANGE" , _TL("X Range") , _TL(""), r.Get_XMin(), r.Get_XMax(), r.Get_XMin(), r.Get_XRange() > 0.0, r.Get_XMax(), r.Get_XRange() > 0.0); p.Add_Range (NULL , "Y_RANGE" , _TL("Y Range") , _TL(""), r.Get_YMin(), r.Get_YMax(), r.Get_YMin(), r.Get_YRange() > 0.0, r.Get_YMax(), r.Get_YRange() > 0.0); p.Add_Value (NULL , "CELLSIZE", _TL("Cellsize") , _TL(""), PARAMETER_TYPE_Double, r.Get_XRange() / 2001.0, 0.0, true); p.Add_Choice(NULL , "FORMAT" , _TL("Format") , _TL(""), Cap.m_Formats); p.Add_Choice(NULL , "PROJ" , _TL("Projections"), _TL(""), Cap.m_Projections); CSG_Parameter *pNode = p("FORMAT"); for(i=0; i<pNode->asChoice()->Get_Count(); i++) { CSG_String s(pNode->asChoice()->Get_Item(i)); if( !s.CmpNoCase(SG_T("image/png")) ) pNode->Set_Value(i); } for(i=0; i<Cap.m_Layers_Name.Get_Count(); i++) { p.Add_Value(NULL, Cap.m_Layers_Name[i], Cap.m_Layers_Title[i], "", PARAMETER_TYPE_Bool, false); } //----------------------------------------------------- if( pServer && Dlg_Parameters(&p, _TL("WMS Import")) ) { int NX, NY; double Cellsize; CSG_String Layers, Format; //------------------------------------------------- r.Assign( p("X_RANGE")->asRange()->Get_LoVal(), p("Y_RANGE")->asRange()->Get_LoVal(), p("X_RANGE")->asRange()->Get_HiVal(), p("Y_RANGE")->asRange()->Get_HiVal() ); Cellsize = p("CELLSIZE") ->asDouble(); NX = 1 + (int)(r.Get_XRange() / Cellsize); NY = 1 + (int)(r.Get_YRange() / Cellsize); //------------------------------------------------- Layers.Clear(); for(i=0, n=0; i<Cap.m_Layers_Name.Get_Count(); i++) { if( p(Cap.m_Layers_Name[i])->asBool() ) { if( n++ > 0 ) Layers += ","; Layers += Cap.m_Layers_Name[i]; } } if( n == 0 ) { return( false ); } //------------------------------------------------- wxBitmapType tFormat; Format = p("FORMAT")->asString(); if( Format.Contains(SG_T("image/gif" )) ) tFormat = wxBITMAP_TYPE_GIF ; else if( Format.Contains(SG_T("image/jpeg")) ) tFormat = wxBITMAP_TYPE_JPEG; else if( Format.Contains(SG_T("image/png" )) ) tFormat = wxBITMAP_TYPE_PNG ; else if( Format.Contains(SG_T("image/wbmp")) ) tFormat = wxBITMAP_TYPE_BMP ; else if( Format.Contains(SG_T("image/bmp" )) ) tFormat = wxBITMAP_TYPE_BMP ; else if( Format.Contains(SG_T("image/tiff")) ) tFormat = wxBITMAP_TYPE_TIF ; else if( Format.Contains(SG_T("GIF" )) ) tFormat = wxBITMAP_TYPE_GIF ; else if( Format.Contains(SG_T("JPEG" )) ) tFormat = wxBITMAP_TYPE_JPEG; else if( Format.Contains(SG_T("PNG" )) ) tFormat = wxBITMAP_TYPE_PNG ; else { return( false ); } //------------------------------------------------- CSG_String sRequest(Directory); sRequest += SG_T("?SERVICE=WMS"); sRequest += SG_T("&VERSION=") + Cap.m_Version; sRequest += SG_T("&REQUEST=GetMap"); sRequest += SG_T("&LAYERS=") + Layers; if( Cap.m_Projections.Length() > 0 ) sRequest += CSG_String(S_SRS(Cap.m_Version)) + p("PROJ")->asString(); sRequest += SG_T("&FORMAT=") + Format; sRequest += CSG_String::Format(SG_T("&WIDTH=%d&HEIGHT=%d"), NX, NY); sRequest += CSG_String::Format(SG_T("&BBOX=%f,%f,%f,%f"), r.m_rect.xMin, r.m_rect.yMin, r.m_rect.xMax, r.m_rect.yMax); Message_Add(sRequest, true); //------------------------------------------------- wxInputStream *pStream; if( (pStream = pServer->GetInputStream(sRequest.c_str())) == NULL ) { Message_Add(_TL("could not open GetMap stream")); } else { wxImage Image; if( Image.LoadFile(*pStream, tFormat) == false ) { Message_Add(_TL("could not read image")); CSG_String s = SG_T("\n"); pStream->SeekI(0, wxFromStart); while( !pStream->Eof() ) { s += (char)pStream->GetC(); } Message_Add(s); } else { CSG_Grid *pGrid = SG_Create_Grid(SG_DATATYPE_Int, Image.GetWidth(), Image.GetHeight(), Cellsize, r.m_rect.xMin, r.m_rect.yMin); for(int y=0, yy=pGrid->Get_NY()-1; y<pGrid->Get_NY() && Set_Progress(y, pGrid->Get_NY()); y++, yy--) { for(int x=0; x<pGrid->Get_NX(); x++) { pGrid->Set_Value(x, y, SG_GET_RGB(Image.GetRed(x, yy), Image.GetGreen(x, yy), Image.GetBlue(x, yy))); } } //----------------------------------------- pGrid->Set_Name(Cap.m_Title); Parameters("MAP")->Set_Value(pGrid); DataObject_Set_Colors(pGrid, 100, SG_COLORS_BLACK_WHITE); CSG_Parameters Parms; if( DataObject_Get_Parameters(pGrid, Parms) && Parms("COLORS_TYPE") ) { Parms("COLORS_TYPE")->Set_Value(3); // Color Classification Type: RGB DataObject_Set_Parameters(pGrid, Parms); } bResult = true; } delete(pStream); } } return( bResult ); }
//--------------------------------------------------------- bool CTable_Text_Import_Fixed_Cols::On_Execute(void) { bool bHeader; int i, nChars, iField, nFields, *iFirst, *iLength; CSG_String sLine; CSG_File Stream; CSG_Table *pTable; //----------------------------------------------------- pTable = Parameters("TABLE") ->asTable(); bHeader = Parameters("HEADLINE") ->asBool(); //----------------------------------------------------- if( !Stream.Open(Parameters("FILENAME")->asString(), SG_FILE_R, true) ) { Message_Add(_TL("file could not be opened")); return( false ); } if( !Stream.Read_Line(sLine) || (nChars = (int)sLine.Length()) <= 0 ) { Message_Add(_TL("empty or corrupted file")); return( false ); } //----------------------------------------------------- pTable->Destroy(); pTable->Set_Name(SG_File_Get_Name(Parameters("FILENAME")->asString(), false)); switch( Parameters("FIELDDEF")->asInt() ) { //----------------------------------------------------- case 0: { CSG_Parameters *pBreaks = Get_Parameters("BREAKS"); pBreaks->Del_Parameters(); for(i=0; i<nChars; i++) { pBreaks->Add_Value(NULL, CSG_String::Format(SG_T("%03d"), i), CSG_String::Format(SG_T("%03d %c"), i + 1, sLine[i]), _TL(""), PARAMETER_TYPE_Bool, false ); } if( !Dlg_Parameters("BREAKS") ) { return( false ); } //------------------------------------------------- for(i=0, nFields=1; i<pBreaks->Get_Count(); i++) { if( pBreaks->Get_Parameter(i)->asBool() ) { nFields++; } } //------------------------------------------------- iFirst = new int[nFields]; iLength = new int[nFields]; iFirst[0] = 0; for(i=0, iField=1; i<pBreaks->Get_Count() && iField<nFields; i++) { if( pBreaks->Get_Parameter(i)->asBool() ) { iFirst[iField++] = i + 1; } } //------------------------------------------------- for(iField=0; iField<nFields; iField++) { iLength[iField] = (iField < nFields - 1 ? iFirst[iField + 1] : (int)sLine.Length()) - iFirst[iField]; pTable->Add_Field(bHeader ? sLine.Mid(iFirst[iField], iLength[iField]) : CSG_String::Format(SG_T("FIELD%03d"), iField + 1), SG_DATATYPE_String); } } break; //----------------------------------------------------- case 1: { CSG_Parameters *pFields = Get_Parameters("FIELDS"); pFields->Del_Parameters(); nFields = Parameters("NFIELDS")->asInt(); for(iField=0; iField<nFields; iField++) { CSG_String s = CSG_String::Format(SG_T("%03d"), iField); CSG_Parameter *pNode = pFields->Add_Node(NULL, SG_T("NODE") + s, _TL("Field") + s, _TL("")); pFields->Add_Value (pNode, SG_T("LENGTH") + s, _TL("Length"), _TL(""), PARAMETER_TYPE_Int, 1, 1, true); // pFields->Add_Value (pNode, SG_T("IMPORT") + s, _TL("Import"), _TL(""), PARAMETER_TYPE_Bool, true); pFields->Add_Choice (pNode, SG_T("TYPE") + s, _TL("Type") , _TL(""), CSG_String::Format(SG_T("%s|%s|%s|%s|%s|"), _TL("text"), _TL("2 byte integer"), _TL("4 byte integer"), _TL("4 byte float"), _TL("8 byte float")) ); } if( !Dlg_Parameters("FIELDS") ) { return( false ); } //------------------------------------------------- iFirst = new int[nFields]; iLength = new int[nFields]; iFirst[0] = 0; for(iField=0, i=0; iField<nFields && i<nChars; iField++) { CSG_String s = CSG_String::Format(SG_T("%03d"), iField); iFirst [iField] = i; iLength[iField] = pFields->Get_Parameter(SG_T("LENGTH") + s)->asInt(); i += iLength[iField]; CSG_String Name = bHeader ? sLine.Mid(iFirst[iField], iLength[iField]) : CSG_String::Format(SG_T("FIELD%03d"), iField + 1); switch( pFields->Get_Parameter(SG_T("TYPE") + s)->asInt() ) { default: case 0: pTable->Add_Field(Name, SG_DATATYPE_String); break; case 1: pTable->Add_Field(Name, SG_DATATYPE_Short); break; case 2: pTable->Add_Field(Name, SG_DATATYPE_Int); break; case 3: pTable->Add_Field(Name, SG_DATATYPE_Float); break; case 4: pTable->Add_Field(Name, SG_DATATYPE_Double); break; } } } break; //----------------------------------------------------- case 2: { CSG_Table *pList = Parameters("LIST")->asTable(); nFields = pList->Get_Count(); //------------------------------------------------- iFirst = new int[nFields]; iLength = new int[nFields]; iFirst[0] = 0; for(iField=0, i=0; iField<nFields && i<nChars; iField++) { iFirst [iField] = i; iLength[iField] = pList->Get_Record(iField)->asInt(1); i += iLength[iField]; CSG_String Name = bHeader ? sLine.Mid(iFirst[iField], iLength[iField]) : CSG_String(pList->Get_Record(iField)->asString(0)); switch( pList->Get_Record(iField)->asInt(2) ) { case 0: pTable->Add_Field(Name, SG_DATATYPE_String); break; case 1: pTable->Add_Field(Name, SG_DATATYPE_Short); break; case 2: pTable->Add_Field(Name, SG_DATATYPE_Int); break; case 3: pTable->Add_Field(Name, SG_DATATYPE_Float); break; default: case 4: pTable->Add_Field(Name, SG_DATATYPE_Double); break; } } } break; } //----------------------------------------------------- if( bHeader ) { Stream.Read_Line(sLine); } //----------------------------------------------------- int fLength = Stream.Length(); do { if( sLine.Length() == nChars ) { CSG_Table_Record *pRecord = pTable->Add_Record(); for(iField=0; iField<nFields; iField++) { pRecord->Set_Value(iField, sLine.Mid(iFirst[iField], iLength[iField])); } } } while( Stream.Read_Line(sLine) && Set_Progress(Stream.Tell(), fLength) ); //----------------------------------------------------- delete[](iFirst); delete[](iLength); //----------------------------------------------------- return( true ); }