Для импорта в планету воспользуемся форматом SML
Экспорт в SML
1. Экспорт.
Код: Выделить всё
CatCnt = 1;
RowCnt = 1;
_di_IXMLNode Child1;
_di_IXMLNode Child2;
_di_IXMLNode Child3;
_di_IXMLDocument XMLDocument = NewXMLDocument();
XMLDocument->Active = True;
XMLDocument->Encoding = "UTF-8";
_di_IXMLNode RootElement = XMLDocument->AddChild(L"DATAPACKET");
RootElement->SetAttribute(L"Version", L"2.0");
Child1 = RootElement->AddChild(L"METADATA");
Child2 = Child1->AddChild(L"FIELDS");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"id");
Child3->SetAttribute(L"fieldtype", L"i4");
Child3->SetAttribute(L"readonly", L"true");
Child3->SetAttribute(L"SUBTYPE", L"Autoinc");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"name");
Child3->SetAttribute(L"fieldtype", L"string");
Child3->SetAttribute(L"WIDTH", L"255");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"descr");
Child3->SetAttribute(L"fieldtype", L"bin.hex");
Child3->SetAttribute(L"SUBTYPE", L"Text");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"scale1");
Child3->SetAttribute(L"fieldtype", L"i4");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"scale2");
Child3->SetAttribute(L"fieldtype", L"i4");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"lonlatarr");
Child3->SetAttribute(L"fieldtype", L"bin.hex");
Child3->SetAttribute(L"SUBTYPE", L"Binary");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"lonL");
Child3->SetAttribute(L"fieldtype", L"r8");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"latT");
Child3->SetAttribute(L"fieldtype", L"r8");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"lonR");
Child3->SetAttribute(L"fieldtype", L"r8");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"latB");
Child3->SetAttribute(L"fieldtype", L"r8");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"color1");
Child3->SetAttribute(L"fieldtype", L"i4");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"color2");
Child3->SetAttribute(L"fieldtype", L"i4");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"visible");
Child3->SetAttribute(L"fieldtype", L"boolean");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"picname");
Child3->SetAttribute(L"fieldtype", L"string");
Child3->SetAttribute(L"WIDTH", L"255");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"categoryid");
Child3->SetAttribute(L"fieldtype", L"i4");
Child2 = Child1->AddChild(L"PARAMS");
Child2->SetAttribute(L"AUTOINCVALUE", L"1");
RootElement = RootElement->AddChild(L"ROWDATA");
_di_IXMLDocument XML2Document = NewXMLDocument();
XML2Document->Active = True;
XML2Document->Encoding = "UTF-8";
_di_IXMLNode Root2Element = XML2Document->AddChild(L"DATAPACKET");
Root2Element->SetAttribute(L"Version", L"2.0");
Child1 = Root2Element->AddChild(L"METADATA");
Child2 = Child1->AddChild(L"FIELDS");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"id");
Child3->SetAttribute(L"fieldtype", L"i4");
Child3->SetAttribute(L"readonly", L"true");
Child3->SetAttribute(L"SUBTYPE", L"Autoinc");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"name");
Child3->SetAttribute(L"fieldtype", L"string");
Child3->SetAttribute(L"WIDTH", L"255");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"visible");
Child3->SetAttribute(L"fieldtype", L"boolean");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"AfterScale");
Child3->SetAttribute(L"fieldtype", L"i2");
Child3 = Child2->AddChild(L"FIELD");
Child3->SetAttribute(L"attrname", L"BeforeScale");
Child3->SetAttribute(L"fieldtype", L"i2");
Child2 = Child1->AddChild(L"PARAMS");
Child2->SetAttribute(L"AUTOINCVALUE", L"1");
Root2Element = Root2Element->AddChild(L"ROWDATA");
AddSMLNode(RootElement, Root2Element, (TBoundaryTreeNode*)TV->Items->Item[0], "", 0);
XMLDocument->SaveToFile(Edit1->Text +"Output.SML");
XMLDocument = NULL;
XML2Document->SaveToFile(Edit1->Text +"CategoryOutput.SML");
XML2Document = NULL;
Beep();
2. Процедуры
Код: Выделить всё
//---------------------------------------------------------------------------
void __fastcall TForm1::GenerateNames(TBoundaryTreeNode* Node)
{
UnicodeString Name = Node->Text;
switch(Node->AdminLevel)
{
}
FolderName = Name;
PlacemarkName = Name;
PlacemarkDescription = "";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::AddSMLNode(_di_IXMLNode ParentXML, _di_IXMLNode CatXML, TBoundaryTreeNode* Node,
UnicodeString ParentFolder, int ParentFolderNum)
{
int i; //int i,j,k,l;
TBoundaryTreeNode* ChildNode;
UnicodeString FullFolderName;
int FolderNum;
GenerateNames(Node);
if(Node->Count > 0)
{
if(ParentFolder != "") FullFolderName = ParentFolder + "\\" + FolderName;
else FullFolderName = FolderName;
FolderNum = AddSMLFolder(CatXML, FullFolderName);
}
else
{
FullFolderName = ParentFolder;
FolderNum = ParentFolderNum;
}
if(Node->PolyIndex.get_length() > 0) AddSMLPlacemark(ParentXML, Node, FolderNum);
ProgressBar1->Position--;
if(Node->Count > 0)
{
for(i = 0; i < Node->Count; i++)
{
ChildNode = (TBoundaryTreeNode*)Node->Item[i];
AddSMLNode(ParentXML, CatXML, ChildNode, FullFolderName, FolderNum);
}
}
}
//---------------------------------------------------------------------------
int __fastcall TForm1::AddSMLFolder(_di_IXMLNode ParentXML, UnicodeString FolderN)
{
int Num = CatCnt;
CatCnt++;
_di_IXMLNode Folder = ParentXML->AddChild(L"ROW");
Folder->SetAttribute(L"id", IntToStr(Num));
Folder->SetAttribute(L"name", FolderN);
Folder->SetAttribute(L"visible", L"TRUE");
Folder->SetAttribute(L"AfterScale", L"3");
Folder->SetAttribute(L"BeforeScale", L"23");
return Num;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::AddSMLPlacemark(_di_IXMLNode ParentXML, TBoundaryTreeNode* Node, int CatID)
{
int Num = RowCnt;
Extended L = NaN;
Extended R = NaN;
Extended T = NaN;
Extended B = NaN;
RowCnt++;
_di_IXMLNode Placemark = ParentXML->AddChild(L"ROW");
Placemark->SetAttribute(L"id", IntToStr(Num));
Placemark->SetAttribute(L"name", PlacemarkName);
Placemark->SetAttribute(L"descr", PlacemarkDescription);
Placemark->SetAttribute(L"scale1", L"2");
Placemark->SetAttribute(L"scale2", L"0");
Placemark->SetAttribute(L"scale1", L"2");
Placemark->SetAttribute(L"scale2", L"0");
Placemark->SetAttribute(L"color1", L"-65536");
Placemark->SetAttribute(L"color2", L"16777215");
Placemark->SetAttribute(L"visible", L"TRUE");
Placemark->SetAttribute(L"picname", L"");
Placemark->SetAttribute(L"categoryid", IntToStr(CatID));
int i,j,k;
int LineIndex, PolyCnt, LineCnt, PointCnt;
ExPoint P;
TIdEncoderMIME* MIMEEncoder = new TIdEncoderMIME(NULL);
TMemoryStream* Stream = new TMemoryStream;
PolyCnt = Node->PolyIndex.get_length();
LineCnt = Node->ContourIndex.get_length();
PointCnt = Node->XCoord.get_length();
LineIndex = 0;
for(i = 0; i < PolyCnt; i++)
{
if(i > 0)
{
P.X = NaN;
P.Y = NaN;
P.R = 0;
Stream->Write(&P, sizeof(P));
}
for(j = 0; j < Node->PolyIndex[i]; j++)
{
if(LineIndex + j >= LineCnt)
{
break;
}
if(j > 0)
{
P.X = NaN;
P.Y = -1;
P.R = 0;
Stream->Write(&P, sizeof(P));
}
for(k = 0; k < Node->ContourLength[LineIndex + j]; k++)
{
if(Node->ContourIndex[LineIndex + j] + k >= PointCnt)
{
break;
}
P.X = Node->XCoord[Node->ContourIndex[LineIndex + j] + k];
P.Y = Node->YCoord[Node->ContourIndex[LineIndex + j] + k];
P.R = 0;
if(IsNan(L)) L = P.X;
else if(L > P.X) L = P.X;
if(IsNan(R)) R = P.X;
else if(R < P.X) R = P.X;
if(IsNan(T)) T = P.Y;
else if(T < P.Y) T = P.Y;
if(IsNan(B)) B = P.Y;
else if(B > P.Y) B = P.Y;
Stream->Write(&P, sizeof(P));
}
}
LineIndex += Node->PolyIndex[i];
}
Stream->Position = 0;
UnicodeString Str = MIMEEncoder->EncodeStream(Stream);
delete Stream;
delete MIMEEncoder;
Placemark->SetAttribute(L"lonlatarr", Str);
Placemark->SetAttribute(L"lonL", FloatToStrF(L, ffFixed, 10, 7));
Placemark->SetAttribute(L"latT", FloatToStrF(T, ffFixed, 10, 7));
Placemark->SetAttribute(L"lonR", FloatToStrF(R, ffFixed, 10, 7));
Placemark->SetAttribute(L"latB", FloatToStrF(B, ffFixed, 10, 7));
}