101 return m_SwapEndian(m_value);
110 m_value = m_SwapEndian(l);
240 return _T(
"Null Shape");
350 return m_shapeHead.
bb;
360 m_shapeRecords.RemoveAll();
361 return _super::AllDeleteRecord();
373 INDEX r1 = _super::AddRecord();
388 bool r1 = _super::InsertRecord(record);
402 bool r1 = _super::DeleteRecord(record);
403 bool r2 = m_shapeRecords.Remove(record);
417 return m_shapeRecords.Set(record, P);
428 return m_shapeRecords.Get(record);
440 bool LoadFile(LPCTSTR lpszBaseFileName,
bool withTypeCheck =
true)
446 m_MakeFileName(mainFn, indexFn, attrFn, lpszBaseFileName);
450 if ( mainRf.
Open(mainFn) && indexRf.
Open(indexFn) )
459 _super::AllDeleteRecord();
466 bool r = _super::LoadFile(attrFn);
472 TRACE2(
" メインファイルのタイプ[%d]と現在のタイプ[%d]が一致していません!\n",
GetHeadShapeType(), oldType);
474 _super::AllDeleteRecord();
477 else if ( _super::GetRecordCount() != m_shapeRecords.GetSize() )
479 TRACE0(
" メインファイルと属性ファイルのレコードの数が一致していません!\n" );
480 _super::AllDeleteRecord();
503 m_MakeFileName(mainFn, indexFn, attrFn, lpszBaseFileName);
506 if ( mainWf.
New(mainFn) && indexWf.
New(indexFn) )
510 m_SaveMain(mainWf, indexWf);
521 bool r = _super::SaveFile(attrFn);
547 TRACE0(
"-- ShapeFile情報 --\n");
548 TRACE1(
"ShapeType %d\n", m_shapeHead.
shapeType);
549 TRACE2(
"BoundingBox X min %g, max %g\n", m_shapeHead.
bb.
xMin, m_shapeHead.
bb.
xMax);
550 TRACE2(
"BoundingBox Y min %g, max %g\n", m_shapeHead.
bb.
yMin, m_shapeHead.
bb.
yMax);
551 TRACE2(
"BoundingBox Z min %g, max %g\n", m_shapeHead.
bb.
zMin, m_shapeHead.
bb.
zMax);
552 TRACE2(
"BoundingBox M min %g, max %g\n", m_shapeHead.
bb.
mMin, m_shapeHead.
bb.
mMax);
553 loop ( i, m_shapeRecords.GetSize() )
555 CStr s = m_shapeRecords[i]->ToString();
556 TRACE2(
"record.%d, %s\n", i + 1, s);
565 void m_MakeFileName(
CStr& _mainFn,
CStr& _indexFn,
CStr& _attrFn, LPCTSTR lpszBase)
const
567 CStr base = lpszBase;
570 _mainFn = base + _T(
"shp");
571 _indexFn = base + _T(
"shx");
572 _attrFn = base + _T(
"dbf");
584 THead hd = m_shapeHead;
585 _mainWt.
Write(
sizeof(hd), &hd);
586 _indexWt.
Write(
sizeof(hd), &hd);
588 loop ( i, m_shapeRecords.GetSize() )
591 Integer type = m_shapeRecords[i]->GetShapeType();
592 CBeInteger len = down_cast<CShapeFile::Integer>(
sizeof(
Integer) + m_shapeRecords[i]->Write(dmyWt)) /
sizeof(WORD);
594 CBeInteger ofs =
static_cast<long>(_mainWt.
GetSize() /
sizeof(WORD));
595 _indexWt.
Write(
sizeof(ofs), &ofs);
596 _indexWt.
Write(
sizeof(len), &len);
598 CBeInteger no = down_cast<CShapeFile::Integer>(i + 1);
599 _mainWt.
Write(
sizeof(no), &no);
600 _mainWt.
Write(
sizeof(len), &len);
601 _mainWt.
Write(
sizeof(type), &type);
602 m_shapeRecords[i]->Write(_mainWt);
605 hd.fileLength =
static_cast<long>(_mainWt.
GetSize() /
sizeof(WORD));
607 _mainWt.
Write(
sizeof(hd), &hd);
608 hd.fileLength =
static_cast<long>(_indexWt.
GetSize() /
sizeof(WORD));
610 _indexWt.
Write(
sizeof(hd), &hd);
616 void m_LoadMain(
const IReader& r)
620 r.
Read(
sizeof(THead), &hd);
621 if ( hd.fileCode != 9994 || hd.version != 1000 )
628 r.
Read(
sizeof(no), &no);
630 r.
Read(
sizeof(len), &len);
632 r.
Read(
sizeof(type), &type);
633 TRACE3(
"RecNo.%d, Len = %d, Type = %d\n",
long(no),
long(len), type);
634 size_t sz = len * 2 -
sizeof(type);
636 IRecordContent* P =
LoadType(type, r, sz);
641 else if ( type == 0 )
643 CNullShapeRecordContent rc;
645 records.
Add(
new CNullShapeRecordContent(rc));
650 CUnknownRecordContent rc(type);
652 records.
Add(
new CUnknownRecordContent(rc));
655 m_shapeRecords = records;
659 C_ASSERT (
sizeof(
Integer) == 4 );
660 C_ASSERT (
sizeof(
Double) == 8 );
661 C_ASSERT (
sizeof(CBeInteger) == 4 );
662 C_ASSERT (
sizeof(THead) == 100 );
667 friend class CShapeFileTest;
738 _w.
Write(
sizeof(m_x), &m_x);
739 _w.
Write(
sizeof(m_y), &m_y);
740 return sizeof(
Double) * 2;
750 if ( size <
sizeof(m_x) * 2 )
763 return CStr::Fmt(_T(
"Point x = %g, y = %g"), m_x, m_y);
#define loop(VAR, CNT)
loop構文.
bool Open(LPCTSTR lpszName, bool boIsShare=true, bool boDummy=false)
[操作] オープン
bool New(LPCTSTR lpszName, bool boIsShare=true)
[操作] 新規オープン.
INDEX Add(TYP *P)
[追加] 要素一つ追加
Double GetY(void) const
[取得] Y取得.
Double GetX(void) const
[取得] X取得.
virtual CStr ToString(void) const
[取得] 文字列取得.
virtual void Read(const IReader &r, size_t size)
[読込] 読込み 解析しデータを保持します。
virtual Integer GetShapeType(void) const
[取得] シェープタイプ取得.
CPointRecordContent(Double x=0, Double y=0)
コンストラクタ.
void Set(Double x, Double y)
[設定] X,Y 設定.
virtual size_t Write(IWriter &_w) const
[書出] 書出し 保持しているデータを書き出し(シェープタイプは対象外)。
シェープファイル type Point 管理クラス
CShapeFileTypePoint(void)
コンストラクタ
virtual CShapeFile::IRecordContent * LoadType(Integer type, const IReader &r, size_t sz)
[通知] タイプ別読込み処理
bool SetPointShapeRecord(INDEX record, Double x, Double y)
[設定] ポイントシェープコンテンツ設定.
const CPointRecordContent * GetPointShapeRecord(INDEX record) const
[取得] シェープコンテンツ取得.
Integer operator=(Integer l)
[設定] 値設定
CBeInteger(Integer l=0)
コンストラクタ.
virtual CStr ToString(void) const
[取得] 文字列取得.
virtual void Read(const IReader &r, size_t size)
[読込] 読込み 解析しデータを保持します。
virtual Integer GetShapeType(void) const
[取得] シェープタイプ取得.
virtual size_t Write(IWriter &_w) const
[書出] 書出し 保持しているデータを書き出し(シェープタイプは対象外)。
virtual CStr ToString(void) const
[取得] 文字列取得.
virtual void Read(const IReader &r, size_t size)
[読込] 読込み 解析しデータを保持します。
virtual Integer GetShapeType(void) const
[取得] シェープタイプ取得.
CUnknownRecordContent(Integer st)
コンストラクタ
CByteVector & Refer(void)
[参照] データ
virtual size_t Write(IWriter &_w) const
[書出] 書出し 保持しているデータを書き出し(シェープタイプは対象外)。
double Double
符号付き64bitIEEE浮動小数点(8bytes)
bool DeleteRecord(INDEX record)
[削除] レコード削除.
bool SetShapeRecord(INDEX record, IRecordContent *P)
[設定] シェープコンテンツ設定.
bool AllDeleteRecord(void)
[削除] レコード全削除.
void SetBoundingBox(const TBoundingBox &bb)
[設定] バウンディングボックス設定.
virtual CShapeFile::IRecordContent * LoadType(Integer type, const IReader &r, size_t sz)
[通知] タイプ別読込み処理
long Integer
符号付き32bit整数(4bytes)
bool InsertRecord(INDEX record)
[挿入] レコード挿入.
const IRecordContent * GetShapeRecord(INDEX record) const
[取得] シェープコンテンツ取得.
const TBoundingBox & GetBoundingBox(void) const
[取得] バウンディングボックス取得.
void SetHeadShapeType(Integer type)
[設定] ヘッダシェープタイプ設定.
bool LoadFile(LPCTSTR lpszBaseFileName, bool withTypeCheck=true)
[読込] ファイル読込み 保持している情報を破棄し、ファイルから読込みます。
Integer GetHeadShapeType(void) const
[取得] ヘッダシェープタイプ取得.
INDEX AddRecord(void)
[追加] レコード追加.
bool SaveFile(LPCTSTR lpszBaseFileName) const
[作成] ファイル作成.
static CStrT Fmt(const TCHAR *lpszFormat,...)
[作成] 書式付き文字列作成
CStrT & TrimRight(TYP t=' ')
[処理] 末尾から文字をトリム.
void OnCatch(void) const
[表示] 内容表示
virtual size_t GetSize(void) const
[取得] サイズ取得
void Zero(V &value)
[設定] ゼロクリア.
WORD SwapEndian(WORD val)
[変換] エンディアン変換.
virtual size_t Write(IWriter &_w) const =0
[書出] 書出し 保持しているデータを書き出し(シェープタイプは対象外)。
virtual void Read(const IReader &r, size_t size)=0
[読込] 読込み 解析しデータを保持します。
virtual CStr ToString(void) const =0
[取得] 文字列取得.
virtual Integer GetShapeType(void) const =0
[取得] シェープタイプ取得.
virtual ~IRecordContent(void)
デストラクタ
TBoundingBox(void)
コンストラクタ
Double mMax
Bounding Box M 最大
Double mMin
Bounding Box M 最小
Double zMax
Bounding Box Z 最大
Double xMax
Bounding Box X 最大
Double yMin
Bounding Box Y 最小
Double zMin
Bounding Box Z 最小
Double xMin
Bounding Box X 最小
Double yMax
Bounding Box Y 最大
TBoundingBox bb
バウンディングボックス
CBeInteger fileLength
ファイル長(単位 word)
CBeInteger fileCode
ファイルコード
LONGLONG GetLeftoverSize(void) const
[取得] 残りサイズ取得.
virtual LONGLONG Seek(LONGLONG llOffset, ESeekMode eSeek=TOP) const =0
[操作] シーク.
virtual size_t Read(size_t size, LPVOID _P) const =0
[取得] 読み込み
void ReadExactly(size_t size, LPVOID _P) const
[取得] 読み込み.
virtual LONGLONG GetSize(void) const =0
[取得] サイズ取得
void WriteFrom(const IConstCollectionT< BYTE > &c)
[保存] 書き込み.
virtual void Write(size_t size, LPCVOID P)=0
[保存] 書き込み