⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ezownimport.pas

📁 很管用的GIS控件
💻 PAS
字号:
Unit EzOwnImport;

{***********************************************************}
{     EzGIS/CAD Components                                  }
{   (c) 2003 EzSoft Engineering                             }
{         All Rights Reserved                               }
{***********************************************************}

{$I EZ_FLAG.PAS}
Interface

Uses
  Controls, SysUtils, Classes, Windows, Dialogs, Db,
  EzLib, EzBase, EzBaseGIS, EzProjections, EzImportBase, EzCADCtrls;

Type

  { TEzOwnImport - Projector is used for the original .ezd file }
  TEzOwnImport = Class( TEzBaseImport )
  Private
    FTempCAD: TEzCAD;
    { for showing progress messages }
    nEntities: Integer;
    MyEntNo: Integer;
  Public
    Constructor Create( AOwner: TComponent ); Override;
    Destructor Destroy; Override;
    Procedure ImportInitialize; Override;
    Procedure GetSourceFieldList( FieldList: TStrings ); Override;
    Procedure ImportFirst; Override;
    Procedure AddSourceFieldData(DestLayer: TEzBaseLayer; DestRecno: Integer); Override;
    Function GetSourceExtension: TEzRect; Override;
    Function ImportEof: Boolean; Override;
    Function GetNextEntity(var progress,entno: Integer): TEzEntity; Override;
    Procedure ImportNext; Override;
    //Procedure ImportEnd; Override;  not needed here
  End;

  { TEzOwnExport - Projector is used for exporting to that projection }
  TEzOwnExport = Class( TEzBaseExport )
  Private
    FTempCAD: TEzCAD;
  Public
    Constructor Create( AOwner: TComponent ); Override;
    Destructor Destroy; Override;
    Procedure ExportInitialize; Override;
    Procedure ExportEntity( SourceLayer: TEzBaseLayer; Entity: TEzEntity ); Override;
  End;

Implementation

Uses
  ezimpl, ezConsts, ezSystem, EzBasicCtrls, EzRtree, ezctrls ;

Constructor TEzOwnImport.Create( AOwner: TComponent );
Begin
  Inherited Create( AOwner );
  FTempCAD:= TEzCAD.Create(Nil);
End;

Destructor TEzOwnImport.Destroy;
Begin
  Inherited Destroy;
  FTempCAD.Free;
End;

Procedure TEzOwnImport.ImportInitialize;
Var
  SrcLayer: TEzBaseLayer;
Begin
  SrcLayer := TEzLayer.Create( FTempCAD.Layers, ChangeFileExt( Filename, '' ) );
  FTempCAD.ReadOnly:= True;
  SrcLayer.Open;
  With SrcLayer.LayerInfo.Extension Do
  Begin
    If Abs(Emax.x - Emin.x) <= 360 Then
    Begin
      { presumably source file is defined in degrees }
      Converter.SourceCoordSystem := csLatLon;
      If DrawBox.GIS.Layers.Count = 0 Then
        Converter.DestinCoordSystem := Converter.SourceCoordSystem;
    End;
  End;
  { initialize for progress messages }
  nEntities:= SrcLayer.RecordCount;   // this function must return the number of records to import
  MyEntNo := 0;
End;

Procedure TEzOwnImport.GetSourceFieldList( FieldList: TStrings );
Begin
  FTempCAD.Layers[0].GetFieldList(FieldList);
End;

Procedure TEzOwnImport.ImportFirst;
Begin
  FTempCAD.Layers[0].First;
End;

Procedure TEzOwnImport.AddSourceFieldData(DestLayer: TEzBaseLayer; DestRecno: Integer);
Var
  SourceLayer: TEzBaseLayer;
  J: Integer;
Begin
  SourceLayer:= FTempCAD.Layers[0];
  If (DestLayer.DBTable = Nil) Or (SourceLayer.DBTable = Nil) Then Exit;
  DestLayer.DBTable.Recno:= DestRecno;
  DestLayer.DBTable.BeginTrans;
  Try
    DestLayer.DBTable.Edit;
    SourceLayer.DBTable.Recno:= SourceLayer.Recno;
    For J := 1 To SourceLayer.DBTable.FieldCount Do
    Begin
      Try
        With DestLayer.DBTable Do
          AssignFrom( SourceLayer.DBTable, J, FieldNo( SourceLayer.DBTable.Field( J ) ) );
      Except
        // ignore error in fields in DBF file (wrong data)
      End;
    End;
    DestLayer.DBTable.Post;
    DestLayer.DBTable.EndTrans;
  Except
    DestLayer.DBTable.RollbackTrans;
    raise;
  End;
End;

Function TEzOwnImport.GetSourceExtension: TEzRect;
Begin
  FTempCAD.Layers[0].LayerInfo.Extension;
End;

Function TEzOwnImport.ImportEof: Boolean;
Begin
  Result:= FTempCAD.Layers[0].Eof;
End;

Function TEzOwnImport.GetNextEntity(var progress,entno: Integer): TEzEntity;
Begin
  Inc(MyEntNo);
  progress:= Round((MyEntNo / nEntities) * 100);
  entno:=MyEntNo;

  Result:=FTempCAD.Layers[0].RecLoadEntity;
End;

Procedure TEzOwnImport.ImportNext;
Begin
  FTempCAD.Layers[0].Next;
End;


{ TEzOwnExport }

constructor TEzOwnExport.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FTempCAD:= TEzCAD.Create(Nil);
end;

destructor TEzOwnExport.Destroy;
begin
  FTempCAD.Free;
  inherited;
end;

procedure TEzOwnExport.ExportInitialize;
var
  Layer: tEzBaseLayer;
begin
  Layer:= TEzLayer.Create( FTempCAD.Layers, ChangeFileExt( FileName, '' ) );
  Layer.Open;
end;

procedure TEzOwnExport.ExportEntity(SourceLayer: TEzBaseLayer; Entity: TEzEntity);
var
  DestLayer: TEzBaseLayer;
  J, TheRecno: Integer;
  FSource, FDest: Integer;
Begin
  If ( Entity.Points.Parts.Count = 0 ) And ( Entity.Points.Count = 2 ) Then
    Entity.Points.Add( Entity.Points[0] );

  DestLayer:= FTempCAD.Layers[0];

  TheRecno:= DestLayer.AddEntity( Entity );
  If (SourceLayer.DBTable <> Nil) And (DestLayer.DBTable <> Nil) Then
  Begin
    DestLayer.DBTable.Recno:= TheRecno;
    DestLayer.DBTable.Edit;
    // write the new DBF shapefile record
    SourceLayer.DBTable.Recno := SourceLayer.Recno;
    For j := 1 To SourceLayer.DBTable.FieldCount Do
    Begin
      FSource := J;
      FDest := DestLayer.DBTable.FieldNo( SourceLayer.DBTable.Field( J ) );
      If FDest <> 0 Then
      Begin
        Try
          DestLayer.DBTable.AssignFrom( SourceLayer.DBTable, FSource, FDest );
        Except
          // probably caused by corrupted data
        End;
      End;
    End;
    DestLayer.DBTable.Post;
  End;
end;

End.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -