#include "stdafx.h"
#include "ics_case_func_test.h"
#include "gdal_priv.h"
#include "ogrsf_frmts.h"
#include "ogrsf_frmts/shape/ogrshape.h"
#include "ics_config.h"
#define DYZ_DEBUG_SWITCH "ON"
#define DYZ_TEST_DATA_PATH "D:\\code\\gdal-2.3.0\\data\\"
#define DYZ_TEST_FILE_PATH "D:\\code\\gdal-2.3.0\\x64\\Debug\\"
//#define DYZ_TEST_DWG_FILE DYZ_TEST_FILE_PATH "shuangqumianchilun.shp"
//#define DYZ_TEST_DWG_FILE DYZ_TEST_FILE_PATH "tuku.shp"
#define DYZ_TEST_DWG_FILE DYZ_TEST_FILE_PATH "sanshierting.shp"
int ics_case_main(int argc, char** argv)
{
GDALAllRegister();
CPLSetConfigOption("CPL_DEBUG", DYZ_DEBUG_SWITCH);
CPLSetConfigOption("GDAL_DATA", DYZ_TEST_DATA_PATH);
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
CPLSetConfigOption("SHAPE_ENCODING", "CP936");
const char* FilePath = DYZ_TEST_DWG_FILE;
GDALDatasetH hInDS = GDALOpenEx(DYZ_TEST_DWG_FILE, GDAL_OF_VECTOR | GDAL_OF_VERBOSE_ERROR, nullptr, nullptr, nullptr);
OGRShapeDataSource* cInDS = (OGRShapeDataSource*)(hInDS);
if (NULL == cInDS)
{
return -1;
}
int nLayerCnt = cInDS->GetLayerCount();
int nLayerIdx = 0;
for (;nLayerIdx < nLayerCnt; ++nLayerIdx)
{
std::string strStatement = "select * from ";
std::string shpFileName = FilePath;
size_t startPos = shpFileName.rfind("\\", -1);
size_t endPos = shpFileName.rfind(".shp",-1);
shpFileName = shpFileName.substr(startPos+1, endPos - startPos - 1);
strStatement += shpFileName;
strStatement += " where Text = '111'";
OGRGeometry *poSpatialFilter = NULL;
const char *pszDialect = NULL;
#if 1
OGRLayer* curLayer = cInDS->ExecuteSQL(strStatement.c_str(),poSpatialFilter, pszDialect);
#else
OGRLayer* curLayer = cInDS->GetLayer(nLayerIdx);
#endif
OGRFeature * ftr = NULL;
while (ftr = curLayer->GetNextFeature())
{
GIntBig fid = ftr->GetFID();
if (130 == fid)
{
CPLDebug(__FUNCTION__, " fid:%d", fid);
}
OGRGeometry * poGeom = ftr->GetGeometryRef();
switch (wkbFlatten(poGeom->getGeometryType()))
{
case wkbLineString:
{
OGRLineString* poLS = static_cast<OGRLineString*>(poGeom);
const char* pGeoName = poLS->getGeometryName();
if (NULL != pGeoName)
{
CPLDebug(__FUNCTION__, " Geo name:%s", pGeoName);
}
int iPnum = poLS->getNumPoints();
CPLDebug(__FUNCTION__, " Point Count:%d", iPnum);
double iLen = poLS->get_Length();
CPLDebug(__FUNCTION__, " Len :%d" , iLen);
for (int i = 0; i < iPnum;i++)
{
double dfX = poLS->getX(i);
double dfY = poLS->getY(i);
CPLDebug(__FUNCTION__, " X : %lf,Y : %lf" , dfX , dfY);
}
int fieldCnt = ftr->GetFieldCount();
for (int idx = 0; idx < fieldCnt; ++idx)
{
OGRFieldDefn* field = ftr->GetFieldDefnRef(idx);
const char * fieldName = field->GetNameRef();
if (0 == strncmp(ICS_FIELD_NAME_SUBCLASS, fieldName, strlen(ICS_FIELD_NAME_SUBCLASS)))
{
const char * fieldValue = ftr->GetFieldAsString(fieldName);
if (0 == strncmp(ICS_FIELD_VALUE_SUBCLASS_BLOCK, fieldValue, strlen(ICS_FIELD_VALUE_SUBCLASS_BLOCK)))
{
CPLDebug(__FUNCTION__, ICS_FIELD_VALUE_SUBCLASS_BLOCK);
}
}
}
}
break;
case wkbMultiLineString:
{
OGRMultiLineString* poMLS = static_cast<OGRMultiLineString*>(poGeom);
const char* pGeoName = poMLS->getGeometryName();
if (NULL != pGeoName)
{
CPLDebug(__FUNCTION__, " Geo name:%s", pGeoName);
}
int fieldCnt = ftr->GetFieldCount();
for (int idx = 0; idx < fieldCnt; ++idx)
{
OGRFieldDefn* field = ftr->GetFieldDefnRef(idx);
const char * fieldName = field->GetNameRef();
if (0 == strncmp(ICS_FIELD_NAME_SUBCLASS, fieldName, strlen(ICS_FIELD_NAME_SUBCLASS)))
{
const char * fieldValue = ftr->GetFieldAsString(fieldName);
if (0 == strncmp(ICS_FIELD_VALUE_SUBCLASS_BLOCK, fieldValue, strlen(ICS_FIELD_VALUE_SUBCLASS_BLOCK)))
{
CPLDebug(__FUNCTION__, ICS_FIELD_VALUE_SUBCLASS_BLOCK);
OGRGeometryCollection* block = poMLS->toUpperClass();
int geomNum = block->getNumGeometries();
for (int geomIdx = 0; geomIdx < geomNum; ++geomIdx)
{
OGRGeometry* geom = block->getGeometryRef(geomIdx);
}
}
}
}
}
break;
default:
break;
}
ftr->DumpReadable(NULL);
}
}
GDALClose(hInDS);
}