兄台:不知以下代码部可否实现根据居民点的坐标显示这些点
procedure TForm1.Button1Click(Sender: TObject);
var
ds:cmapxdataset;
dbk:variant;
BindLayerObject:cMapXBindLayer;
flds:cmapxFields;begin
map1.datasets.removeall;
dbk := CreateOleObject('MapX.ODBCQueryInfo.3');
dbk.SqlQuery := 'select *from Us_Cust';
dbk.DataSource := 'ddbb5';
dbk.ConnectString := 'ODBC;'; flds:=cofields.create;
flds.Add('City', 'City', miAggregationIndividual, miTypeString);
flds.Add('State', 'State', miAggregationIndividual, miTypeString);
flds.Add('Longitude', 'Longitude', miAggregationSum, miTypeNumeric);
flds.Add('Latitude', 'Latitude', miAggregationSum, miTypeNumeric); BindLayerObject:=cobindlayer.create;
BindLayerObject.LayerName := 'citypot';
BindLayerObject.RefColumn1 := 3 ;
BindLayerObject.RefColumn2 := 4 ;
BindLayerObject.LayerType := miBindLayerTypeXY;
ds := Map1.Datasets.Add(miDataSetODBC, dbk, 'U.S. Cities','City', 'State',BindLayerObject, flds,false);
......end; 以上代码运行有错误,这种方法是否行不通?请指教,谢谢!
procedure TForm1.Button1Click(Sender: TObject);
var
ds:cmapxdataset;
dbk:variant;
BindLayerObject:cMapXBindLayer;
flds:cmapxFields;begin
map1.datasets.removeall;
dbk := CreateOleObject('MapX.ODBCQueryInfo.3');
dbk.SqlQuery := 'select *from Us_Cust';
dbk.DataSource := 'ddbb5';
dbk.ConnectString := 'ODBC;'; flds:=cofields.create;
flds.Add('City', 'City', miAggregationIndividual, miTypeString);
flds.Add('State', 'State', miAggregationIndividual, miTypeString);
flds.Add('Longitude', 'Longitude', miAggregationSum, miTypeNumeric);
flds.Add('Latitude', 'Latitude', miAggregationSum, miTypeNumeric); BindLayerObject:=cobindlayer.create;
BindLayerObject.LayerName := 'citypot';
BindLayerObject.RefColumn1 := 3 ;
BindLayerObject.RefColumn2 := 4 ;
BindLayerObject.LayerType := miBindLayerTypeXY;
ds := Map1.Datasets.Add(miDataSetODBC, dbk, 'U.S. Cities','City', 'State',BindLayerObject, flds,false);
......end; 以上代码运行有错误,这种方法是否行不通?请指教,谢谢!
解决方案 »
- 请问如何在PE文件中搜索一段字节数组.并反回地址.
- delphi2007的source目录里面怎么没有了windows.pas等这些源文件?
- {$R *.RES}起什么作用? 如何看.res文件的内容
- 请教wwDBGrid的单元列显示为CheckBox需要啥字段类型
- 如何提供用户选择打印机的功能???????
- 关于longint类型变量的内存存放顺序----紧急求助
- 比较愚钝的问题:控制台程序可否使用数据库相关组件?
- 请问:哪里有制作报表的资料下载 QReport,FastReport,Rave 都可以?
- 关于对字符串加密!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- StringGrid
- 求助!很急,大家帮帮我。
- 问问题兼散分!帮忙up就给分!帮忙解决问题另开贴送200分!决不食言!
不只可不可以,我以前做Autodesk的MapGuide时是可以的,对于MapX还不太懂
(X-canvas.x)*(X-canvas.x)+(Y_canvas.y)*)+(Y_canvas.y)<=r*r
X,Y是居民的坐标!
希望对你有些帮助!
FID := FieldByName('地图结点号').AsInteger;
LrName := FieldByName('地图层名称').AsString;
lr := Map1.Layers.Item(lrName);
if lr <> nil then
begin
try
f := lr.GetFeatureByID(FID);
except
end;
if f <> nil then
lr.AddFeature(f);
end;
finally
Next;
end;
===================================================================
暗恋女司机,薪水全做公交车了!
http://www.csdn.net/expert/topic/926/926315.xml?temp=4.807681E-02
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
FCurXCoord: Double; // Current X coordination on map
FCurYCoord: Double; // Current Y coordination on map
ScreenX, ScreenY: Single;
FeatureKey: String;
begin
ScreenX := X;
ScreenY := Y;
{ Save current mouse position for add new rolly point. }
MapTopo.ConvertCoord(ScreenX, ScreenY, FCurXCoord, FCurYCoord, miScreenToMap); FeatureKey := GetFeatureKey(FCurXCoord, FCurYCoord);
if FeatureKey <> EmptyStr then
根据FeatureKey就可以做你要做的事情了,MapX的Demo中有;
end;function TMapBaseForm.GetFeatureKey(AMapX, AMapY: Double): String;
var
Point: CMapXPoint;
Features: Variant;
InfoFeature: Variant;
begin
Result := EmptyStr; Point := CoPoint.Create;
Point.Set_(AMapX, AMapY); Features := FFeatureLayer.SearchAtPoint(Point);
if Features.Count > 0 then
begin
InfoFeature := Features.Item(1);
Result := InfoFeature.FeatureKey;
end; {if}
end;
数据捆绑是将不同来源的数据对应到地图层的过程,捆绑结果会产生一个Dataset对象,Dataset对象的集合组成Datasets Collection,它定义了Map对象的数据集属性。 你可以通过Datasets将不同来源的数据捆绑到地图上实现图文互动,或创建专题图,如下例ODBC Access数据的捆绑及专题分析:
procedure TMapForm.ODBC1Click(Sender: TObject);
var
param: ODBCQueryInfo ;
ds: Dataset; //定义数据集
Datafields: Fields; //定义数据域
begin
param.SqlQuery := 'select * from China'; //选择Access数据库中的China表
param.DataSource := 'MapChina'; //ODBC 数据源名
param.ConnectString := 'ODBC;'; //或是user = ... Pwd = ... , 定义ODBC连接
Datafields.Add('GEONAME','GEONAME', miAggregationAuto,miTypeString); //添加数据域GEONAME
Datafields.Add('POPU','POPU', miAggregationAuto,miTypeNumeric); //添加数据域POPU
//将Access数据捆绑到Mapinfo China表
ds := Map.Datasets.Add(miDataSetODBC, param, unassigned, unassigned, unassigned, 'CHINA', Datafields, unassigned);
ds.Themes.Add(miThemeRanged, 'POPU', 'MyTheme'); //添加一个范围专题图
end; 第二、建立客户定制工具
你还可以定制自己的地图操作工具,下面通过定制一个名为Info的信息按钮工具简述方法步骤:
(1)定义客户工具常量
Const CUSTOM_INFO_TOOL = 1
(2)利用Map对象的CreateCustomTool方法定义客户工具,方法为:
CreateCustomTool (ToolNumber, Type, Cursor, [ShiftCursor] , [CtrlCursor], [InfoTips])
其中ToolNumber为工具号,即上面定义的常量;Type为工具类型;Cursor为光标形状,其他参数可选。
//定义Info工具为十字光标点触发工具
Map.CreateCustomTool(CUSTOM_INFO_TOOL, miToolTypePoint, miCrossCursor, miArrowCursor, miArrowCursor, unassigned)
(3)在Map对象事件ToolUsed中编写工具的Handler(操作内容)
procedure TMain.MapToolUsed(Sender: TObject; ToolNum: Smallint; X1, Y1, X2, Y2, Distance: Double;
Shift, Ctrl: WordBool; var EnableDefault: WordBool);
begin
Case ToolNumber of
CUSTOM_INFO_TOOL : //信息工具Info
try
……
end;
(4)定义信息按钮的Click事件
procedure TMain.InfoClick(Sender: TObject);
begin
Map.CurrentTool:=CUSTOM_INFO_TOOL;
end 第三、使用专题图
1、 专题地图的概念
MapInfo的一个显著特征就是能将数据库中的信息进行直观的可视化分析。专题地图就是用于分析和表现数据的一种强有力的方式。用户可以通过使用专题地图的方式将数据图形化,使数据以更直观的形式在地图上体现出来。当使用专题渲染在地图上显示数据时,可以清楚地看出在数据记录中难以发现的模式和趋势,为用户的决策支持提供依据。专题地图是MapInfo中的一个重要概念,是用户使用好MapInfo的一种体现。
制作专题地图是根据某个特定专题对地图进行“渲染”的过程。所谓的专题渲染,就是以某种图案或颜色填充来表明地图对象(点、线、区域)的某些信息(例如人口、大小、年降雨量、日期等等),也就是说,这类渲染存在着主题,经过这样渲染的地图就是专题地图。利用MapInfo,可根据数据库表中特定的值来赋给地图对象颜色、图案或符号,从而创建不同的专题地图。
2、 专题图的六种类型
MapInfo为创建专题地图提供了强有力的支持。用户可以使用范围值、等级符号、点密度、独立值、直方图和饼图等多达六种方式来创建不同的专题地图。
(1)、 范围值
按照设置的范围显示数据。这些范围用颜色和图案进行渲染。范围专题地图能够通过点、线和区域来说明数值,在反映数值和地理区域的关系(如销售数字,家庭收入),或显示比率信息如人口密度(人口除以面积)时是很有用的。
(2)、 等级符号
等级符号为表中每条记录显示一个符号,符号大小与数据值成比例。等级符号地图用特定的数值来显示数据点,对于阐明定量信息(如由高到低依次变化)很有用处。符号的大小与该点对应的数值成比例,数值越大点就越大,数值越小点就越小。因此,等级符号最适合数据值数据。
(3)、 点密度
在地图上用点来显示数据,每一点都代表一定数量,某区域中点的总数与该区域数值成比例。每个点代表一定数量的单元,该数乘以区域内总的点数,就等于该区域的数据值。
(4)、 独立值
按独立数值渲染地图,可以表达多个变量。根据独立值绘制地图对象的专题地图有助于强调数据的类型差异而不是显示定量信息(如给定区域内的商店类型、分区类型等等)。
(5)、 直方图
将表中每条记录的专题变量显示为一个直方图。使用直方图可分析地图中每条记录的多个变量。比较每个直方图中各直方条的大小可考察表中某条记录,比较所有直方图中某一条的大小可考察所有记录的某个变量,而比较各直方图的高度可考察整张表。用直方图来表达负值时,该条会沿直方图反方向伸展。在叠加直方图中不显示负值。
(6)、 饼图
以饼图显示表中各记录的专题变量。饼图可包含多个变量。在地图上使用饼图可一次分析多个变量,比较每个图中饼扇的大小可考察表中某条记录,比较所有饼图中某一个饼扇,可考察所有记录中某个变量的变化,比较各饼图的直径可考察整张表。
3、 MapX对专题图的支持
MapX中使用Themes集合与Theme对象来实现对专题图的支持,每个Themes集合中可以包含多个Theme对象,也就是说,针对一个Dataset,可以创建多幅不同的专题地图。
每个Dataset都拥有一个Themes集合,并以其属性的形式存在,即Dataset.Themes。使用Themes的Add、Remove、RemoveAll等方法可以控制专题的添加和删除。
Ø Add方法:创建一个专题并将其加入到某个特定的DataSet的Themes集合中,
Map1.Datasets(1).Themes.Add(miThemeRanges,’’’area’,’Myranges Theme’)
Ø Remove方法:从集合中删除某一特定的专题图
Map1.Datasets(1).Themes.Remove "My Ranges Theme"
Ø RemoveAll方法:从集合中删除所有的的专题图
Map1.Datasets(1).Themes.RemoveAll
Theme对象用于设置每个专题图的属性。
比较重要的有
Ø Layer:返回一个Layer对象,表示该专题图所在的图层
Ø Legend:控制 对专题地图的说明,即图例
Ø ComputeTheme 控制是否可以对原始数据进行计算,默认为True
Ø Type 即专题图类型,取值范围为ThemeTypeConstants
Ø Fields 只读属性,返回该专题图所基于的Dataset中的字段集合
ThemeProperties 复合型属性,对应ThemeProperties对象,包含了专题图详尽的定义信息,如范围定义、显示风格设置等。
4、 专题图的规划
在创建专题图的过程中,有几个关键因素,包括专题图变量的确定、属性数据的获取以及专题图层的显示与控制。
(1)、 确定专题图变量
在专题图中显示的数据就是专题图变量。例如在行政区面积专题图中,表示面积的字段“area”就是这个专题地图的专题地图变量。
一个专题变量可以是一个字段或表达式。取决于专题图的类型,在一张地图上可以显示一个或多个专题图变量。范围值、等级符号、点密度和独立值地图都只检查一个变量。可以利用饼图或直方图一次显示多个专题变量。也可以创建双变量专题地图,其中一个地图对象可代表两个不同的数据,入符号的颜色代表一个专题变量,符号的大小代表另一个专题变量。
(2)、 属性数据的获取
在创建专题地图之前,必须确定需要显示何种信息,信息存储在什么位置。它可以在创建地图时所基于的表中,也可以在ODBC支持的外部数据库中。数据来源于Field对象或Field集合,在Themes.Add方法中通过Fields参数传递。
(3)、 创建专题图
首先应将某个产生专题图数据的dataset引入地图中,之后使用Themes.Add方法创建一个Theme对象。
curmap.Datasets(1).Themes.Add(miThemeRanges,‘TotPop’,‘’);
语法: Themes.Add [Type], [Field], [Name]
Type用于定义要创建的专题图的类型,它的取值范围是ThemeTypeConstants,该参数可选,如果没有定义或者定义为miThemeAuto,MapX会根据字段数以及已经存在的专题图类型自动在ThemeTypeConstants中选择一个。如果MapX无法自行确定专题类型,就会产生一个错误。
Field(s)定义在专题图中使用的一个或多个字段,可以通过字段名、字段索引或字段对象来引用。当创建多变量专题图时,可以使用数组表示。该字段是可选的,若不特意指定,MapX会使用DataSet中的第一个数字型字段。
Name,即专题图的名称,String类型参数,若不指定,MapX会自动生成一个名字。
(4)、 专题图类型常量
专题图变量由Theme.Typeproperty取得,其定义如下:
miThemeRanged = 0
miThemeBarChart = 1
miThemePieChart = 2
miTheme GradSymbol = 3
miThemeDotDensity = 4
miThemeIndividualValue = 5
miThemeAuto = 6
miThemeNone = 9
5、 控制专题地图
有两种方法可以控制专题地图。
(1)、 使用Theme.ThemeDlg方法
该方法显示一个对话框,用户可以直接修改专题图特性。语句如下:
curmap.Datasets(1).Themes(1).ThemeDlg;
这种方法虽然简单,但是而且很难与自己的程序风格相一致,用户界面不友好,而且在这个默认的对话框中,用户可以随意改变任何设置,使得程序的控制难度加大。
(2)、 改变ThemeProperties对象属性
通过设置ThemeProperties
http://www.mapinfo.com.cn/bbs/Topic.asp?topic_id=4074&forum_id=4&Topic_Title=MapX%25BC%25BC%25CA%25F5%25B7%25D6%25CE%25F6%25A3%25AD%25C8%25EB%25C3%25C5%25C6%25&forum_title=MapInfo+MapX
Y1, X2, Y2, Distance: Double; Shift, Ctrl: WordBool;
var EnableDefault: WordBool);
var
pt:CMapXPoint;
lyr,lyrA:CMapXLayer;
fts:CMapXFeatures;
ft:CMapXFeature;
ds: CMapXDataset; MapName: string;
CircMi: Double;
AreaName: string;
FtrName: string; LayerName: string;
FileName: string; LayerInfo: CMapXLayerInfo;
FILEOBJ: TFileStream; r: variant; //设置字体大小
LyrName, LyrAName: string;begin case ToolNum of
CUSTOM_INFO_TOOL : //信息工具Info
begin
pt := CoPoint.Create;
pt.Set_(X1,Y1);
lyr:=GetLayer(pt,mArea);
mlyr:= lyr;
AddtoSelection(lyr,pt,X1,Y1,Ctrl);
// pt._Release;
end;
end;procedure TMDIChild.AddToSelection(lyr:CMapXLayer; pt:CMapXPoint;X1,Y1:Double;Ctrl:WordBool);
var
ft:CMapXFeature;
fts:CMapXFeatures;
begin
fts:= lyr.SearchAtPoint(pt);
if fts.Count = 0 then
begin
end
else
begin
ft := fts.Item(1);
if not Ctrl then
lyr.Selection.Replace(ft)
else
lyr.Selection.Add(ft);
displayobjinfo(lyr);
end;{if}
end;procedure displayobjinfo(lyr: CMapXLayer);
begin
with Child do
begin
if not frmInformation.Showing then
frmInformation.Show
else
begin
with frmInformation do
begin
UpdateTreeView(lyr);
end;
end;
end;
end;procedure TfrmInformation.UpdateTreeView(lyr: CMapXLayer);
var
i,j,L,M: integer;
ftr: CMapXFeature;
ds: CMapXDataset;
fld: CMapXField;
lyrNode, ftrNode: TTreeNode;
RootNode: TTreeNode;
multitag: Boolean;
singleX,singleY: Double;
value: Variant;
strValue, NDName: string;
begin
frmInfoShowed := True;
if tvwInformation.HasParent then
multitag:=true
else
multitag:=false; tvwInformation.Items.Clear;
tvwInformation.Items.BeginUpdate; with Child do
begin
// RootNode:= tvwInformation.Items.Add( nil,lyr.Name );
// for i:=0 to Map1.Layers.count-1 do
// begin
if lyr.Selection.Count>0 then
lyr.BeginAccess(miAccessRead); lyrNode := tvwInformation.Items.AddChild(nil , lyr.Name);
lyrNode.Expanded := True;
for j:=0 to lyr.Selection.Count-1 do
begin ftr := lyr.Selection.Item(j+1);
ftrNode := tvwInformation.Items.AddChild(lyrNode, ftr.Name);
//lyr.Name+inttostr(ftr.FeatureID)+ftr.Name); if multitag then
begin
ftrNode.Expanded := True;
multitag := not multitag;
end;
for L:= 0 to lyr.Datasets.Count-1 do
begin
ds:= lyr.Datasets.Item(L+1);
for M:=0 to ds.Fields.Count-1 do
begin
// if fld =ds.Fields.Item(M+1) then
// begin
fld :=ds.Fields.Item(M+1);
if (ds.Value[ftr, fld.Name] <> Null) and (Trim(fld.Name) <> 'NAME') then
begin
value := ds.Value[ftr, fld] ;
if(TVarData(value).vType = varOleStr) then
strValue := value
else
strValue:=ds.Value[ftr, fld]; if fld.Name ='MobileNodes' then
NDName:='移动营业厅数量'
else
NDName:='联通营业厅数量'; tvwInformation.Items.AddChild(ftrNode,NDName +': ' +strValue);
end;
end;
end;
end;
lyr.EndAccess(miAccessEnd);
// end;{For Layer1}
tvwInformation.Items.EndUpdate;
tvwInformation.FullExpand; if multitag then
begin
lyrNode.Expanded := True;
ftrNode.Expanded := True;
multitag := not multitag;
end;
end;
end;献丑了!