#include <string.h>
#include <stdlib.h>
#include "shplib.h"
//#include "osapi.h"
namespace MTL
{
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
inline unsigned int SwapData(unsigned int n)
{
return (n >> 24) + ((n >> 8) & 0xFF00) + ((n << 8) & 0xFF0000) + (n << 24);
}
/////////////////////////////////////////////////////////////////////////////
//
// struct define
//
/////////////////////////////////////////////////////////////////////////////
enum
{
MODE_RD = 0,
MODE_WR = 1
};
class CSHPHandle : public SHPHandle
{
public:
CSHPHandle();
~CSHPHandle();
void Adjust();
void SHPWriteHeader();
};
class CSHPObject : public SHPObject
{
public:
CSHPObject(int nBuffSize);
~CSHPObject();
void Adjust(int nLens);
void SetBounds(double *dBoundsMbr, BOOL bInit);
void SetBounds();
};
class CDBFHandle : public DBFHandle
{
public:
CDBFHandle();
~CDBFHandle();
void Adjust();
void DBFCreateHeader();
void DBFUpdateHeader();
BOOL DBFFlushRecord();
BOOL DBFLoadRecord(int nShapeID);
};
/////////////////////////////////////////////////////////////////////////////
//
// struct define end
//
/////////////////////////////////////////////////////////////////////////////
#if _MSC_VER >= 1400
#pragma warning(disable:4996)
#endif
/////////////////////////////////////////////////////////////////////////////
//
// CSHPHandle
//
/////////////////////////////////////////////////////////////////////////////
CSHPHandle::CSHPHandle()
{
fpSHP = NULL;
fpSHX = NULL;
psOff = NULL;
}
CSHPHandle::~CSHPHandle()
{
SHPWriteHeader();
if (fpSHP != NULL)
fclose(fpSHP);
if (fpSHX != NULL)
fclose(fpSHX);
if (psOff != NULL)
free(psOff);
}
void CSHPHandle::Adjust()
{
if (nRecordNum >= nRecordMax)
{
int nLens = (nRecordMax + (nRecordMax >> 2) + 0x400) & (~0x3FF); // 1024 bytes
psOff = (int *)realloc(psOff, nLens * 8);
if (psOff != NULL)
nRecordMax = nLens;
}
}
void CSHPHandle::SHPWriteHeader()
{
if (!bUpdated)
return;
BYTE Buff[100]; // = { 0 };
memset(Buff,0,sizeof(BYTE)*100);
// magic cookie
*(int *)(Buff ) = 0x0A270000;
// file size
*(int *)(Buff + 24) = SwapData(nShapeSize);
// version
*(int *)(Buff + 28) = 1000;
// shape type
*(int *)(Buff + 32) = nShapeType;
// set bounds
memcpy(Buff + 36, dBoundsMbr, 64);
// Write .shp file header.
fseek(fpSHP, 0, SEEK_SET);
if (fwrite(Buff, 100, 1, fpSHP) != 1)
return;
// Prepare, and write .shx file header.
*(int *)(Buff + 24) = SwapData(nRecordNum * 4 + 50);
fseek(fpSHX, 0, SEEK_SET);
if (fwrite(Buff, 100, 1, fpSHX) != 1)
return;
// Write out the .shx contents.
int *Offsets = psOff;
for(int i = nRecordNum * 2; i-- > 0;)
Offsets[i] = SwapData(Offsets[i] >> 1);
fwrite(Offsets, 8, nRecordNum, fpSHX);
}
/////////////////////////////////////////////////////////////////////////////
//
// CSHPHandle end
//
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//
// CSHPObject
//
/////////////////////////////////////////////////////////////////////////////
CSHPObject::CSHPObject(int nBuffSize)
{
pBuff = NULL;
nSize = 0;
Adjust(nBuffSize);
}
CSHPObject::~CSHPObject()
{
if (pBuff != NULL)
free(pBuff);
}
void CSHPObject::Adjust(int nLens)
{
if (nLens > nSize)
{
nLens = (nLens + 0x3FF) & (~0x3FF); // 1024 bytes
pBuff = (BYTE *)realloc(pBuff, nLens);
if (pBuff != NULL)
nSize = nLens;
}
}
void CSHPObject::SetBounds(double *dBoundsMbr, BOOL bInit)
{
// dBoundsMbr[8]; // [0] [1] [2] [3] xmin, ymin, xmax, ymax
// [4] [5] [6] [7] zmin, zmax, mmin, mmax
if (bInit)
{
if (pBounds != NULL)
{
dBoundsMbr[0] = pBounds[0];
dBoundsMbr[1] = pBounds[1];
dBoundsMbr[2] = pBounds[2];
dBoundsMbr[3] = pBounds[3];
}
#ifdef __SUPPORT_COORDZ__
if (pBoundZ != NULL)
{
dBoundsMbr[4] = pBoundZ[0];
dBoundsMbr[5] = pBoundZ[1];
}
if (pBoundM != NULL)
{
dBoundsMbr[6] = pBoundM[0];
dBoundsMbr[7] = pBoundM[1];
}
#endif
}
else
{
if (pBounds != NULL)
{
if (dBoundsMbr[0] > pBounds[0]) dBoundsMbr[0] = pBounds[0];
if (dBoundsMbr[1] > pBounds[1]) dBoundsMbr[1] = pBounds[1];
if (dBoundsMbr[2] < pBounds[2]) dBoundsMbr[2] = pBounds[2];
if (dBoundsMbr[3] < pBounds[3]) dBoundsMbr[3] = pBounds[3];
}
#ifdef __SUPPORT_COORDZ__
if (pBoundZ != NULL)
{
if (dBoundsMbr[4] > pBoundZ[0]) dBoundsMbr[4] = pBoundZ[0];
if (dBoundsMbr[5] < pBoundZ[1]) dBoundsMbr[5] = pBoundZ[1];
}
if (pBoundM != NULL)
{
if (dBoundsMbr[6] > pBoundM[0]) dBoundsMbr[6] = pBoundM[0];
if (dBoundsMbr[7] < pBoundM[1]) dBoundsMbr[7] = pBoundM[1];
}
#endif
}
}
void CSHPObject::SetBounds()
{
// if (pCoords != NULL)
{
pBounds[0] = pCoords[0];
pBounds[1] = pCoords[1];
pBounds[2] = pCoords[0];
pBounds[3] = pCoords[1];
for(int i = nPntsSize; --i > 0;)
{
double *p = pCoords + i * 2;
if (pBounds[0] > p[0]) pBounds[0] = p[0];
if (pBounds[1] > p[1]) pBounds[1] = p[1];
if (pBounds[2] < p[0]) pBounds[2] = p[0];
if (pBounds[3] < p[1]) pBounds[3] = p[1];
}
}
#ifdef __SUPPORT_COORDZ__
if (pCoordZ != NULL)
{
pBoundZ[0] = pCoordZ[0];
pBoundZ[1] = pCoordZ[0];
for(int i = nPntsSize; --i > 0;)
{
if (pBoundZ[0] > pCoordZ[i]) pBoundZ[0] = pCoordZ[i];
if (pBoundZ[1] < pCoordZ[i]) pBoundZ[1] = pCoordZ[i];
}
}
if (pCoordM != NULL)
{
pBoundM[0] = pCoordM[0];
pBoundM[1] = pCoordM[0];
for(int i = nPntsSize; --i > 0;)
{
if (pBoundM[0] > pCoordM[i]) pBoundM[0] = pCoordM[i];
if (pBoundM[1] < pCoordM[i]) pBoundM[1] = pCoordM[i];
}
}
#endif
}
/////////////////////////////////////////////////////////////////////////////
//
// CSHPObject end
//
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//
// CDBFHandle
//
/////////////////////////////////////////////////////////////////////////////
CDBFHandle::CDBFHandle()
{
fpDBF = NULL;
pFieldsInf = NULL;
}
CDBFHandle::~CDBFHandle()
{
DBFFlushRecord();
DBFCreateHeader();
DBFUpdateHeader();
if (fpDBF != NULL)
fclose(fpDBF);
if (pFieldsInf != NULL)
free(pFieldsInf);
}
void CDBFHandle::Adjust()
{
if (nFieldsNum >= nFieldsMax)
{
int nLens = nFieldsMax + 64;
pFieldsInf = (BYTE *)realloc(pFieldsInf, nLens * 32);
if (pFieldsInf != NULL)
nFieldsMax = nLens;
}
}
void CDBFHandle::DBFCreateHeader()
{
if (!bCreated)
return;
int nFieldsLen = nHeaderLen - 33;
pFieldsInf = (BYTE *)realloc(pFieldsInf, nFieldsLen + (nRecordLen * 2) + (nFieldsLen * sizeof(void *) / 32));
if (pFieldsInf == NULL)
return;
pRecordCur = pFieldsInf + nFieldsLen;
pFieldsCur = (char *)(pRecordCur + nRecordLen);
pFieldsOff = (BYTE **)(pFieldsCur + nRecordLen);
BYTE *pTemp = pFieldsInf;
BYTE *pBuff = pRecordCur + 1;
for(int i = 0; i < nFieldsNum; i++)
{
pFieldsOff[i] = pBuff;
pBuff += pTemp[16];
pTemp += 32;
}
fseek(fpDBF, 32, SEEK_SET);
fwrite(pFieldsInf, nFieldsLen, 1, fpDBF);
char c = 0x0D;
fwrite(&c, 1, 1, fpDBF);
bCreated = FALSE;
}
void CDBFHandle::DBFUpdateHeader()
{
if (!bUpdated)
return;
BYTE Buff[32]; // = { 0 };
memset(Buff,0,sizeof(BYTE)*32);
// 2007/10/16, 03 memo field?
*(int *)(Buff ) = 0x100A0703;
*(int *)(Buff + 4) = nRecordNum;
*(WORD *)(Buff + 8) = (WORD)nHeaderLen;
*(WORD *)(Buff + 10) = (WORD)nRecordLen;
fseek(fpDBF, 0, SEEK_SET);
fwrite(Buff, 32, 1, fpDBF);
}
BOOL CDBFHandle::DBFFlushRecord()
{
if (bUpdateCur)
{
bUpdateCur = FALSE;
int nLens = nRecordLen;
int nOffs = nHeaderLen + nLens * nRecordCur;
if (nMode != MODE_WR || fnDBF != nOffs)
{
nMode = MODE_WR;
fnDBF = nOffs;
fseek(fpDBF, nOffs, SEEK_SET);
}
if (fwrite(pRecordCur, nLens, 1, fpDBF) != 1)
return FALSE;
fnDBF += nLens;
}
return TRUE;
}
BOOL CDBFHandle::DBFLoadRecord(int nShapeID)
{
if (nRecordCur != nShapeID)
{
if (!DBFFlushRecord())
return FALSE;
in
shp文件读写,c++写的,xcode工程。有例子数据,可以直接运行。
5星 · 超过95%的资源 需积分: 46 115 浏览量
2017-09-21
14:25:34
上传
评论 3
收藏 466KB ZIP 举报
afhel0
- 粉丝: 1
- 资源: 3
最新资源
- HandTrackingModule.py
- Python基于卷积神经网络的鸟类识别项目源代码,ipynb文件
- 批量将py编译为pyd文件.atbx
- Python项目-学生管理系统
- 图像处理基于matlab图像RGB三色合成分离【含Matlab源码第1发】
- verilog HDL硬件语法设计包括算术运算三人表决器Verilog的阻塞和非阻塞赋值源码例程quartus13.1工程合集
- 【文章话题分类论文】OpenAlex Topic Classification Whitepaper
- linux学习常用命令
- 功率拓扑快速参考指南-ti,TI官方出品
- 开源2023电赛国赛运动目标控制(E题)视觉部分
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈