发表用户:netslihh
收集整理:James.Liu
相关讨论:http://www.mygis.com.cn/forum/dispbbs.asp?boardID=11&ID=766
信息原始来源:不祥

文章标题:MapXtreme for Java中自定义符号

我目前想用这种方法:
将自定义的符号*.bmp保存到C:\Documents and Settings\Administrator\Application Data\MapInfo\MapInfo\Professional\700\CustSymb即可在pro中使用,如果要在xtreme for java 中使用该符号,要首先将该bmp格式的图标转换为gif格式,然后在xtreme for java安装根目录\MapInfo\tomcat-4.0.1\mxj450\webapps\mapxtreme45\resources中新建一文件夹,用文本编辑器写没有扩展名的文件,内容为:
<?xml version="1.0" encoding="UTF-8"?>
<NamedResource>
<ResourceDTD>
MI_XML_Protocol_MapCommonElements_4_0.dtd
</ResourceDTD>
<ResourceXML>
<Style>
<rendition>
<style symbol-mode="image">
<image href="file:///D:\\Program Files\\MapInfo\\book.gif"/>
</style>
</rendition>
</Style>
</ResourceXML>
</NamedResource>
其中的D:\\Program Files\\MapInfo\\book.gif为图标的保存路径。
然后在地图定义管理器中将选择图层的显示样式定位到给文件即可。
也可以在程序中控制,代码如下:
com.mapinfo.dp.Rendition rend = new com.mapinfo.dp.Rendition();
                          rend.setvalue(Rendition.SYMBOL_MODE, Rendition.SymbolMode.IMAGE);
                          String gifUrl = "file:///D:\\Program Files\\MapInfo\\book.gif";
                          rend.setvalue(Rendition.SYMBOL_URL, gifUrl);
                          rend.setvalue(Rendition.SYMBOL_SIZE, new com.mapinfo.unit.Size(15));
                          selTheme.setRendition(rend);
                          annLayer.getThemeList().add(selTheme);
我目前尝试的这两种方法有一个差别,在地图定义管理器中不能设置自定义符号的大小,无论我设置的大小是什么,都为原始大小,但是如果在程序中可以用rend.setvalue(Rendition.SYMBOL_SIZE, new com.mapinfo.unit.Size(15))控制大小。

不知道我这种使用自定义符号的方法正不正确,有没有什么缺点,有什么更好的方法,请有过这方面经验的高手指点一下,在xtreme for java 中使用自定义符号的问题已经困扰我好久了。

James评论:

如果在代码中进行符号的控制会更灵活一些,用代码在程序初始化是添加图层,同时设置图层中图元的显示样式。如下例子动态添加一张ORACLE中保存的空间图层,并设定图上图元显示样式。

//Add by James ,2003/6/17 ,add point to Oracle Layer
public void DrawPointsEx(MapJ map, DoublePoint point, String LayerName)
{
try
{
Layer oraLayer = map.getLayers().getLayer(LayerName);
if(oraLayer == null)
{

String mapXtremeURL = "http://liuyi:5050/mapxtreme40/servlet/mapxtreme";
java.util.Properties connectionProps = new java.util.Properties();
OraSoDataProviderHelper oraDPH = new OraSoDataProviderHelper("liuyi", 1521,"oracle8i","demo","demo",DriverType.thick);
//OraSoDataProviderHelper oraDPH = new OraSoDataProviderHelper("jdbc:mipool:map",null,null);
String[] idColumn = {"MI_PRINX"};
OraSoTableDescHelper oraSoTDHelper = new OraSoTableDescHelper(LayerName,false,idColumn,"GEOLOC","MI_SYMBOLOGY",com.mapinfo.dp.RenditionType.mapbasic ,null,com.mapinfo.dp.RenditionType.none,null,2,"DEMO");

MapXtremeDataProviderRef mxtDPRef = new MapXtremeDataProviderRef(oraDPH, mapXtremeURL);
//map.getLayers().add(mxtDPRef, oraDPH, "OraSoLayer");
oraLayer = map.getLayers().insert(mxtDPRef, oraSoTDHelper,0, LayerName);
}
Feature retFeature = CreatePointFeature(map, point,LayerName);
PrimaryKey primarykey = oraLayer.addFeature(retFeature);
Rendition rend = new RenditionImpl();
AffineTransform transform = new AffineTransform();
transform.rotate(StrictMath.toRadians(0));
rend.setValue(com.mapinfo.graphics.Rendition.SYMBOL_MODE, com.mapinfo.graphics.Rendition.SymbolMode.IMAGE);
rend.setValue(com.mapinfo.graphics.Rendition.SYMBOL_URL, GetImageURL());
rend.setValue(com.mapinfo.graphics.Rendition.SYMBOL_TRANSFORM, transform);
AddOverrideTheme(map,LayerName,rend);
}
catch(Exception exception) { }
}

//add by James 2003/6/17,use gif picture to override the layer symbol
public void AddOverrideTheme(MapJ map,String LayerName,Rendition rend)
{
Layer olayer = map.getLayers().getLayer(LayerName);
if (olayer!= null ){
OverrideTheme ovrt = new OverrideTheme(rend,"override theme");
olayer.getThemeList().add(ovrt) ;
}
}