From ab36537ba01e8fd0637ef284c0d8fefd147f06f8 Mon Sep 17 00:00:00 2001 From: Xun Li Date: Fri, 22 Feb 2019 22:13:10 -0700 Subject: [PATCH 01/89] #1810 stack shapefile with csv report warning For stack function, there are two cases: 1. working dataset is table-only, can be stacked with both table-only dataset and dataset with geometry features. 2. working dataset has geometry features, can only be stacked with dataset with geometry features. Also, the geometrical type (e.g. point/polygon/line) should be the same. All other cases should raise warning message and cancel stack operation. #1809 there is "title" in "selection tool" dialog not translated --- DataViewer/MergeTableDlg.cpp | 116 +++++++++++++++-------- DialogTools/ExportDataDlg.cpp | 34 +++---- DialogTools/RangeSelectionDlg.cpp | 4 +- internationalization/lang/zh_CN/GeoDa.mo | Bin 114516 -> 114599 bytes internationalization/pofiles/es.po | 6 ++ internationalization/pofiles/zh_CN.po | 68 +++++++------ rc/GdaAppResources.cpp | 3 +- rc/dialogs.xrc | 1 + 8 files changed, 137 insertions(+), 95 deletions(-) diff --git a/DataViewer/MergeTableDlg.cpp b/DataViewer/MergeTableDlg.cpp index 6799c29fb..48fc2076f 100644 --- a/DataViewer/MergeTableDlg.cpp +++ b/DataViewer/MergeTableDlg.cpp @@ -61,7 +61,8 @@ END_EVENT_TABLE() using namespace std; -MergeTableDlg::MergeTableDlg(wxWindow* parent, Project* _project_s, const wxPoint& pos) +MergeTableDlg::MergeTableDlg(wxWindow* parent, Project* _project_s, + const wxPoint& pos) : merge_datasource_proxy(NULL), project_s(_project_s) { wxLogMessage("Open MergeTableDlg."); @@ -101,20 +102,28 @@ void MergeTableDlg::update(FramesManager* o) void MergeTableDlg::CreateControls() { wxXmlResource::Get()->LoadDialog(this, GetParent(), "ID_MERGE_TABLE_DLG"); - m_input_file_name = wxDynamicCast(FindWindow(XRCID("ID_INPUT_FILE_TEXT")), wxTextCtrl); - m_key_val_rb = wxDynamicCast(FindWindow(XRCID("ID_KEY_VAL_RB")), wxRadioButton); - m_rec_order_rb = wxDynamicCast(FindWindow(XRCID("ID_REC_ORDER_RB")), wxRadioButton); - m_current_key = wxDynamicCast(FindWindow(XRCID("ID_CURRENT_KEY_CHOICE")), wxChoice); - m_import_key = wxDynamicCast(FindWindow(XRCID("ID_IMPORT_KEY_CHOICE")), wxChoice); - m_exclude_list = wxDynamicCast(FindWindow(XRCID("ID_EXCLUDE_LIST")), wxListBox); - m_include_list = wxDynamicCast(FindWindow(XRCID("ID_INCLUDE_LIST")), wxListBox); - m_left_join = wxDynamicCast(FindWindow(XRCID("ID_MERGE_LEFT_JOIN")), wxRadioButton); - m_outer_join = wxDynamicCast(FindWindow(XRCID("ID_MERGE_OUTER_JOIN")), wxRadioButton); - m_overwrite_field = wxDynamicCast(FindWindow(XRCID("ID_MERGE_OVERWRITE_SAME_FIELD")), wxCheckBox); - + m_input_file_name = wxDynamicCast(FindWindow(XRCID("ID_INPUT_FILE_TEXT")), + wxTextCtrl); + m_key_val_rb = wxDynamicCast(FindWindow(XRCID("ID_KEY_VAL_RB")), + wxRadioButton); + m_rec_order_rb = wxDynamicCast(FindWindow(XRCID("ID_REC_ORDER_RB")), + wxRadioButton); + m_current_key = wxDynamicCast(FindWindow(XRCID("ID_CURRENT_KEY_CHOICE")), + wxChoice); + m_import_key = wxDynamicCast(FindWindow(XRCID("ID_IMPORT_KEY_CHOICE")), + wxChoice); + m_exclude_list = wxDynamicCast(FindWindow(XRCID("ID_EXCLUDE_LIST")), + wxListBox); + m_include_list = wxDynamicCast(FindWindow(XRCID("ID_INCLUDE_LIST")), + wxListBox); + m_left_join = wxDynamicCast(FindWindow(XRCID("ID_MERGE_LEFT_JOIN")), + wxRadioButton); + m_outer_join = wxDynamicCast(FindWindow(XRCID("ID_MERGE_OUTER_JOIN")), + wxRadioButton); + m_overwrite_field = wxDynamicCast(FindWindow(XRCID("ID_MERGE_OVERWRITE_SAME_FIELD")), + wxCheckBox); m_left_join->Bind(wxEVT_RADIOBUTTON, &MergeTableDlg::OnLeftJoinClick, this); m_outer_join->Bind(wxEVT_RADIOBUTTON, &MergeTableDlg::OnOuterJoinClick, this); - m_left_join->Disable(); m_outer_join->Disable(); m_key_val_rb->Disable(); @@ -232,7 +241,8 @@ void MergeTableDlg::OnOpenClick( wxCommandEvent& ev ) delete merge_datasource_proxy; merge_datasource_proxy = NULL; } - merge_datasource_proxy = new OGRDatasourceProxy(datasource_name, ds_type, true); + merge_datasource_proxy = new OGRDatasourceProxy(datasource_name, + ds_type, true); merge_layer_proxy = merge_datasource_proxy->GetLayerProxy(layer_name); merge_layer_proxy->ReadData(); m_input_file_name->SetValue(layer_name); @@ -368,7 +378,8 @@ bool MergeTableDlg::CheckKeys(wxString key_name, vector& key_vec, } } - ScrolledDetailMsgDialog *dlg = new ScrolledDetailMsgDialog(_("Warning"), msg, details); + ScrolledDetailMsgDialog *dlg = new ScrolledDetailMsgDialog(_("Warning"), + msg, details); dlg->Show(true); return false; } @@ -423,6 +434,13 @@ void MergeTableDlg::OnMergeClick( wxCommandEvent& ev ) if (m_left_join->GetValue()) { LeftJoinMerge(); } else { + if (!project_s->IsTableOnlyProject() && + merge_layer_proxy->IsTableOnly()) { + wxString msg = _("A Table-only data source can't be stacked with current data source."); + wxMessageDialog dlg(this, msg, _("Error"), wxOK | wxICON_ERROR); + dlg.ShowModal(); + return; + } OuterJoinMerge(); } ev.Skip(); @@ -620,30 +638,37 @@ void MergeTableDlg::OuterJoinMerge() } // start to merge std::vector geoms; - OGRSpatialReference* spatial_ref = project_s->GetSpatialReference(); - Shapefile::ShapeType shape_type = project_s->GetGdaGeometries(geoms); - std::vector in_geoms; - OGRSpatialReference* in_spatial_ref = merge_layer_proxy->GetSpatialReference(); - - // make sure the projection of import dataset is matched with current - OGRCoordinateTransformation *poCT = NULL; - if (spatial_ref !=NULL && in_spatial_ref != NULL) { - if (!spatial_ref->IsSame(in_spatial_ref) ) { - // convert geometry with original projection if needed - poCT = OGRCreateCoordinateTransformation(in_spatial_ref, spatial_ref); - merge_layer_proxy->ApplyProjection(poCT); + OGRSpatialReference* spatial_ref; + Shapefile::ShapeType shape_type; + + if (!project_s->IsTableOnlyProject()) { + // geometric dataset. If table-only dataset, only out join table + // of merged dataset. + spatial_ref = project_s->GetSpatialReference(); + shape_type = project_s->GetGdaGeometries(geoms); + OGRSpatialReference* in_spatial_ref; + in_spatial_ref = merge_layer_proxy->GetSpatialReference(); + + // make sure the projection of import dataset is matched with current + OGRCoordinateTransformation *poCT = NULL; + if (spatial_ref !=NULL && in_spatial_ref != NULL) { + if (!spatial_ref->IsSame(in_spatial_ref) ) { + // convert geometry with original projection if needed + poCT = OGRCreateCoordinateTransformation(in_spatial_ref, + spatial_ref); + merge_layer_proxy->ApplyProjection(poCT); + } + } + // make sure the geometry type is same + Shapefile::ShapeType in_shape_type; + in_shape_type = merge_layer_proxy->GetGdaGeometries(in_geoms); + if (shape_type != in_shape_type) { + error_msg = _("Merge error: Geometric type of selected datasource has to be the same with current datasource."); + throw GdaException(error_msg.mb_str()); } } - // make sure the geometry type is same - Shapefile::ShapeType in_shape_type=merge_layer_proxy->GetGdaGeometries(in_geoms); - if (shape_type != in_shape_type) { - error_msg = _("Merge error: Geometric type of selected datasource has to be the same with current datasource."); - throw GdaException(error_msg.mb_str()); - } - std::vector new_geoms = geoms; - vector new_key_vec = key1_vec; map idx2_dict; int idx2 = key1_vec.size(); @@ -651,7 +676,9 @@ void MergeTableDlg::OuterJoinMerge() wxString tmp = key2_vec[i]; if (key1_map.find(tmp) == key1_map.end()) { new_key_vec.push_back(tmp); - new_geoms.push_back(in_geoms[i]); + if (!project_s->IsTableOnlyProject()) { + new_geoms.push_back(in_geoms[i]); + } idx2_dict[i] = idx2++; } else { idx2_dict[i] = key1_map[tmp]; @@ -715,17 +742,24 @@ void MergeTableDlg::OuterJoinMerge() for (int i=0; iAddOGRColumn(new_fields_dict[new_fields[i]]); } - - ExportDataDlg export_dlg(this, shape_type, new_geoms, spatial_ref, - mem_table); - if (export_dlg.ShowModal() == wxID_OK) { + + ExportDataDlg *export_dlg; + if (!project_s->IsTableOnlyProject()) { + export_dlg = new ExportDataDlg(this, shape_type, new_geoms, + spatial_ref, mem_table); + } else { + export_dlg = new ExportDataDlg(this, mem_table); + } + + if (export_dlg->ShowModal() == wxID_OK) { wxMessageDialog dlg(this, _("File merged into Table successfully."), _("Success"), wxOK); dlg.ShowModal(); } - // no need to free geometry memory here, see ExportDataDlg.cpp line:620 delete mem_table; + delete export_dlg; EndDialog(wxID_OK); + } catch (GdaException& ex) { if (ex.type() == GdaException::NORMAL) return; wxMessageDialog dlg(this, ex.what(), _("Error"), wxOK | wxICON_ERROR); diff --git a/DialogTools/ExportDataDlg.cpp b/DialogTools/ExportDataDlg.cpp index 1703cb00b..bdd7730f8 100644 --- a/DialogTools/ExportDataDlg.cpp +++ b/DialogTools/ExportDataDlg.cpp @@ -96,8 +96,15 @@ ExportDataDlg::ExportDataDlg(wxWindow* parent, Init(parent, pos); } -ExportDataDlg::ExportDataDlg(wxWindow* parent, Shapefile::ShapeType _shape_type, std::vector& _geometries, OGRSpatialReference* _spatial_ref, OGRTable* table, const wxPoint& pos, const wxSize& size) -: is_selected_only(false), project_p(NULL), geometries(_geometries), shape_type(_shape_type), is_saveas_op(true), is_geometry_only(false), table_p(table), is_table_only(false), is_save_centroids(false), spatial_ref(_spatial_ref) +ExportDataDlg::ExportDataDlg(wxWindow* parent, Shapefile::ShapeType _shape_type, + std::vector& _geometries, + OGRSpatialReference* _spatial_ref, + OGRTable* table, const wxPoint& pos, + const wxSize& size) +: is_selected_only(false), project_p(NULL), geometries(_geometries), + shape_type(_shape_type), is_saveas_op(true), is_geometry_only(false), + table_p(table), is_table_only(false), is_save_centroids(false), + spatial_ref(_spatial_ref) { Init(parent, pos); } @@ -287,26 +294,22 @@ void ExportDataDlg::OnOkClick( wxCommandEvent& event ) wxString y_field_name = "COORD_Y"; x_field_name.UpperCase(); y_field_name.UpperCase(); - int col_x = table_p->FindColId(x_field_name); int col_y = table_p->FindColId(y_field_name); - if (col_x == wxNOT_FOUND) - col_x = table_p->InsertCol(GdaConst::double_type, x_field_name); - + col_x = table_p->InsertCol(GdaConst::double_type, + x_field_name); if (col_y == wxNOT_FOUND) - col_y = table_p->InsertCol(GdaConst::double_type, y_field_name); - + col_y = table_p->InsertCol(GdaConst::double_type, + y_field_name); vector x_data; vector y_data; for(size_t i=0; iGetX()); y_data.push_back(((GdaPoint*)(geometries[i]))->GetY()); } - table_p->SetColData(col_x, 0, x_data); table_p->SetColData(col_y, 0, y_data); - } } if (o_ds_table_only && !n_ds_table_only) { @@ -398,9 +401,7 @@ void ExportDataDlg::OnOkClick( wxCommandEvent& event ) } } } catch (GdaException& e) { - if (e.type() == GdaException::NORMAL) - return; - + if (e.type() == GdaException::NORMAL) return; // special clean up for file datasource if ( !tmp_ds_name.empty() ) { if ( wxFileExists(tmp_ds_name) && @@ -416,13 +417,6 @@ void ExportDataDlg::OnOkClick( wxCommandEvent& event ) dlg.ShowModal(); return; } - - //wxString msg = "Export successfully."; - //msg << "\n\nTips: if you want to use exported project/datasource, please" - // << " close current project and then open exported project/datasource."; - //wxMessageDialog dlg(this, msg , _("Info"), wxOK | wxICON_INFORMATION); - //dlg.ShowModal(); - EndDialog(wxID_OK); } diff --git a/DialogTools/RangeSelectionDlg.cpp b/DialogTools/RangeSelectionDlg.cpp index 37168b897..89324f8af 100644 --- a/DialogTools/RangeSelectionDlg.cpp +++ b/DialogTools/RangeSelectionDlg.cpp @@ -696,8 +696,8 @@ void RangeSelectionDlg::CheckRangeButtonSettings() m_field_static_txt->SetLabelText(fn); m_field2_static_txt->SetLabelText(fn); } else { - m_field_static_txt->SetLabelText("choose a variable"); - m_field2_static_txt->SetLabelText("choose a variable"); + m_field_static_txt->SetLabelText(_("choose a variable")); + m_field2_static_txt->SetLabelText(_("choose a variable")); } /** Check that min and max range text is valid. If not valid, set diff --git a/internationalization/lang/zh_CN/GeoDa.mo b/internationalization/lang/zh_CN/GeoDa.mo index 47988a6d4675d07d722e2af687d5d0eb7166fd10..ffcb4ee47eb47a5b2920b11bebb3da575c804f6c 100644 GIT binary patch delta 25901 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