📄 renderer.~pas
字号:
unit renderer;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, MapObjects2_TLB,
StdCtrls, ComCtrls, ExtCtrls;
type
TRendererFrm = class(TForm)
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
BtOk: TButton;
RbDensityCheck: TRadioButton;
RbChartCheck: TRadioButton;
RbBreaksCheck: TRadioButton;
RbValueCheck: TRadioButton;
CbbLayer: TComboBox;
CbbField: TComboBox;
EdtBreaksCount: TEdit;
Panel1: TPanel;
UpDownSize: TUpDown;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
ColorDialog1: TColorDialog;
Panel2: TPanel;
Label4: TLabel;
RbBar: TRadioButton;
RbBt: TRadioButton;
procedure FormActivate(Sender: TObject);
procedure CbbLayerChange(Sender: TObject);
procedure Panel1Click(Sender: TObject);
procedure BtOkClick(Sender: TObject);
procedure Panel2Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure RbDensityCheckClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
RendererFrm: TRendererFrm;
implementation
uses Main;
{$R *.DFM}
procedure TRendererFrm.FormActivate(Sender: TObject);
var
MapLayers: ImoMapLayer;
i: Integer;
begin
CbbLayer.Clear;
for i := 0 to mainfrm.mainmap.Layers.Count - 1 do
begin
MapLayers := ImoMapLayer(mainfrm.mainmap.Layers.Item(i));
CbbLayer.items.add(MapLayers.Name);
end;
CbbLayer.ItemIndex := 0;
CbbLayer.OnChange(Sender);
end;
procedure TRendererFrm.CbbLayerChange(Sender: TObject);
var
MyTableDesc:imoTableDesc;
i:integer;
begin
MyTableDesc:=CoTableDesc.Create;
Currentlayer:=ImoMaplayer(MainFrm.MainMap.Layers.Item(CbbLayer.Text));
MyTableDesc:=Currentlayer.Records.TableDesc;
CbbField.Clear;
for i:=0 to MyTableDesc.FieldCount-1 do
begin
if RbDensityCheck.Checked or RbBreaksCheck.checked or RbChartCheck.Checked then
begin
if (MyTableDesc.FieldType[i]=moLong) or (MyTableDesc.FieldType[i]=moDouble) then
CbbField.Items.Add(MyTableDesc.FieldName[i]);
end
else
CbbField.Items.Add(MyTableDesc.FieldName[i]);
//添加字段
end;
CbbField.ItemIndex:=0;
end;
procedure TRendererFrm.BtOkClick(Sender: TObject);
Var
MyRenderer: ImoDotDensityRenderer;
MyValueRenDerer: ImoValueMapRenderer;
MyChartRenderer: ImoChartRenderer;
MyBreaksCount: integer;
MyCbRenderer: imoClassBreaksRenderer;
MyLayer: imoMapLayer;
MyStatistics: ImoStatistics;
MyRecord: ImoRecordSet;
MyStrings: ImoStrings;
i,j: integer;
begin
MyLayer:=CoMapLayer.Create;
MyLayer:=ImoMapLayer(MainFrm.MainMap.Layers.Item(CbbLayer.Text));
if RbDensityCheck.Checked then
//点密度专题图
begin
MyRenderer:=CoDotDenSityRenderer.Create;
MyStatistics:=MyLayer.Records.CalculateStatistics(CbbField.Text);
MyRenderer.Field:=CbbField.Text;
MyRenderer.DotValue:=(MyStatistics.Min+(MyStatistics.Max-MyStatistics.Min)/2)/100;
MyRenderer.DotColor:=Panel1.Color;
MyRenderer.DotSize:=UpDownSize.Position;
MyLayer.Renderer:=MyRenderer;
MainFrm.MainMap.Refresh;
MyRenderer:=Nil;
MyRecord:=Nil;
end
else if RbValueCheck.Checked then
//独立值专题图
begin
MyStrings:=CoStrings.Create;
MyValueRenderer:=CoValueMapRenderer.Create;
MyRecord:=MyLayer.Records;
Myrecord.MoveFirst;
While not MyRecord.EOF do
begin
//过滤重复值
MyStrings.Add(Myrecord.Fields.Item(CbbField.Text).ValueAsString);
Myrecord.MoveNext;
end;
MyValueRenderer.Field:=CbbField.Text;
MyValueRenderer.ValueCount:=MyStrings.Count;
//开始渲染
For i:=0 to MyStrings.Count-1 do
MyValueRenderer.Value[i]:=MyStrings.Item(i);
MyLayer.Renderer:=MyValueRenderer;
MainFrm.MainMap.Refresh;
MyRecord:=Nil;
MyStrings:=Nil;
MyValueRenderer:=nil;
end
else if RbChartCheck.Checked then
//图表专题图
begin
MyChartRenderer:=CoChartRenderer.Create;
if RbBar.Checked then
MyChartRenderer.ChartType:=MoBar
else
MyChartRenderer.ChartType:=MoBar;
MyChartRenderer.MaxPieSize:=8;
MyChartRenderer.FieldCount:=3;
for i:=0 to 1 do
begin
MyChartRenderer.Field[i]:= CbbField.Items.Strings[i];
MyChartRenderer.Color[i]:=RGB(Random(255),Random(255),Random(255));
end;
MyLayer.Renderer:= MyChartRenderer;
MainFrm.MainMap.Refresh;
MyRecord:=Nil;
MyChartRenderer:=nil;
end
else if RbBreaksCheck.Checked then//设置分位点并赋值
begin
//or MyLayer.Records.TableDesc.FieldType[CbbField.ItemIndex]<>MoDouble
MyCbrenderer:=coClassBreaksRenderer.Create;
MyRecord:=MyLayer.SearchExpression(CbbField.Text+ '>-1 Order by '+ CbbField.Text);
MyCbrenderer.Field:=CbbField.Text;
MyBreaksCount:=strToInt(EdtBreaksCount.Text);
MyCbrenderer.BreakCount:=MyBreaksCount;
For i:=1 to MyBreaksCount-1 do
begin
For j:=0 to Round(MyRecord.Count/MyBreaksCount)do
Myrecord.moveNext;
MyCbRenderer.Break[i]:=MyRecord.fields.item(CbbField.Text).value;
end;
MyCbrenderer.RampColors(Panel1.Color,Panel2.Color);
Currentlayer.Renderer:=MyCbRenderer;
MainFrm.MainMap.refresh;
MyRecord:=Nil;
MyCbRenderer:=nil;
end;
//分位数法制作专题图
MainFrm.tfcMaptreeview1.DrawLegend;
end;
procedure TRendererFrm.Panel2Click(Sender: TObject);
begin
if ColorDialog1.Execute then
Panel2.Color:=ColorDialog1.Color;
end;
procedure TRendererFrm.Panel1Click(Sender: TObject);
begin
if ColorDialog1.Execute then
Panel1.Color:=ColorDialog1.Color;
end;
procedure TRendererFrm.FormShow(Sender: TObject);
begin
RbBar.Visible:=RbChartCheck.Checked;
RbBt.Visible:=RbChartCheck.Checked;
if RbBreaksCheck.Checked then
begin
panel1.Width:=55;
panel1.Color:=MoOrange;
panel1.Caption:='起始';
panel2.Visible:=true;
panel1.Visible:=true;
label4.Visible:=true;
panel2.Color:=MoRed;
panel2.Caption:='终止';
label4.Caption:='分位数: ';
EdtBreaksCount.Visible:=true;
UpDownSize.Visible:=true;
end
else if RbDensityCheck.Checked then
begin
panel1.Width:=130;
panel1.Color:=MoRed;
panel1.Caption:='颜色设置';
panel2.Visible:=false;
label4.Visible:=true;
label4.Caption:='点号: ';
EdtBreaksCount.Visible:=true;
UpDownSize.Visible:=true;
end
else
begin
panel1.Visible:=false;
panel2.Visible:=false;
label4.Visible:=false;
EdtBreaksCount.Visible:=false;
UpDownSize.Visible:=false;
end;
end;
procedure TRendererFrm.RbDensityCheckClick(Sender: TObject);
begin
CbbLayer.OnChange(Sender);
RendererFrm.FormShow(Sender);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -