📄 wycview.cpp
字号:
return;
layer.SetGeoDataset(geoDataset);
// Add a record for each pointgon to the GeoDataset
CMoRecordset recs(layer.GetRecords());
CMoFields fields(recs.GetFields());
CString featureName;
for (int i = 0; i < m_points.GetSize(); i++)
{
recs.AddNew();
// "Shape" = m_point
SetValue(fields, TEXT("Shape"), LPDISPATCH(*m_points[i]));
// "Name" = featureName
featureName.Format("%s%d", "point", i);
SetValue(fields, TEXT("Name"), featureName);
// "Area" = m_point.GetArea()
SetValue(fields, TEXT("Area"), 0.0);
// "Perimeter" = m_point.GetPerimeter()
SetValue(fields, TEXT("Perimeter"), 0.0);
recs.Update();
}
// Add new layer to map
CMoLayers layers(m_map.GetLayers());
layers.Add(layer);
ReleasePoints();
}
void CWycView::SaveLines(CMoDataConnection &conn, CMoTableDesc &tableDesc)
{
// Create a GeoDataset and associate it with a new layer
// The VARIANT is needed now for the HasZ and HasM parameters for the AddGeoDataset
// function which has changed since MapObjects 1.2
VARIANT va;
VariantInit(&va);
va.vt = VT_BOOL;
va.boolVal = false;
CMoGeoDataset geoDataset(conn.AddGeoDataset(GetFileTitle(m_path), moLine, tableDesc, va ,va));
ASSERT(LPDISPATCH(geoDataset));
CMoMapLayer layer;
if (!layer.CreateDispatch(TEXT("MapObjects2.MapLayer")))
return;
layer.SetGeoDataset(geoDataset);
// Add a record for each line to the GeoDataset
CMoRecordset recs(layer.GetRecords());
CMoFields fields(recs.GetFields());
CString featureName;
for (int i = 0; i < m_lines.GetSize(); i++)
{
recs.AddNew();
// "Shape" = m_line
SetValue(fields, TEXT("Shape"), LPDISPATCH(*m_lines[i]));
// "Name" = featureName
featureName.Format("%s%d", "line", i);
SetValue(fields, TEXT("Name"), featureName);
// "Area" = m_point.GetArea()
SetValue(fields, TEXT("Area"), 0.0);
// "Perimeter" = m_point.GetPerimeter()
SetValue(fields, TEXT("Perimeter"), m_lines[i]->GetLength());
recs.Update();
}
// Add new layer to map
CMoLayers layers(m_map.GetLayers());
layers.Add(layer);
ReleaseLines();
}
void CWycView::SaveRectangles(CMoDataConnection &conn, CMoTableDesc &tableDesc)
{
// Create a GeoDataset and associate it with a new layer
// The VARIANT is needed now for the HasZ and HasM parameters for the AddGeoDataset
// function which has changed since MapObjects 1.2
VARIANT va;
VariantInit(&va);
va.vt = VT_BOOL;
va.boolVal = false;
CMoGeoDataset geoDataset(conn.AddGeoDataset(GetFileTitle(m_path), moPolygon, tableDesc, va ,va));
CMoMapLayer layer;
if (!layer.CreateDispatch(TEXT("MapObjects2.MapLayer")))
return;
layer.SetGeoDataset(geoDataset);
// Add a record for each polygon to the GeoDataset
CMoRecordset recs(layer.GetRecords());
CMoFields fields(recs.GetFields());
CString featureName;
// will be writing out the rectangle as a polygon as shape files don't know about Rectangles
// Use Buffer(0,Extent) to create a polygon.
//
// need to set up a Variant for the Extent parameter
CMoRectangle extent(m_map.GetFullExtent());
VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = extent.m_lpDispatch;
for (int i = 0; i < m_rectangles.GetSize(); i++)
{
recs.AddNew();
CMoRectangle rect(*m_rectangles[i]);
CMoPolygon poly(rect.Buffer(0.0,va));
// "Shape" = poly
SetValue(fields, TEXT("Shape"), LPDISPATCH(poly.m_lpDispatch));
// "Name" = featureName
featureName.Format("%s%d", "Rectangle", i);
SetValue(fields, TEXT("Name"), featureName);
// "Area" = poly.GetArea()
SetValue(fields, TEXT("Area"), poly.GetArea());
// "Perimeter" = poly.GetPerimeter()
SetValue(fields, TEXT("Perimeter"), poly.GetPerimeter());
recs.Update();
}
// Add new layer to map
CMoLayers layers(m_map.GetLayers());
layers.Add(layer);
ReleaseRectangles();
}
void CWycView::ReleaseLines()
{
for (int i = 0; i < m_lines.GetSize(); i++)
{
m_lines[i]->ReleaseDispatch();
delete m_lines[i];
}
m_lines.RemoveAll();
}
void CWycView::ReleaseRectangles()
{
for (int i = 0; i < m_rectangles.GetSize(); i++)
{
m_rectangles[i]->ReleaseDispatch();
delete m_rectangles[i];
}
m_rectangles.RemoveAll();
}
void CWycView::OnAddellipse()
{
m_curTool = ID_ADDELLIPSE;
m_map.SetMousePointer(moArrow);
}
void CWycView::OnMapAddpoly()
{
m_curTool = ID_MAP_ADDPOLY;
m_map.SetMousePointer(moArrow);
}
void CWycView::SavePolygons(CMoDataConnection &conn, CMoTableDesc &tableDesc)
{
// Create a GeoDataset and associate it with a new layer
// The VARIANT is needed now for the HasZ and HasM parameters for the AddGeoDataset
// function which has changed since MapObjects 1.2
VARIANT va;
VariantInit(&va);
va.vt = VT_BOOL;
va.boolVal = false;
CMoGeoDataset geoDataset(conn.AddGeoDataset(GetFileTitle(m_path), moPolygon, tableDesc, va ,va));
CMoMapLayer layer;
if (!layer.CreateDispatch(TEXT("MapObjects2.MapLayer")))
return;
layer.SetGeoDataset(geoDataset);
// Add a record for each polygon to the GeoDataset
CMoRecordset recs(layer.GetRecords());
CMoFields fields(recs.GetFields());
CString featureName;
for (int i = 0; i < m_polys.GetSize(); i++)
{
recs.AddNew();
// "Shape" = m_poly
SetValue(fields, TEXT("Shape"), LPDISPATCH(*m_polys[i]));
// "Name" = featureName
featureName.Format("%s%d", "poly", i);
SetValue(fields, TEXT("Name"), featureName);
// "Area" = m_poly.GetArea()
SetValue(fields, TEXT("Area"), m_polys[i]->GetArea());
// "Perimeter" = m_poly.GetPerimeter()
SetValue(fields, TEXT("Perimeter"), m_polys[i]->GetPerimeter());
recs.Update();
}
// Add new layer to map
CMoLayers layers(m_map.GetLayers());
layers.Add(layer);
ReleasePolygons();
}
void CWycView::SaveEllipses(CMoDataConnection &conn, CMoTableDesc &tableDesc)
{
// Create a GeoDataset and associate it with a new layer
// The VARIANT is needed now for the HasZ and HasM parameters for the AddGeoDataset
// function which has changed since MapObjects 1.2
VARIANT va;
VariantInit(&va);
va.vt = VT_BOOL;
va.boolVal = false;
CMoGeoDataset geoDataset(conn.AddGeoDataset(GetFileTitle(m_path), moPolygon, tableDesc, va ,va));
CMoMapLayer layer;
if (!layer.CreateDispatch(TEXT("MapObjects2.MapLayer")))
return;
layer.SetGeoDataset(geoDataset);
// Add a record for each ellipses to the GeoDataset
CMoRecordset recs(layer.GetRecords());
CMoFields fields(recs.GetFields());
CString featureName;
// will be writing out the ellipse as a polygon as shape files don't know about Ellipses
// Use Buffer(0,Extent) to create a polygon.
//
// need to set up a Variant for the Extent parameter
CMoRectangle extent(m_map.GetFullExtent());
VariantInit(&va);
va.vt = VT_DISPATCH;
va.pdispVal = extent.m_lpDispatch;
for (int i = 0; i < m_ellipses.GetSize(); i++)
{
recs.AddNew();
CMoEllipse ellipse(*m_ellipses[i]);
CMoPolygon poly(ellipse.Buffer(0.0,va));
// Shape = poly
SetValue(fields,TEXT("Shape"),LPDISPATCH(poly.m_lpDispatch));
// "Name" = featureName
featureName.Format("%s%d", "ellipse", i);
SetValue(fields, TEXT("Name"), featureName);
// "Area" = poly.GetArea()
SetValue(fields, TEXT("Area"), poly.GetArea());
// "Perimeter" = poly.GetPerimeter()
SetValue(fields, TEXT("Perimeter"), poly.GetPerimeter());
recs.Update();
}
// Add new layer to map
CMoLayers layers(m_map.GetLayers());
layers.Add(layer);
ReleaseEllipses();
}
void CWycView::ReleasePolygons()
{
for (int i = 0; i < m_polys.GetSize(); i++)
{
m_polys[i]->ReleaseDispatch();
delete m_polys[i];
}
m_polys.RemoveAll();
}
void CWycView::ReleaseEllipses()
{
for (int i = 0; i < m_ellipses.GetSize(); i++)
{
m_ellipses[i]->ReleaseDispatch();
delete m_ellipses[i];
}
m_ellipses.RemoveAll();
}
void CWycView::OnFileOpen()
{
CString filter(TEXT("ESRI Shapefiles (*.shp)|*.shp|"));
CFileDialog dlg(TRUE, TEXT(".shp"), 0, OFN_ALLOWMULTISELECT | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, filter);
if (dlg.DoModal() == IDOK)
{
m_path = dlg.GetPathName();
// call the map helper function AddLayer
// should add functionality to allow user to select their own colour
// an renderer
//CDataDir dataDir;
AddLayer(m_map, m_path, moWhite, NULL);
// if there are already map layers then do not reset the map extent
CMoLayers layers = m_map.GetLayers();
if (layers.GetCount() < 2) // the raster image plus this new layer
{
CMoRectangle extent(m_map.GetFullExtent());
extent.ScaleRectangle(.1);
m_map.SetExtent(extent);
}
m_map.Refresh();
}
}
void CWycView::OnFileNew()
{
//Simply clear the current collection of shapes
this->ReleaseLines();
this->ReleasePoints();
this->ReleasePolygons();
this->ReleaseRectangles();
this->ReleaseEllipses();
// remove all layers
CMoLayers layers(m_map.GetLayers());
layers.Clear();
// and add the raster image again
CDataDir dataDir;
AddImageLayer(m_map, dataDir.GetPath() + "\\washington\\wash.bmp");
CMoRectangle extent(m_map.GetFullExtent());
extent.ScaleRectangle(.1);
m_map.SetExtent(extent);
m_curTool = ID_MAP_ADDPOLY;
m_path = "untitled.shp";
m_map.Invalidate(FALSE);
}
void CWycView::OnSelect()
{
m_curTool = ID_SELECT;
}
void CWycView::OnQueryPoint()
{
CLAYER layer;
m_curTool = ID_QUERY_POINT;
layer.m_layer = m_layer;
if(layer.DoModal()==IDOK)
{
m_layer=layer.m_layer;
Invalidate ();
CMoLayers layers(m_map.GetLayers());
selectedMaplayer=layers.Item(COleVariant(TEXT(m_layer)));
if(!selectedMaplayer)
{
MessageBox("您查找的层不存在!");
m_curTool = 0;
}
else
MessageBox("请在地图上点击选择您想查询的目标!");
}
}
void CWycView::OnDeletelayer()
{
CDELETELAYER deletedlg;
deletedlg.DoModal();
m_deletelayer = deletedlg.m_deletelayer;
short SelectedMapLayerIndexforDelete;
switch(m_deletelayer)
{
case 0:
{
SelectedMapLayerIndexforDelete = 0;
CMoLayers m_Layers = m_map.GetLayers();
if(m_Layers.GetCount() < SelectedMapLayerIndexforDelete + 1)
return;
else
m_Layers.Remove(SelectedMapLayerIndexforDelete);
}
break;
case 1:
{
SelectedMapLayerIndexforDelete = 2;
CMoLayers m_Layers = m_map.GetLayers();
if(m_Layers.GetCount() < SelectedMapLayerIndexforDelete + 1)
return;
else
m_Layers.Remove(SelectedMapLayerIndexforDelete);
}
break;
case 2:
{
SelectedMapLayerIndexforDelete = 1;
CMoLayers m_Layers = m_map.GetLayers();
if(m_Layers.GetCount() < SelectedMapLayerIndexforDelete + 1)
return;
else
m_Layers.Remove(SelectedMapLayerIndexforDelete);
}
break;
case 3:
{
CMoLayers m_Layers = m_map.GetLayers();
m_Layers.Clear();
}
break;
}
}
void CWycView::OnResetlayer()
{
CMoLayers m_Layers = m_map.GetLayers();
m_Layers.Clear();
CWycView::OnInitialUpdate();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -