delphi操作mapx部分技巧Word文件下载.docx
- 文档编号:22930079
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:16
- 大小:21.01KB
delphi操作mapx部分技巧Word文件下载.docx
《delphi操作mapx部分技巧Word文件下载.docx》由会员分享,可在线阅读,更多相关《delphi操作mapx部分技巧Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
以下是FeatureFactory对象的方法:
BufferFeatures
CombineFeatures
CreateArc
CreateCircularRegion
CreateEllipticalRegion
CreateLine
CreateRegion
CreateSymbol
CreateText
EraseFeature
IntersectFeatures
IntersectionPoints
IntersectionTest
二.在符号图元中使用自定义位图
定义一个cs:
CMapXStyle
做为图元的样式属性设置
cs:
=coStyle.Create;
cs.SymbolType:
=miSymbolTypeBitmap;
cs.SymbolBitmapName:
='
HOUS2-32.BMP'
;
cs.SymbolBitmapSize:
=40;
注意:
自定义的位图一定要放到C:
\ProgramFiles\CommonFiles\MapInfoShared\MapX
Common\CUSTSYMB下,这是MapInfo安装的黩认共享路径。
三.屏幕坐标向地图坐标的转换
procedureTMapForm.Map1MouseUp(Sender:
TObject;
Button:
TMouseButton;
Shift:
TShiftState;
X,Y:
Integer);
var
lon,lat:
Double;
singleX,singleY:
Single;
fs:
CMapXFeatures;
pnt:
CMapXPoint;
name:
String;
begin
ifMap1.CurrentTool=miArrowToolthen
pnt:
=CoPoint.Create;
singleX:
=X;
singleY:
=Y;
Map1.ConvertCoord(singleX,singleY,lon,
lat,miScreenToMap);
pnt.Set_(lon,lat);
fs:
=Map1.Layers.
Item('
USTop20Cities'
).SearchAtPoint(pnt);
iffs.Count>
0then
begin
name:
=fs.Item
(1).Name;
Application.MessageBox(PChar(name),'
Info'
0)
end
else
Application.MessageBox('
Nothingfound'
'
Nope'
0);
end;
备注:
获取一个图元时最好用Layer.GetFeatureByID(FeatureKey);
四.查找某一城市
procedureTForm2.SearchForCapital(Capital:
String);
FoundF:
FindFeature;
//在小城市层查
FoundF:
=Map1.Layers.Item['
USMinorCities'
].Find.Search(Capital,EmptyParam);
//在usminorcities层中查找capital
if(FoundF.FindRCmod10)=1then
Map1.Layers.Item['
].Selection.Replace(FoundF);
Map1.Zoom:
=60;
//60英里
Map1.CenterX:
=FoundF.CenterX;
Map1.CenterY:
=FoundF.CenterY;
Noexactmatchfound.'
'
0);
五.鼠标点击选中一片区域
procedureTForm2.Map1ToolUsed(ASender:
ToolNum:
Smallint;
X1,Y1,
X2,Y2,Distance:
Shift,Ctrl:
WordBool;
varEnableDefault:
WordBool);
ftrs:
Features;
//CMapXFeatures;
newJersey:
//CMapXFindFeature;
usaLayer:
Layer;
//CMapXLayer;
pt:
Point;
ifToolNum=miSelectToolthen
pt:
pt.Set_(X1,Y1);
usaLayer:
USA'
];
newJersey:
=usaLayer.Find.Search('
NY'
EmptyParam);
//找到ny500英里之内的区域
ftrs:
=usaLayer.SearchWithinDistance(pt,500,miUnitMile,miSearchTypePartiallyWithin);
ftrs.Common(usaLayer.SearchWithinDistance(newJersey,500,miUnitMile,miSearchTypePartiallyWithin));
usaLayer.Selection.Replace(ftrs);
//选中
end;
六.从数据库绘制MapX地图
这里提供的是一种更为高效的从数据库绘制MapX地图的方法,我在数据库中建立了如下的数据表:
表名称:
Xunit
ID:
字符串//用于唯一标识各个图元,也可以是数字类型的
NAME:
字符串//图元的名称
X:
浮点数//图元横坐标
Y:
浮点数//图元纵坐标
代码清单:
//aqXUnit是一个TADOQuery,其中SQL语句为“SELECT*FROMXUNIT”。
procedureTfrmMain.DrawLayerFromDB;
oBLayer:
BindLayer;
SearchLayer:
Layer;
ds:
Dataset;
//使用这个过程必须保证aqXUnit表已经打开!
ifnotaqXUnit.Activethen
GiveMsg('
系统基础表没有打开!
'
);
//调用自定义提示方法
exit;
=coBindLayer.Create;
oBLayer.LayerName:
ARTEMIS'
oBLayer.LayerType:
=miBindLayerTypeXY;
//必须使用这个参数才能绑定XY坐标
oBLayer.RefColumn1:
X'
//第一个参数必须指定为横坐标
oBLayer.RefColumn2:
Y'
//纵坐标
//添加数据集
=mapMain.Datasets.Add(12,//数据集类型,这是miDataSetADO,即ADO专用的
aqXUnit.Recordset,//使用这个方法获得ADO中的_Recordset类型
'
DS_SK'
//数据集名称
ID'
//传入的是Xunit表中的字段ID的名称
EmptyParam,
oBLayer,//BindLayer
EmptyParam);
//下边将设置新图层的各项属性
searchLayer:
=mapMain.Layers.Item('
//字体颜色
searchLayer.LabelProperties.Style.TextFontColor:
=miColorPurple;
searchLayer.LabelProperties.Style.TextFontHalo:
=true;
searchLayer.LabelProperties.Style.TextFontBackColor:
=miColorWhite;
//设置图元显示的标签
searchLayer.LabelProperties.Dataset:
=ds;
searchLayer.LabelProperties.DataField:
=ds.Fields.Item('
NAME'
searchLayer.LabelProperties.LabelZoom:
//设置图层缩放比例范围
searchLayer.ZoomMin:
=0;
searchLayer.ZoomMax:
=200;
searchLayer.ZoomLayer:
//设置标签缩放比例范围
searchLayer.LabelProperties.LabelZoomMin:
searchLayer.LabelProperties.LabelZoomMax:
//自动标记图元
searchLayer.AutoLabel:
七.MapX使用数据库数据添加专题图
OBJECT.Add([Type],[Field],[Name],[ComputeTheme])
OBJECTRepresentsaThemesobject.
TypeSpecifiesthetypeofthematicmaptocreate.ThistakesaThemeTypeConstantsvalue.Thisisanoptionalparameter,andifnotspecified(orspecifiedasmiThemeAuto),MapXwillattempttochooseagooddefaultbasedonthenumberoffieldspassedinaswellaswhatotherthemetypesarealreadybeingdisplayed.IfMapXcannotchooseadefaultthemetype,anerrorisgenerated.
Field(s)Specifiesthefieldorfieldstothematicallymap.Afieldcanbespecifiedbyname,index,orbyaFieldobject.Ifyouarecreatingathemeusingmultiplevariables(suchasabarchartorpiechart),passinaFieldscollectionoranarrayoffieldnames,indexes,orFieldobjects.Thisisanoptionalparameter,andifnotspecified,MapXusesthefirstnumericfieldoftheDataset.
NameSpecifiesthenameofthethematicmap.ThisisaStringparameter.Thisisanoptionalparameter,andifnotspecified,MapXgeneratesanamesuchasStatesBySales.
ComputeThemeBoolean.ThedefaultvalueisTruewhichwillcalculatethethemefromthetabledata.IfthevalueissettoFalseaninvisiblethemeobjectwillbecreatedwith10rangesforIndividualValuethemesand5rangesforRangedthemes.YoucanthenmanuallysettheminimumandmaximumvaluestodefinethethemewithTheme.DataMinandTheme.DataMax.Forrangedthemesyoucanmanuallysetthethemerangesorcalculateequalsizerangesdeterminedbytheminimum(Theme.DataMin)andmaximum(Theme.DataMax)values.
关于专题图的风格共有以下几种:
miThemeRanged=0
miThemeBarChart=1
miThemePieChart=2
miThemeGradSymbol=3
miThemeDotDensity=4
miThemeIndividualValue=5
miThemeAuto=6
miThemeNone=9
下面是我写的部分代码:
unitMain;
interface
uses
Windows,Messages,{略去一部分}SysUtils,Variants,Classes;
type
TfrmMain=class(TForm)
mapMain:
TMap;
{地图控件}
private
{Privatedeclarations}
ThemesList:
TStringList;
{用来保存多个专题图的名称列表}
public
{Publicdeclarations}
procedureToAddThemes(style:
integer;
TheName:
string);
{添加专题图}
procedureToDeleteThemes;
{删除专题图}
frmMain:
TfrmMain;
implementation
{$R*.dfm}
{略去其他功能代码}
{
添加专题图,参数style表示专题图风格,TheName表示图例标题
}
procedureTfrmMain.ToAddThemes(style:
functionDefaultName:
string;
{用来生成一唯一的名称}
{我用的方法是取一个当前时间,两次调用本函数的时间间隔应该不会少于0.5秒,
所以这个方法在这个项目中可以取得唯一的名称}
Result:
YYT'
+FormatDateTime('
YYYYMMDDHHNNSSzzz'
now);
flds:
arrayofstring;
{字段列表}
{绑定图层}
{MapX数据集}
i:
{循环变量}
thm:
theme;
{MapX专题图}
str:
{用于保存字符串}
{aqThemes可以是一个ADOQuery或者ADOTable,我使用的是ADOQuery。
在这个ADOQuery中前四个字段分别是:
ID(唯一的数字或者字符串,一般为编号),
NAME(字符串,要素的标签),
X(浮点数,要素的经度或者横坐标),
Y(浮点数,要素的纬度或者纵坐标)。
后面的其它字段都是数字类型,用来表示相关的数据。
}
ifnotaqThemes.Activethen
dmData.GiveMsg('
try
{取一个唯一的名字,}
=DefaultName;
{设置绑定图层的属性}
progress.StepPlus
(2);
=str;
=mapMain.Datasets.Add(12,
aqThemes.Recordset,
str,
oBLayer,
EmptyParam);
{组织专题图现实的数据字段,存储在字符串数组中}
SetLength(flds,aqThemes.Fields.Count-3);
fori:
=3toaqThemes.Fields.Count-1do
flds[i-3]:
=aqThemes.Fields.Fields[i].FieldName;
{实际添加专题图的过程}
=ds.Themes.Add(style,flds,DefaultName,EmptyParam);
{设置专题图图例标题}
thm.Legend.Title:
=TheName;
{记录新添加的专题图名称}
ThemesList.Add(str);
{btnDeleteThemes是一个在本窗口上的按钮,用来删除专题图,
添加专题图后就将他显示出来,如果删除了全部专题图就将他隐藏}
btnDeleteThemes.Visible:
except
创建专题图失败!
{自定义过程,给出出错提示}
删除专题图,我采用的方法是删除所有专题图
procedureTfrmMain.ToDeleteThemes;
=0toThemesList.Count-1do{循环所有添加了的专题图}
{删除数据集}
mapMain.Datasets.Remove(ThemesList.Strings[i]);
{删除专题图}
mapMain.Layers.Remove(ThemesList.Strings[i]);
{如果只想删除某一个专题图,不用循环就行了}
{此时已经没有专题图了,将删除专题图按钮隐藏}
=false;
{清除专题图名称列表}
ThemesList.Clear;
//...
end.
八.在mapx中画圆
Style:
CMapXStyle;
f:
CMapXFeature;
Point;
Map1.ControlInterface.Layers.CreateLayer('
temp'
emptyparam,1,emptyparam,emptyparam);
Style:
=Map1.DefaultStyle.Clone;
Style.RegionPattern:
=miPatternNoFill;
Style.RegionColor:
=255;
Style.RegionBorderColor:
=125;
Style.RegionBorderWidth:
=2;
Style.RegionBorderStyle:
=1;
=CoPoint.Create;
pt.Set_(122.8,40.8);
map1.Zoom:
=0.5;
map1.CenterX:
=pt.X;
map1.CenterY:
=pt.Y;
f:
=Map1.Feature
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- delphi 操作 mapx 部分 技巧