?? geofeatureclassm.cpp
字號:
// GeoFeatureClassM.cpp: implementation of the CGeoFeatureClassM class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "TestGeoDatabase.h"
#include "GeoFeatureClassM.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGeoFeatureClassM::CGeoFeatureClassM()
: INT_MAX_VALUE(2147473648.0)
{
//pFeatureWorkspace As IFeatureWorkspace, className As String, GeomType As esriGeometryType, pFeatureClass As IFeatureClass, progress As Long
m_bSetZDomain = FALSE;
m_bSetMDomain = FALSE;
m_dZMin = 0.0;
m_dZMax = 0.0;
m_dMMin = 0.0;
m_dMMax = 1000.0;
m_dMinX = 0.0;
m_dMaxX = 1000.0;
m_dMinY = 0.0;
m_dMaxY = 1000.0;
}
CGeoFeatureClassM::~CGeoFeatureClassM()
{
}
BOOL CGeoFeatureClassM::CreateGeoFeatureClass( CString strLayerName,esriFeatureType FeatureType,IFeatureClassPtr &ipFClass)
{
BSTR bstrName=_com_util::ConvertStringToBSTR(strLayerName);
CComBSTR bstrLocalName(bstrName);
if (bstrLocalName == L"")
return E_POINTER;
IUIDPtr pCLSID;
if (0==pCLSID) {
HRESULT result =pCLSID.CreateInstance(CLSID_UID);
if(FALSE(result))
{
AfxMessageBox("無法創建IUID接口,新建圖層失敗。");
return FALSE;
}
this->SetGeometryType(FeatureType,pCLSID);
}
////////////////////////////////////////////////
// establish a fields collection
IFieldPtr pField;
IFieldsPtr pFields;
if (0 == pFields)
{
pFields.CreateInstance(CLSID_Fields);
IFieldsEditPtr ipFieldsEdit(pFields);
// create the geometry field
IGeometryDefPtr ipGeomDef(CLSID_GeometryDef);
IGeometryDefEditPtr ipGeomDefEdit(ipGeomDef);
// assign the geometry defintion properties.
ipGeomDefEdit->put_GeometryType(m_GeometryType);
ipGeomDefEdit->put_GridCount(1);
ipGeomDefEdit->put_GridSize(0, 10);
ipGeomDefEdit->put_AvgNumPoints(2);
ipGeomDefEdit->put_HasM(VARIANT_FALSE);
ipGeomDefEdit->put_HasM(VARIANT_FALSE);
// assign the spatial reference
pField.CreateInstance(CLSID_Field);
IFieldEditPtr ipFieldEdit(pField);
////////////////////////////////////////////////////
ipFieldEdit->put_Name(CComBSTR(L"shape"));
ipFieldEdit->put_AliasName(CComBSTR(L"geometry"));
ipFieldEdit->put_Type(esriFieldTypeGeometry);
// ISpatialReferencePtr ipUnkSpatial(CLSID_UnknownCoordinateSystem);
// ipUnkSpatial->SetFalseOriginAndUnits(0,0,100000);
// ipGeomDefEdit->putref_SpatialReference(ipUnkSpatial);
ipFieldEdit->putref_GeometryDef(ipGeomDef);
ipFieldsEdit->AddField(pField);
//create the object id field
pField.CreateInstance(CLSID_Field);
ipFieldEdit = pField;
ipFieldEdit->put_Name(CComBSTR(L"OBJECTID"));
ipFieldEdit->put_AliasName(CComBSTR(L"object identifier"));
ipFieldEdit->put_Type(esriFieldTypeOID);
ipFieldsEdit->AddField(pField);
///////////////////////////////////////////////
}
this->CheckFields(pFields,pField);
IUIDPtr pCLSEXT;
HRESULT hr;
hr = m_ipFDataset->CreateFeatureClass(bstrName, pFields, m_pCLSID, 0, FeatureType,m_bstrShapeFld, CComBSTR(L""), &ipFClass);
/////////////////////////////////////////
return hr;
}
void CGeoFeatureClassM::SetGeometryType(esriFeatureType FeatureType,IUIDPtr pCLSID)
{
m_pCLSID=pCLSID;
switch (FeatureType)
{
case esriFTSimple:
m_GeometryType=esriGeometryPolygon;
m_pCLSID->put_Value(CComVariant(L"{52353152-891a-11d0-bec6-00805f7c4268}")); // IFeature's GUID
break;
case esriFTSimpleJunction:
m_GeometryType = esriGeometryPolygon;
m_pCLSID->put_Value(CComVariant(L"{cee8d6b8-55fe-11d1-ae55-0000f80372b4}")); // ISimpleJunctionFeature's GUID
break;
case esriFTComplexJunction:
m_pCLSID->put_Value(CComVariant(L"{df9d71f4-da32-11d1-aeba-0000f80372b4}")); // IComplexJunctionFeature's GUID
break;
case esriFTSimpleEdge:
m_GeometryType = esriGeometryPolyline;
m_pCLSID->put_Value(CComVariant(L"{e7031c90-55fe-11d1-ae55-0000f80372b4}")); // ISimpleEdgeFeature's GUID
break;
case esriFTComplexEdge:
m_GeometryType = esriGeometryPolygon;
m_pCLSID->put_Value(CComVariant(L"{A30E8A2A-C50B-11D1-AEA9-0000F80372B4}"));//a30e8a2a-c50b-11d1-aea9-0000f80372b4}")); // IComplexEdgeFeature's GUID
break;
case esriFTAnnotation://注釋注解
m_pCLSID->put_Value(CComVariant(L"{e3676993-c682-11d2-8a2a-006097aff44e}"));//a30e8a2a-c50b-11d1-aea9-0000f80372b4}")); // IComplexEdgeFeature's GUID
break;
return ;
default:
return ;
}
}
void CGeoFeatureClassM::CheckFields(IFieldsEditPtr ipFields,IFieldPtr pField)
{
esriFieldType fieldType;
long lNumFields;
ipFields->get_FieldCount(&lNumFields);
for (int i = 0; i<lNumFields; ++i)
{
ipFields->get_Field(i,&pField);
pField->get_Type(&fieldType);
if (esriFieldTypeGeometry == fieldType)
{
pField->get_Name(&m_bstrShapeFld);
}
}
}
void CGeoFeatureClassM::AddExtendField()
{
}
BOOL CGeoFeatureClassM::CreateSpatialReference(ISpatialReferencePtr &ipSReference)
{
// 范圍與精度的關系:(最大坐標 - 最小坐標)* 精度 = 2147473648
// 其中,2147473648 是整數的最大值
HRESULT result = ipSReference.CreateInstance(CLSID_UnknownCoordinateSystem);
if (FAILED(result))
{
AfxMessageBox("無法創建空間參考接口。");
return FALSE;
}
double dMaxX = m_dMaxX - m_dMinX;
double dMaxY = m_dMaxY - m_dMinY;
double dMax = dMaxX > dMaxY ? dMaxX : dMaxY;
ipSReference->SetDomain(m_dMinX, m_dMaxX, m_dMinY, m_dMaxY);
ipSReference->SetFalseOriginAndUnits(m_dMinX, m_dMinY, INT_MAX_VALUE / dMax);
if (m_bSetZDomain)
{
ipSReference->SetZDomain(m_dZMin, m_dZMax);
ipSReference->SetZFalseOriginAndUnits(m_dZMin, INT_MAX_VALUE / (m_dZMax - m_dZMin));
}
if (m_bSetMDomain)
{
ipSReference->SetMDomain(m_dMMin, m_dMMax);
ipSReference->SetMFalseOriginAndUnits(m_dMMin, INT_MAX_VALUE / (m_dMMax - m_dMMin));
}
return TRUE;
//IGeometryCollection
}
BOOL CGeoFeatureClassM::CreateDataset(CGeoDatabaseM *geo,CString strDatasetName, IFeatureDatasetPtr &ipFDataset)
{
HRESULT hr;
CComPtr<ISpatialReference> ipSRef;
BSTR name=_com_util::ConvertStringToBSTR(strDatasetName);
if (!ipSRef)
{
ipSRef.CoCreateInstance(CLSID_UnknownCoordinateSystem);
ipSRef->SetDomain(0, 21474.83645, 0, 21474.83645);
ipSRef->SetFalseOriginAndUnits(0,0,100000);
ipSRef->SetMDomain(0, 21474.83645);
ipSRef->SetZDomain(0, 21474.83645);
ipSRef->SetZFalseOriginAndUnits(0, 100000);
}
CComPtr<IFeatureWorkspace> ipFeatWksp;
if (FAILED(hr = geo->m_ipWorkspace->QueryInterface(&ipFeatWksp)))
return hr;
hr=ipFeatWksp->CreateFeatureDataset(name, ipSRef, &ipFDataset);
m_ipFDataset=ipFDataset;
return hr;
/*
ISpatialReferencePtr ipSRef;
ipSRef.CreateInstance(CLSID_UnknownCoordinateSystem);
ipSRef->SetDomain( 0, 21474.83645, 0, 21474.83645);
ipSRef->SetFalseOriginAndUnits(0,0,100000);
if (!CreateSpatialReference(ipSRef))
return FALSE;
BSTR name=_com_util::ConvertStringToBSTR(strDatasetName);
IFeatureWorkspacePtr ipFeatWksp =geo->m_ipWorkspace;
HRESULT hr = ipFeatWksp->CreateFeatureDataset(name, ipSRef, &ipFDataset);
if(SUCCEEDED(hr))
m_ipFDataset=ipFDataset;
return (SUCCEEDED(hr) && NULL != ipFDataset); */
}
BOOL CGeoFeatureClassM::CheckParameter(CGeoDatabaseM *geodatabase)
{
ASSERT(NULL !=geodatabase->m_ipWorkspace);
// ASSERT(NULL != m_ipFields);
ASSERT(m_dZMin <= m_dZMax);
ASSERT(m_dMMin <= m_dMMax);
ASSERT(m_dMinX <= m_dMaxX && m_dMinY <= m_dMaxY);
if (NULL == geodatabase->m_ipWorkspace) return FALSE;
//if (NULL == m_ipFields) return FALSE;
if (m_dZMin > m_dZMax) return FALSE;
if (m_dMMin > m_dMMax) return FALSE;
if (m_dMinX > m_dMaxX || m_dMinY > m_dMaxY) return FALSE;
return TRUE;
}
HRESULT CGeoFeatureClassM::OpenFeatureClass(BSTR bstrWorkspace, BSTR bstrFeatureClass, IFeatureClass **ppFeatureClass)
{
// Create the workspace name object
IWorkspaceNamePtr ipShpWorkspaceName(CLSID_WorkspaceName);
ipShpWorkspaceName->put_PathName(bstrWorkspace);
ipShpWorkspaceName->put_WorkspaceFactoryProgID(L"esriDataSourcesFile.shapefileworkspacefactory.1");
// Create the feature class name object
IDatasetNamePtr ipDatasetName(CLSID_FeatureClassName);
ipDatasetName->put_Name(bstrFeatureClass);
ipDatasetName->putref_WorkspaceName(ipShpWorkspaceName);
// Open the feature class
INamePtr ipName(ipDatasetName);
IUnknownPtr ipUnknown;
ipName->Open(&ipUnknown);
IFeatureClassPtr ipFeatureClass(ipUnknown);
*ppFeatureClass = ipFeatureClass;
if (*ppFeatureClass)
(*ppFeatureClass)->AddRef();
else
return E_FAIL;
return S_OK;
}
HRESULT CGeoFeatureClassM::LoadFeatures()
{
// Open shape_file where new features will be written to // For simplicity, sample does not contain code to create a new shapefile
IFeatureClassPtr ipOutFeatureClass;
OpenFeatureClass(CComBSTR(L"d:\\data\\usa"), CComBSTR(L"test"), &ipOutFeatureClass);
if (0 == ipOutFeatureClass)
return E_FAIL;
IFeatureCursorPtr ipInsertFeatureCursor;
ipOutFeatureClass->Insert(VARIANT_TRUE, &ipInsertFeatureCursor);
IFeatureBufferPtr ipInsertFeatureBuffer;
ipOutFeatureClass->CreateFeatureBuffer(&ipInsertFeatureBuffer);
// Open shape_file containing the features that will be copied
IFeatureClassPtr ipInFeatureClass;
OpenFeatureClass(CComBSTR(L"d:\\data\\usa"), CComBSTR(L"counties"), &ipInFeatureClass);
if (0 == ipInFeatureClass)
return E_FAIL;
CComVariant varVariant;
IGeometryPtr ipGeom;
int nNewFeatureCount(0);
// Loop through all the features in InFeatureClass
IFeatureCursorPtr ipSearchFeatureCursor;
ipInFeatureClass->Search(0, VARIANT_TRUE, &ipSearchFeatureCursor);
IFeaturePtr ipFeature;
ipSearchFeatureCursor->NextFeature(&ipFeature);
while (ipFeature)
{
// Add the original feature's geometry to the feature buffer
ipFeature->get_Shape(&ipGeom);
ipInsertFeatureBuffer->putref_Shape(ipGeom);
// Add all the original feature's fields to the feature buffer
// AddFields(ipInsertFeatureBuffer, ipFeature);
// Insert the feature into the cursor
ipInsertFeatureCursor->InsertFeature(ipInsertFeatureBuffer, &varVariant);
nNewFeatureCount += 1;
// Flush the feature cursor every 100 features // This is safer because you can write code to handle a flush error // If you don't flush the feature cursor it will automatically flush but // after all of your code executes at which time you have no control
if (100 == nNewFeatureCount)
{
ipInsertFeatureCursor->Flush();
nNewFeatureCount = 0;
}
ipSearchFeatureCursor->NextFeature(&ipFeature);
}
ipInsertFeatureCursor->Flush(); // Flush the cursor one last time
return S_OK;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -