📄 mapxsampview.cpp
字号:
try {
ds.Add(miDataSetODBC, SourceData, "ODBCNormalAuto");
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
else {
ds.Add(miDataSetODBC, SourceData, COleVariant("ODBCNormalDynamic"), COleVariant("STATE"),
COptionalVariant(), COleVariant("USA"), COptionalVariant(),
COleVariant((long)m_bODBCDynamic));
}
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
void CMapxSampleView::OnOdbcNormalFields()
{
CMapXDatasets ds = m_ctrlMapX.GetDatasets();
short Type;
VARIANT SourceData;
VARIANT Name;
VARIANT GeoField;
VARIANT SecondaryGeoField;
VARIANT BindLayerName;
VARIANT Fields;
CString strName= "ODBCNormalFields";
// will not be used
SecondaryGeoField.vt = VT_ERROR;
SecondaryGeoField.scode = DISP_E_PARAMNOTFOUND;
// we know we want to bind to STATE col
GeoField.vt = VT_BSTR;
GeoField.bstrVal = CString("STATE").AllocSysString();
// and the USA layer
BindLayerName.vt = VT_BSTR;
BindLayerName.bstrVal = CString("USA").AllocSysString();
// limit fields to the geocolumns and 1 attribute cols
CMapXFields fields;
fields.CreateDispatch(fields.GetClsid());
fields.Add("STATE");
fields.Add("ORDER_AMT");
Fields.vt = VT_DISPATCH;
Fields.pdispVal = fields.m_lpDispatch;
// set the name of our dataset
Name.vt = VT_BSTR;
Name.bstrVal = strName.AllocSysString();
CMapXODBCQueryInfo ODBCParam;
try {
// set up source data - no error checking on alloc
Type = miDataSetODBC;
ODBCParam.CreateDispatch("MapX.ODBCQueryInfo.4");
ODBCParam.SetConnectString("ODBC;");
ODBCParam.SetSqlQuery("Select * From US_CUST");
// this assumes you have an Access DataSource called MapStatsV4 pointing
// to the MapStats.mdb that ships with MapX. If the DataSource param is left
// out, the user will be prompted for an ODBC datasource.
ODBCParam.SetDataSource("MapStatsV4");
SourceData.vt = VT_DISPATCH;
SourceData.pdispVal = ODBCParam.m_lpDispatch;
ds.Add(Type, SourceData, Name, GeoField, SecondaryGeoField, BindLayerName, Fields, COleVariant((long)m_bODBCDynamic));
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
void CMapxSampleView::OnOdbcXybind()
{
try {
CMapXODBCQueryInfo ODBCParam;
CMapXBindLayer bindLayer;
CMapXDatasets ds = m_ctrlMapX.GetDatasets();
COleVariant SourceData;
COleVariant BindLayer;
// this assumes you have an Access DataSource called MapStatsV4 pointing
// to the MapStats.mdb that ships with MapX. If the DataSource param is left
// out, the user will be prompted for an ODBC datasource.
ODBCParam.CreateDispatch("MapX.ODBCQueryInfo.4");
ODBCParam.SetConnectString("ODBC;");
ODBCParam.SetSqlQuery("select * From US_CUST");
ODBCParam.SetDataSource("MapStatsV4");
SourceData.vt = VT_DISPATCH;
SourceData.pdispVal = ODBCParam.m_lpDispatch;
// now set up binding
bindLayer.CreateDispatch(bindLayer.GetClsid());
bindLayer.SetLayerName("Customers");
bindLayer.SetRefColumn1("X");
bindLayer.SetRefColumn2("Y");
bindLayer.SetLayerType(miBindLayerTypeXY);
BindLayer.vt = VT_DISPATCH;
BindLayer.pdispVal = bindLayer.m_lpDispatch;
BindLayer.pdispVal->AddRef();
ds.Add(miDataSetODBC, SourceData, COleVariant("ODBCXYBind"), COleVariant("LNAME"),
COptionalVariant(), BindLayer, COptionalVariant(), COptionalVariant());
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
void CMapxSampleView::OnOdbcZipcode()
{
CMapXDatasets ds = m_ctrlMapX.GetDatasets();
short Type;
VARIANT SourceData;
VARIANT Name;
VARIANT GeoField;
VARIANT SecondaryGeoField;
VARIANT BindLayer;
CMapXBindLayer bindLayer;
VARIANT Fields;
CString strName= "ODBCZipDataset";
// will not be used
SecondaryGeoField.vt = VT_ERROR;
SecondaryGeoField.scode = DISP_E_PARAMNOTFOUND;
// use zipcode as unique id in new layer
GeoField.vt = VT_BSTR;
GeoField.bstrVal = CString("ZIP").AllocSysString();
// use all fields with defaults
Fields.vt = VT_ERROR;
Fields.scode = DISP_E_PARAMNOTFOUND;
// set the name of our dataset
Name.vt = VT_BSTR;
Name.bstrVal = strName.AllocSysString();
CMapXODBCQueryInfo ODBCParam;
try {
// set up source data - no error checking on alloc
Type = miDataSetODBC;
ODBCParam.CreateDispatch("MapX.ODBCQueryInfo.4");
ODBCParam.SetConnectString("ODBC;");
ODBCParam.SetSqlQuery("Select * From US_CUST");
// this assumes you have an Access DataSource called MapStatsV4 pointing
// to the MapStats.mdb that ships with MapX. If the DataSource param is left
// out, the user will be prompted for an ODBC datasource.
ODBCParam.SetDataSource("MapStatsV4");
SourceData.vt = VT_DISPATCH;
SourceData.pdispVal = ODBCParam.m_lpDispatch;
// now set up binding
bindLayer.CreateDispatch(bindLayer.GetClsid());
bindLayer.SetReferenceLayer("US 5 Digit Zipcode Centers");
bindLayer.SetLayerName("CustByZip");
bindLayer.SetRefColumn1("ZIP");
bindLayer.SetLayerType(miBindLayerTypePointRef);
BindLayer.vt = VT_DISPATCH;
BindLayer.pdispVal = bindLayer.m_lpDispatch;
ds.Add(Type, SourceData, Name, GeoField, SecondaryGeoField, BindLayer, Fields, COleVariant((long)m_bODBCDynamic));
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
void CMapxSampleView::OnOdbcDynamic()
{
m_bODBCDynamic = !m_bODBCDynamic;
}
void CMapxSampleView::OnUpdateOdbcDynamic(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_bODBCDynamic);
}
void CMapxSampleView::OnUpdateOdbcXybind(CCmdUI* pCmdUI)
{
pCmdUI->Enable(!m_bODBCDynamic);
}
void CMapxSampleView::OnUpdateOdbcZipcode(CCmdUI* pCmdUI)
{
pCmdUI->Enable(!m_bODBCDynamic);
}
void CMapxSampleView::OnMapAddunbounddata()
{
try {
COleVariant vtFieldType ((long)miTypeNumeric);
COleVariant vtFieldAggr ((long)miAggregationSum);
CMapXFields fields;
fields.CreateDispatch (fields.GetClsid());
fields.Add("STATE", "STATE");
fields.Add(COleVariant("POP"), COleVariant("POP"), vtFieldAggr, vtFieldType );
VARIANT vtFields;
vtFields.vt = VT_DISPATCH;
vtFields.pdispVal = fields.m_lpDispatch;
// and, finally, make the request to add the "unbound dataset"
// this will trgiger the request to fetch the data
CMapXDataset dataSet = m_ctrlMapX.GetDatasets().Add(miDataSetUnbound,COptionalVariant(),
COleVariant("UnboundData"), COleVariant(1L), COptionalVariant(), COleVariant("USA"),
vtFields, COptionalVariant());
} // end-of-try
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
void CMapxSampleView::OnViewProjection()
{
try {
VARIANT vHelpFile, vHelpID; // mark as optional since we don't have a helpfile
vHelpFile.vt = VT_ERROR;
vHelpFile.scode = DISP_E_PARAMNOTFOUND;
vHelpID.vt = VT_ERROR;
vHelpID.scode = DISP_E_PARAMNOTFOUND;
CMapXCoordSys csys = m_ctrlMapX.GetDisplayCoordSys();
csys.PickCoordSys(vHelpFile, vHelpID);
m_ctrlMapX.SetNumericCoordSys(csys);
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
void CMapxSampleView::OnDatasestFromLayer()
{
try {
CMapXLayer layer = m_ctrlMapX.GetLayers().Item("USA");
VARIANT vtLayer;
vtLayer.vt = VT_DISPATCH;
vtLayer.pdispVal = layer.m_lpDispatch;
CMapXDataset dataSet = m_ctrlMapX.GetDatasets().Add(miDataSetLayer, vtLayer, "USA Layer");
} // end-of-try
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
void CMapxSampleView::OnMapRemovealldatasets()
{
try {
CMapXDatasets ds = m_ctrlMapX.GetDatasets();
ds.RemoveAll();
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
void CMapxSampleView::OnUpdateMapRemovealldatasets(CCmdUI* pCmdUI)
{
try {
CMapXDatasets ds = m_ctrlMapX.GetDatasets();
pCmdUI->Enable(ds.GetCount() > 0);
}
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
}
#define SA_ROWS 10
#define SA_COLS 2
static char *g_array[SA_ROWS][SA_COLS] =
{
"NY", "10",
"NY", "40",
"MA", "90",
"CA", "15",
"RI", "110",
"OH", "3",
"WY", "55",
"TX", "19",
"NV", "23",
"NV", "34"
};
// you can get your data from anywhere
// this example uses a bunch of hardcoded strings
// to create the variants from.
void CMapxSampleView::OnMapAddsafearraydataset()
{
// construct a safearray of column numbers (could use names instead)
SAFEARRAY FAR* psa=NULL;
SAFEARRAYBOUND rgsabound[2];
long ix[2];
VARIANT vtArray;
VariantInit(&vtArray);
rgsabound[0].lLbound = 1;
rgsabound[0].cElements = SA_ROWS;
rgsabound[1].lLbound = 1;
rgsabound[1].cElements = SA_COLS;
psa = SafeArrayCreate(VT_VARIANT, 2, rgsabound);
if(psa == NULL){
return;
}
for (int r=0; r < SA_ROWS; r++) {
for (int c=0; c < SA_COLS; c++) {
ix[0]=r+1;
ix[1]=c+1;
if (c==0) { // first col is state names
COleVariant vt(g_array[r][c]);
SafeArrayPutElement(psa, ix, &vt);
}
else if (c==1) { // second col we want as numbers
COleVariant vt(atol(g_array[r][c]));
SafeArrayPutElement(psa, ix, &vt);
}
}
}
// put array in field param
vtArray.vt = VT_ARRAY | VT_VARIANT;
vtArray.parray = psa;
try {
CMapXLayer layer = m_ctrlMapX.GetLayers().Item("USA");
CMapXDataset dataSet = m_ctrlMapX.GetDatasets().Add(miDataSetSafeArray, vtArray, "USA Array Dataset");
} // end-of-try
catch (COleDispatchException *e) {
e->ReportError();
e->Delete();
}
catch (COleException *e) {
e->ReportError();
e->Delete();
}
VariantClear(&vtArray); // will free safearray
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -