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

📄 unitmainform.pas

📁 此代码是关于mapgis的在
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  if GetImageFormatConfig(MyGIS.GMapTools.MapX, @cfgStruct) then
  begin
    try
      MyGIS.GMapTools.m_Map.SaveMapAsImage(cfgStruct);
    except
      MyWarning('可能保存的图象的长、宽过大!');
    end;
  end;
end;

procedure TForm_Main.tvLayersKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 	//处理空格键
  if tvLayers.Selected<>nil then
    SetTreeNodeCheckState_OnKeyDown(tvLayers, Key, DoOnNodeStateChanged);
end;

procedure TForm_Main.tvLayersMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  SelectTreeNode(tvLayers, Classes.Point(X, Y));
  if ssLeft in Shift then
    SetTreeNodeCheckState_OnMouseDown(tvLayers, X, Y, DoOnNodeStateChanged);
end;

procedure TForm_Main.DoOnNodeStateChanged(Sender: TObject; aNode: TTreeNode);

  procedure SetLayerVisible(const LayerName:string; const Visible:Boolean);
  begin
    MyGIS.GMapTools.MapX.Layers.Item[LayerName].Visible:=Visible;
  end;
  
var
//  i:Integer;
  aLayerInfo:TLayerTreeNodeRecord;
begin
  if aNode.Data=nil then Exit;
  aLayerInfo:=aNode.Data;
  case aLayerInfo.NodeType of
{    LTN_FEATURECLASS:begin
      for i:=0 to aNode.Count-1 do
      begin
        aLayerInfo:=aNode.Item[i].Data;
        SetLayerVisible(aLayerInfo^.Name, aNode.Item[i].StateIndex=TREENODESTATE_SUBCHECKEDALL);
      end;
    end;  }
    LTN_LAYER:begin
      aLayerInfo:=aNode.Data;
      SetLayerVisible(aLayerInfo.Name, aNode.StateIndex=TREENODESTATE_SUBCHECKEDALL);
    end;
  end;
end;

procedure TForm_Main.tvLayersContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
var
  TargetNode: TTreeNode;
  aLyr:Layer;
begin
  tvLayers.PopupMenu:=nil;
  TargetNode := tvLayers.GetNodeAt(MousePos.X,MousePos.Y);
  if TargetNode<>nil then
  begin
    if TargetNode.Level=0 then
      tvLayers.PopupMenu:=pmAllLayers
    else if TLayerTreeNodeRecord(TargetNode.Data).NodeType=LTN_FEATURECLASS then 
      tvLayers.PopupMenu:=pmFeatureClass
    else begin
      aLyr:=MyGIS.GMapTools.m_Layers.FindByName(TLayerTreeNodeRecord(TargetNode.Data).Name);
      if aLyr.Editable then
        PNEditable.Caption:='只读模式'
      else
        PNEditable.Caption:='编辑模式';
      tvLayers.PopupMenu:=pmLayer;
    end;
    Handled:=False;
  end;
end;

procedure TForm_Main.InitEyeForm;
begin
  //鹰眼窗口初始化//
  FrmEagleEye.OperMap:=MyGIS.GMapTools.MapX;
  FrmEagleEye.GeoFileName:=AppPath+'Maps\鹰眼.GST';
  FrmEagleEye.InitLayers(True);
end;

procedure TForm_Main.tvLayersChange(Sender: TObject; Node: TTreeNode);
var
  aLayerInfo:TLayerTreeNodeRecord;
  ALyr:Layer;
begin
  if Node.Data=nil then Exit;
  aLayerInfo:=Node.Data;
  if aLayerInfo.NodeType=LTN_LAYER then
  begin
    if aLayerInfo.IsSystem then
      NAddToProject.Caption:='下载图层到本地'
    else
      NAddToProject.Caption:='加入图层到工程';
    PNAddToProject.Caption:=NAddToProject.Caption;
    ALyr:=MyGIS.GMapTools.MapX.Layers.Item[aLayerInfo.Name];
    if ALyr.Editable then
    begin
      EditLayer:=ALyr;
      MyGIS.GMapTools.MapX.Layers.InsertionLayer:=ALyr;
    end;
  end;
end;

procedure TForm_Main.NNewLayerClick(Sender: TObject);
var
  aLyr:Layer;
  LyrCfg:TLayerConfigInfo;
begin
  AppPath:=CheckPath(AppPath);
  LyrCfg:=TLayerConfigInfo.Create;
  try
    if GetLayerConfig(LyrCfg) then
    begin
      if LyrCfg.Fields.ItemCount=0 then
      begin
        MyDefInformation('新图层至少应该有一个字段!');
        Exit;
      end;
      aLyr:=MyGIS.GMapTools.m_Layers.CreateCustomTableLayer(LyrCfg.LayerName,
        AppPath+'Maps\', LyrCfg.Fields, 1, True);
      AddLayerNode(SysTree, SysTreeRoot, naAddChildFirst,
        -1, aLyr.Name, AppPath+'Maps\'+LyrCfg.LayerName+'.TAB',
        False, 2, -1, 3);
      if Frame_Search1<>nil then
        Frame_Search1.LoadLayers;
    end;
  finally
    LyrCfg.Free;
  end;
end;

procedure TForm_Main.RemoveUserLayers;
var
  i:Integer;
  aNode:TTreeNode;
  aLayerInfo:TLayerTreeNodeRecord;
  aLyr:Layer;
begin
  if SysTreeRoot.Count>0 then
  begin
    for i:=SysTreeRoot.Count-1 downto 0 do
    begin
      aNode:=SysTreeRoot.Item[i];
      aLayerInfo:=aNode.Data;
      if not aLayerInfo.IsSystem then
      begin
        aLyr:=MyGIS.GMapTools.m_Layers.FindByName(aLayerInfo.Name);
        if aLyr=EditLayer then EditLayer:=nil;
        MyGIS.GMapTools.m_Layers.RemoveByName(aLayerInfo.Name);
        DeleteNode(aNode);
      end;
    end;
    FrmEagleEye.InitLayers(True);
  end;
end;

procedure TForm_Main.NRemoveLayerClick(Sender: TObject);
var
  aLayerInfo:TLayerTreeNodeRecord;
  aLyr:Layer;
begin
  if (tvLayers.Selected=nil)or(tvLayers.Selected.Data=nil) then
  begin
    MyDefInformation('请选择要移出的用户图层!');
    Exit;
  end;
  aLayerInfo:=tvLayers.Selected.Data;
  if (aLayerInfo.NodeType<>LTN_LAYER)or(aLayerInfo.IsSystem) then
  begin
    MyDefInformation('只有用户图层可以被移出!');
    Exit;
  end;
  aLyr:=MyGIS.GMapTools.m_Layers.FindByName(aLayerInfo.Name);
  if aLyr=EditLayer then EditLayer:=nil;
  MyGIS.GMapTools.m_Layers.RemoveByName(aLayerInfo.Name);
  aLayerInfo.Free;
  tvLayers.Selected.Delete;
  FrmEagleEye.InitLayers(True);
  if Frame_Search1<>nil then
    Frame_Search1.LoadLayers;
end;

procedure TForm_Main.NLayerOptionsClick(Sender: TObject);
var
  Changed:Boolean;
begin
  ConfigMapLayers(MyGIS.GMapTools.MapX, Changed);
end;

procedure TForm_Main.MoveLayer(const FromIndex, ToIndex: Integer);
begin
  UnitShellAPIs.MoveLayer(MyGIS.GMapTools.MapX, FromIndex, ToIndex);
end;

procedure TForm_Main.SetLayerAutoLabel(const Index: Integer;
  const AutoLabel: Boolean);
begin
  UnitShellAPIs.SetLayerAutoLabel(MyGIS.GMapTools.MapX, SysTreeRoot, Index, AutoLabel);
end;

procedure TForm_Main.SetLayerEditable(const Index: Integer;
  const Editable: Boolean);
var
  aLyr:Layer;
begin
  UnitShellAPIs.SetLayerEditable(MyGIS.GMapTools.MapX, Index, Editable);
  aLyr:=MyGIS.GMapTools.MapX.Layers.Item[Index];
  if not aLyr.Editable then
    SBar.Panels[3].Text:='无'
  else
  begin
    //触发选择集合变化//
    if Frame_DrawShape1<>nil then
      Frame_DrawShape1.SelectionChanged;
    //显示当前编辑图层名称//
    SBar.Panels[3].Text:=aLyr.Name;
  end;
  //重置命令按钮//
  SetRadioCommand(TBtnSelectTool);
end;

procedure TForm_Main.SetLayerSelectable(const Index: Integer;
  const Selectable: Boolean);
begin
  UnitShellAPIs.SetLayerSelectable(MyGIS.GMapTools.MapX, Index, Selectable);
end;

procedure TForm_Main.SetLayerVisible(const Index: Integer;
  const Visible: Boolean);
begin
  UnitShellAPIs.SetLayerVisible(MyGIS.GMapTools.MapX, Index, Visible);
end;

procedure TForm_Main.RemoveuserLayer(const Index: Integer);
begin
  UnitShellAPIs.RemoveuserLayer(MyGIS.GMapTools.MapX, Index);
  FrmEagleEye.InitLayers(True);
end;

procedure TForm_Main.NToRegionClick(Sender: TObject);
var
  i:Integer;
begin
  for i:=1 to MyGIS.GMapTools.MapX.layers.Count do
  begin
    with MyGIS.GMapTools.m_Layer do
    begin
      Layer:=MyGIS.GMapTools.MapX.layers.Item[i];
      AddRegionsFromSelectedLines;
    end;
  end;
end;

procedure TForm_Main.NToLineClick(Sender: TObject);
var
  i:Integer;
begin
  for i:=1 to MyGIS.GMapTools.MapX.layers.Count do
  begin
    with MyGIS.GMapTools.m_Layer do
    begin
      Layer:=MyGIS.GMapTools.MapX.layers.Item[i];
      AddLinesFromSelectedRegions;
    end;
  end;
end;

procedure TForm_Main.NClipWithRectClick(Sender: TObject);
begin
  CheckEditLayer;
  with MyGIS.GMapTools.m_Layer do
  begin
    Layer:=EditLayer;
    BreakFeatureLineOrRegion(SourceFts);
  end;
end;

procedure TForm_Main.DoCanExecute_CreateShape(Sender, Trigger: TObject;
  var CanExec: Boolean);
begin
  try
    CheckEditLayer;
    CanExec:=True;
  except
    CanExec:=False;
  end;
end;

procedure TForm_Main.NMakeTargetClick(Sender: TObject);
begin
  CheckEditLayer;
  if editlayer.Selection.Count=0 then
  begin
    MyDefInformation('请选择编辑图层里的一个对象!');
    Exit;
  end;
  SourceFts:=editlayer.Selection.Clone;
  editlayer.NoFeatures;
  editlayer.Selection.ClearSelection;
end;

procedure TForm_Main.NClearTargetClick(Sender: TObject);
begin
  SourceFts:=nil;
end;

procedure TForm_Main.NPasteClick(Sender: TObject);
begin
  CheckEditLayer;
  with MyGIS.GMapTools.m_Layer do
  begin
    BeforeDeleteFeature:=DoBeforeDeleteFeature;
    OnFeatureCreate:=DoOnFeatureCreate;
    Layer:=EditLayer;
    Paste;
  end;
end;

procedure TForm_Main.NCopyClick(Sender: TObject);
begin
  if not MyGIS.GMapTools.m_Map.Copy then
    MyDefInformation('请在当前编辑图层内选择要复制的对象!');
end;

procedure TForm_Main.NCutClick(Sender: TObject);
begin
  CheckEditLayer;
  if editlayer.Selection.Count=0 then
  begin
    MyDefInformation('请在当前编辑图层内选择要剪切的对象!');
    Exit;
  end;
  with MyGIS.GMapTools.m_Layer do
  begin
    BeforeDeleteFeature:=DoBeforeDeleteFeature;
    OnFeatureCreate:=DoOnFeatureCreate;
    Layer:=EditLayer;
    Cut;
  end;
end;

procedure TForm_Main.RefreshSelectionRecords;

  function LayerInSelection(Layer:CMapXLayer):Boolean;
  var
    i:Integer;
    Lyr:CMapXLayer;
  begin
    for i:=1 to MyGIS.GMapTools.MapX.Layers.Count do
    begin
      Lyr:=MyGIS.GMapTools.MapX.Layers.Item[i];
      if (Lyr=Layer)and(Lyr.Selection<>nil)and(Lyr.Selection.Count>0) then
      begin
        Result:=True;
        Exit;
      end;
    end;
    Result:=False;
  end;

  function GetRecordFrame(Layer:CMapXLayer):TFrame_Records;
  var
    i:Integer;
    ARecFrame:TFrame_Records;
  begin
    for i:=0 to ScrollBox1.ControlCount-1 do
      if ScrollBox1.Controls[i] is TFrame then
      begin
        ARecFrame:=ScrollBox1.Controls[i] as TFrame_Records;
        if ARecFrame.Layer=Layer then
        begin
          Result:=ARecFrame;
          Exit;
        end;
      end;
    Result:=nil;
  end;
  
var
  i, j:Integer;
  ALyr:CMapXLayer;
  SelLyrCount:Integer;
  ARecFrame:TFrame_Records;
begin
  if ScrollBox1=nil then Exit;
  
  SelLyrCount:=GetSelectionLayerCount;
  
  for i:=ScrollBox1.ControlCount-1 downto 0 do
    if ScrollBox1.Controls[i] is TFrame then
    begin
      ARecFrame:=ScrollBox1.Controls[i] as TFrame_Records;
      if not LayerInSelection(ARecFrame.Layer) then
      begin
        if ARecFrame.Splitter<>nil then
          ARecFrame.Splitter.Free;
        ARecFrame.Free;
      end;
    end;

  j:=0;
  for i:=1 to MyGIS.GMapTools.MapX.Layers.Count do
  begin
    ALyr:=MyGIS.GMapTools.MapX.Layers.Item[i];
    if (ALyr.Selection<>nil)and(ALyr.Selection.Count>0) then
    begin
      Inc(j);
      ARecFrame:=GetRecordFrame(ALyr);
      if ARecFrame=nil then
      begin
        ARecFrame:=TFrame_Records.Create(Self);
        ARecFrame.Name:='';
        ARecFrame.Parent:=ScrollBox1;
        if j=SelLyrCount then
          ARecFrame.Align:=alClient
        else
          ARecFrame.Align:=alTop;
      end;
      {设置MapX}
      ARecFrame.MapX:=MyGIS.GMapTools.MapX;
      {设置图层}
      ARecFrame.Layer:=ALyr;
      ARecFrame.LayerData:=GetLayerData(ALyr);
      if ALyr.DataSets.Count>0 then
      begin
        {设置数据集}
        ARecFrame.DataSet:=ALyr.DataSets.Item[1];
        {初始化网格}
        ARecFrame.InitGrid;
        {填写标题}
        ARecFrame.InitGridTitle;
        {首先调用MyGIS写数据,如果返回为False,则以默认方式填写数据}
        if not MyGIS.DoWriteDataGridData(ARecFrame) then
          ARecFrame.DefWriteGridData;
      end;
    end;
  end;
end;

function TForm_Main.GetSelectionLayerCount: Integer;
var
  i:Integer;
  Lyr:CMapXLayer;
begin
  Result:=0;
  for i:=1 to MyGIS.GMapTools.MapX.Layers.Count do
  begin
    Lyr:=MyGIS.GMapTools.MapX.Layers.Item[i];
    if (Lyr.Selection<>nil)and(Lyr.Selection.Count>0) then
    begin
      Inc(Result);
      Exit;
    end;
  end;
end;


procedure TForm_Main.N65Click(Sender: TObject);
var
  i:Integer;
  Rect:CMapXRectangle;
begin
  Rect:=CoRectangle.Create;
  Rect:=MyGIS.GMapTools.MapX.Bounds;
  for i:=1 to MyGIS.GMapTools.MapX.Layers.Count do
    MyGIS.GMapTools.MapX.Layers.Item[i].CoordSys
end;

procedure TForm_Main.N31Click(Sender: TObject);
var
  aLyr:Layer;
begin
  aLyr:=GetLayerFromTreeNode(tvLayers.Selected);
  if aLyr=nil then Exit;
  MyGIS.GMapTools.MapX.Bounds := aLyr.Bounds;
end;

procedure TForm_Main.N23Click(Sender: TObject);
begin
  MyGIS.GMapTools.MapX.Bounds := MyGIS.GMapTools.MapX.Layers.Bounds;

⌨️ 快捷键说明

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