华夏土地

查看完整版本: supermap常用功能问题

black560 2006-6-27 14:03

supermap常用功能问题

  基本地图操作
电子地图的GIS系统开发方式(基本)
用户手册
图层控制
如何更改图层控制中图层名列的显示结果?
地图控件
指定地图服务器
       能否动态调整地图控件的大小?
       MapControl名字不为MapControl1则页面里有错误?
       为什么在文件夹里新建页面加mapcontrol会提示错误
鹰眼
为什么鹰眼图上显示“地图超出显示范围”?
       怎么地图控件与鹰眼用不同地图?
打印
如何让地图打印时不显示比例尺?
       为什么打印地图只能打印默认的?
查询
查询到的对象怎么都变红了,很不好看?
       怎样指定SQL查询的图层和返回指定字段?
       如何让demo的查询结果显示在弹出窗口?
       如何让demo弹出查询结果也能点击定位?
       如何做查询结果的datagrid绑定(有些有分页显示功能)
       为什么设置查询返回某字段就查不到结果?
       如何实现鼠标点击或移动到某个对象,则显示该对象的相关信息?
缓冲查询
当BufQuery.FromCustomGeo = true时,如何设置BufferPar
专题图
有没有专题图的示例程序?
       为什么在程序里设置了专题图,图例里没有更新?
       统计专题图?
路径分析
怎样准备路径分析数据?
       如何通过地名进行网络路径分析?
公交换乘
怎样准备公交换乘的数据?
       经纬度数据如何做公交换乘?
自定义鼠标事件
什么是自定义鼠标事件,为什么要有自定义鼠标事件?
       自定义鼠标事件代码解析。
       如何设置自定义鼠标事件操作时的光标?
       如何在查询结束后把鼠标事件切换回空状态?
引擎开发
是否有引擎开发示例?
Web Service
怎样查看Web Service提供的功能?
       怎样使用Web Service提供的功能?
       怎样用C#调用Web Service出图?
       怎样实现完整的地图操作功能?
       如何用web service实现路径分析功能?
TcpMap
简单调用

black560 2006-6-27 14:04

基本地图操作
问:电子地图的GIS系统开发方式(基本)
答:需要用我们的deskpro和IS
方式大体如下。数据准备和维护,可以用deskpro做数据的倒入和编辑,可倒入和数据格式很多,基本上现在有格式都能倒成我们的数据格式。转为我们的格式后就可以用IS做发布了。
安装IS,在IS配置里设置要发布的转好的数据文件,启动IS,用IS自带的模板就可以看到发布的结果了。模板里有一些常用的IS功能集成,想要做进一步的开发,可以在模板上改也可以完全自己开发。
开发方式有两种,Web Control和Web Service。我们建议用Web Control的开发方式。
Web Control开发,就是用.net 在页面里加一个我们做好的地图控件等一些控件,然后调用这些控件的方法来实现相应的功能。如:MapControl.ViewEntire()可以全幅显示地图。MapControl.QueryBySQL()可以做一个SQL查询,开发十分方便。

black560 2006-6-27 14:04

图层控制
问:如何更改图层控制中图层名列的显示结果?
答:LayerControl控件提供了GetLayerItemByIndex和GetLayerItemByValue两个方法来获取图层对象,返回LayerItem。
LayerItem对象开放了Caption属性,用于设置图层显示在LayerControl中的图层名称,默认值是地图中设置的图层名。

black560 2006-6-27 14:04

地图控件
问:指定地图服务器
答:在web.config的appSettings节点下加如下节点
Code:
<add key="MapServer_Enforce" value="true" />
<add key="MapServer_Port" value="8800" />
<add key="MapServer_Address" value="demo" />
问:能否动态调整地图控件的大小?
答:可以在页面里放一个按钮,事件里写
MapControl1.Width = System.Web.UI.WebControls.Unit.Pixel(800);
MapControl1.Height = System.Web.UI.WebControls.Unit.Pixel(600);
MapControl1.Update();
即可
问:MapControl名字不为MapControl1则页面里有错误?
答:改
SMISMapControlIE.js
function SMISMapSetPosition(mapID)
这个函数里面的 _MapControl1_MVIMAGE 都替换成 map
问:为什么在文件夹里新建页面加mapcontrol会提示错误
答:原因
mapcontrol现在不会在文件夹里建图片和角本.
解决
1.不在文件夹里新建页面,而在根目录里建.
2.把在其它有mapcontrol的工程里,把images和script文件夹copy到现有的文件夹里.这样虽然加mapcontrol还是会出错,但不影响使用.
注:这个问题同样出现在建一个企业级模板项目里,问题和解决方法同上.

black560 2006-6-27 14:05

鹰眼
问:为什么鹰眼图上显示“地图超出显示范围”?
答:请用如下几个步骤解决问题:
1、Ctrl+F5刷新页面,确认不是用的页面缓存;
2、确认工作空间里有地图并且地图中有图层;
3、停止IS.Net的服务,对数据源里的数据集重新计算空间范围和重建空间索引。
问:怎么地图控件与鹰眼用不同地图?
答:添加事件
Code:
private void OverviewControl1_PreRender(object sender, System.EventArgs e)
{
      OverviewControl1.MapName = "map3";
      OverviewControl1.Update();       
}

black560 2006-6-27 14:05

打印
问:如何让地图打印时不显示比例尺?
答:对地图打印页做如修改
Code:
      <HEAD>
             <title>打印地图</title>
             <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
             <meta name="CODE_LANGUAGE" Content="C#">
             <meta name="vs_defaultClientScript" content="JavaScript">
             <meta name="vs_targetSchema" content="<a href='[url]http://schemas.microsoft.com/intellisense/ie5[/url]' target=_blank>[url]http://schemas.microsoft.com/intellisense/ie5</a>[/url]">
             <script>
             function hidescale()
             {
                    document.all.lblMapScale.style.visibility="hidden";
             }
             </script>
      </HEAD>
      <body MS_POSITIONING="GridLayout" onload="hidescale()">
问:为什么打印地图只能打印默认的?
答:改打印地图事件
SMISPrintMap('MapControl1','Demo','print.aspx')
为 SMISPrintMap('MapControl1','AspxDemo.Demo','print.aspx')
问题可以解决

black560 2006-6-27 14:05

查询
问:查询到的对象怎么都变红了,很不好看?
答:QueryParam.Highlight 字段是设置查询结果是否高亮显示的,这个设置为false就不会高亮显示结果也就不会变红了。如果是在demo机器,这个参数可以在mapcontrol的querying事件里设置。另外,首以高亮变蓝,只是一种风格,可以在ismanager里修改这个高亮的风格。
问:怎样指定SQL查询的图层和返回指定字段?
答:
Code:
//using SuperMap.IS.Utility;
//using System.Text;
//要显示标签的图层列表
String[] arrLayers = new String[1];
//格式为"图层名:字段名1;字段名2;字段名3;...."
arrLayers[0] = "Company_P@nijl_map2:SmID;SmUserID";
//设置查询图层参数
QueryLayer[] queryLayers = new QueryLayer[arrLayers.Length];
for(int i=0;i<arrLayers.Length;i++)
{
      //把图层名和要返回的字段分开
      String[] arrLayer = arrLayers[i].Split(':');
      queryLayers[i] = new QueryLayer();
      queryLayers[i].Name = arrLayer[0];
      queryLayers[i].ReturnFields = arrLayer[1].Split(';');
      queryLayers[i].WhereClause = "SmID<=4";
      queryLayers[i].SortClause = "Order By SmUserID";
}
//设置SQL查询参数
QueryParam queryParam = new QueryParam();
queryParam.ExpectCount = 1000;//返回所有对象
queryParam.HasGeometry = true;//返回空间信息以定位
queryParam.Highlight = false;//不高亮.因为是正常显示地图
queryParam.IsAllLayer = false;//不是查所有层
queryParam.Layers = queryLayers;//设置要查询的图层
//得到查询结果
ResultSet RS = MapControl1.QueryBySQL(queryParam);
int temptodebug = 0;
问:如何让demo的查询结果显示在弹出窗口?
答:demo已经实现了这个功能,只是没有打开,请查找ShowQueryResult函数,里面有bool showInNewWindow = false;变量将它改为bool showInNewWindow = true;就可以查询结果在弹出新窗口里显示了。
问:如何让demo弹出查询结果也能点击定位?
答: 改for(int k=0;k<valueCount;k++)循环里的语句为
strQueryResult += string.Format("<td onclick=window.opener.openerposition(\"{1}\",\"{2}\")>{0}</td>",curRecord.FieldValues[k],curRecord.Center.X,curRecord.Center.Y);
这样点击td时就会调用demo.aspx页里有openerposition函数并把定位点的x,y坐标传了过去。
再demo.aspx里定义openerposition函数如下:
Code:
function openerposition(x,y)
{
      document.all.openerposition.innerHTML = "<input type=hidden name=Result_X value="+x+"><input type=hidden name=Result_Y value="+y+">";
      MapControl1_DoPostBack();
}
在demo.aspx里添加<div id=openerposition></div>
问:如何做查询结果的datagrid绑定(有些有分页显示功能)
答: 查询距离指定点一定范围内对象并把查询结果绑定在datagrid上,点击结果可以定位
isnet5_querybydistance.rar
点击对象并把查询结果绑定在datagrid上,点击结果可以定位
isnet5_querybypoint.rar
圆选查询结果绑定在datagrid上,点击结果可以定位
isnet5_querybycircle.rar
三个示例用到了自定义鼠标事件关于自定义鼠标事件可以参考
[url]http://www.bjlu.com/read.php?tid=305&fpage=1[/url]
sql查询结果绑定在datagrid上
isnet5_sqlbind.rar
sql查询结果绑定在datagrid上,分页显示结果
isnet5_querybycirclesplitpage.rar
问:为什么设置查询返回某字段就查不到结果?
答:如果设置返回的字段不是正确的字段名,就会查不到结果。这个字段名设置是区分大小写的,而且要用属性表结构里的字段名,不能用别名。
问:如何实现鼠标点击或移动到某个对象,则显示该对象的相关信息?
答:Q:如何实现鼠标点击或移动到某个对象,则显示该对象的相关信息
A:如果要显示信息的点不是很多,可以在地图加载时把这个点位置查到放在自定义层上,写好鼠标移动到上面的的事件,如果点很多,只能鼠标点击时在点击位置做一下查询.把查询到的信息在要显示的地方显示.
Q:信息点不是很多.想用第一种方法,思路明白,不知道具体怎么做.
A:您使用我们的IS开发不一定要对IS本身有多了解,只要知道实现一个功能需要用什么方法就可以了,和做其它面向对象的开发没什么区别的.思路您都清楚了,具体实现需要用到的方法如下.
在地图切换事件里"MapControl.MapSwitched 事件 地图切换触发事件。"
做一个需要显示信息的点的查询"MapControl.QueryBySQL
方法,sql查询".在查询返回的结果集里ResultSet取到ResultSet.Recordsets[layerindex].Record[recordindex].Center 得到各点的位置
再把这些点位置放在customlayer上.方法是"CustomLayer.Divs 字段 自定义显示层的集合 "的add方法.
这些方法的参数用法在IS的帮助里可以查到.

black560 2006-6-27 14:06

缓冲查询
问:当BufQuery.FromCustomGeo = true时,如何设置BufferPar
答:
Code:
SuperMap.IS.Utility.BufferParam BufQuery = new SuperMap.IS.Utility.BufferParam();
                    BufQuery.Distance = 50.00; //设置缓冲半径
                    BufQuery.Smoothness = 12;   //设置缓冲平滑度
                    BufQuery.FromCustomGeo = true; //不使用自定义的几何对象作缓冲区域
                    SuperMap.IS.Utility.Geometry[] geometries = new SuperMap.IS.Utility.Geometry[1];
                    geometries[0] = new SuperMap.IS.Utility.Geometry();
                    geometries[0].ID = 0;
                    geometries[0].Parts = new int[1];
                    geometries[0].Parts[0] = 1;
                    geometries[0].Feature = SuperMap.IS.Utility.FeatureType.Point;
                    geometries[0].Points = new SuperMap.IS.Utility.MapCoord[1];
                    geometries[0].Points[0] = new SuperMap.IS.Utility.MapCoord(MapControl1.CenterPoint.X ,MapControl1.CenterPoint.Y);
                    BufQuery.Geometries = geometries;
                    BufQuery.TargetLayer = "ResidentialArea@changchun"; //设置查询图层(对居民区图层进行查询)
                    BufQuery.ReturnFields = new string[2];
                    BufQuery.ReturnFields[0] = "SMID";  //设置返回结果字段
                    BufQuery.ReturnFields[1] = "Name";  //设置返回结果字段
                    BufQuery.QueryMode = SuperMap.IS.Utility.SpatialQueryMode.AreaIntersect ; //设置空间关系模式——部分包含或者全部包含
                    BufQuery.Highlight = true;  //设置对查询的结果在地图上高亮显示
                    SuperMap.IS.Utility.ResultSet rs = MapControl1.SpatialAnalystOperator.BufferQuery (BufQuery); //执行缓冲区查询分析,获取结果
                    DataSet ds ;
                    if( rs.TotalCount != 0 ) {
                           ds = rs.ToDataSet();
                           DataGrid1.DataSource = ds; //将结果显示在datagrid中
                           DataGrid1.DataBind();
                    }

black560 2006-6-27 14:06

专题图
问:有没有专题图的示例程序?
答:IS帮助文档里有一个做标签专题图的示例程序。
另外,IS安装后的aspxdemo程序里有一个index.aspx页在工程里是隐藏的,添加这个页到工程里,这个页是一个IS功能的测试页,里面有比较全专题图制做代码。
问:为什么在程序里设置了专题图,图例里没有更新?
答:需要添加下面代码更新图例。
this.LegendControl1.Layers[0] = this.MapControl1.Layers[0];
this.LegendControl1.Update();
结果如图:
分段专题图数据,程序,截图。
有图例更新功能。
is5_rangetheme.rar
问:统计专题图?
答:生成效果
示例程序
is5_themegraph.rar

black560 2006-6-27 14:06

路径分析
问:怎样准备路径分析数据?
答:1.在SuperMap Deskpro上创建数据源,导入已有其他格式的道路数据,或者新建线数据集,在其中数字化道路数据;
2.使用菜单“数据集-〉线数据集拓扑处理”功能,生成路径分析需要的网络数据集。
详细请查看deskpro帮助里的“线数据集拓扑处理”。
问:如何通过地名进行网络路径分析?
答:都要先实现,找到地名边最近的网络节点,方法有两个:
1、先找到地图位置信息,对那个位置做一个querybypoint,得到附近的网络节点,选出最近节点,或让用户选节点做网络分析。
2、事先查到需要做这种分析的地名,找到附近最近的节点,把对应关系写到数据库里,需要时直接从数据库里查询得到,这种方式因为没有做空间分析,所以比上种方式快一些,但事先需要做准备工作。

black560 2006-6-27 14:07

公交换乘
问:怎样准备公交换乘的数据?
答:请参考简单数据
bus_network.rar
建模工具在“IS.Net安装目录\Extras\BusNetworkManager”,详细说明文档在“
IS.Net安装目录\Documents\BusLineSolution.pdf”。如果没有请运行IS安装程序,添加选项。
问:经纬度数据如何做公交换乘?
答:一般由于公交换乘都是城市内的,所以很多是用平面坐标系的,如果用经纬度坐标系。对建模工具代码做修改,以2003数据为例
Property DistanceTolerance As Double
Member of SMISBusNetwork.soParams
距离容限,即在距离容限内的站点认为可以换乘
Private Sub mnuBusModel_Click()
If ChoiceDlg.mResult = True Then
  '下面加上对容限的设置,这个容限需要根据具体情况设定
  sysParams.DistanceTolerance = 0.001

black560 2006-6-27 14:07

自定义鼠标事件
问:什么是自定义鼠标事件,为什么要有自定义鼠标事件?
答:IS的DEMO提供了拉框查询,画线做路径分析、点击加点等功能。这些功能相同之处是都要先设置一个客户端的鼠标状态,当用户在地图上做相应的鼠标操作,地图引擎就会对这些操作做处理。如MapContorl的Querying事件,就可以对鼠标在地图上做点选、框选、圆选等查询事件做处理。
虽然IS定义好了很多的客户端事件,可以实现相应功能,但用户可能需要对地图操作时有更多的处理方法,如果只是用IS定义好的事件显然是不够的。这就需要用户可以自定义鼠标事件,来实现自己想要的功能。
问:自定义鼠标事件代码解析。
答:请下载代码:
demo_useraction.rar,加到.net工程里。
Code:
             private void useraction_Init(object sender, System.EventArgs e)
             {
                    Action AddLineAction = new Action("AddLine",Action.DefinedModel.DrawLines);
                    AddLineAction.ActionEvent += new Action.ActionEventHandler(AddLineAction_ActionEvent);
                    this.MapControl1.Actions.Add(AddLineAction);
             }
private void btnSetAction_Click(object sender, System.EventArgs e)
             {
                    MapControl1.ClientAction = "AddLine";
             }
private void AddLineAction_ActionEvent(object sender, ActionEventArgs e)
             {
                    TextBox1.Text = e.ActionParams;
             }
说明如下:
useraction_Init函数是窗体初始化代码。
Action AddLineAction = new Action("AddLine",Action.DefinedModel.DrawLines);
创建一个对象,名字标识为AddLine,要在地图上操作事件为DrawLines画线。
AddLineAction.ActionEvent += new Action.ActionEventHandler(AddLineAction_ActionEvent);
设置事件结束后执行AddLineAction_ActionEvent函数;
this.MapControl1.Actions.Add(AddLineAction);
地图控件添加这个事件。
AddLineAction_ActionEvent(object sender, ActionEventArgs e)
这个函数就是用户画线后执行的事件,其中的e是一个ActionEventArgs类型的,保存了鼠标操作的信息。
如TextBox1.Text = e.ActionParams;
让文本框里显示画线的各点位置。
设置客户端操作为AddLine,
private void btnSetAction_Click(object sender, System.EventArgs e)
{
     MapControl1.ClientAction = "AddLine";
}
代码执行结果是点按钮后,在地图上点击就可以画线,双击鼠标结束画线,在TextBox1里就会显示鼠标点击的位置信息了。
问:如何设置自定义鼠标事件操作时的光标?
答:定义Action有一个属性Action.MapCursorUrl,属性说明如下:该动作为 MapControl 的当前动作时,MapControl 上自定义光标的 URL 地址。
问:如何在查询结束后把鼠标事件切换回空状态?
答:在事件处理函数后加上
MapControl1.ClientAction = null;

black560 2006-6-27 14:07

引擎开发
问:是否有引擎开发示例?
答:在“IS安装目录\Demo\CustomEngine”目录中,有一个矢量数据下载功能的引擎扩展示例。

black560 2006-6-27 14:08

Web Service
问:怎样查看Web Service提供的功能?
答:IS .net 5安装后会在IIS里建一个虚拟目录WebService_v50,这个就是IS提供的Web Service服务。里面的*.asmx就是提供服务的页面。
直接访问这些页面可以查看他们提供的接口。以MapService.asmx地图服务为例,访问:[url]http://localhost/WebService_v50/MapService.asmx[/url]
可以看到接口列表,里面有提供的功能说明。如:
GetMapImage
根据地图参数取得地图图片
点击GetMapImage可进入详细的说明:
[url]http://localhost/WebService_v50/MapService.asmx?op=GetMapImage[/url]
里面有需要的参数和返回的参数。
问:怎样使用Web Service提供的功能?
答:继续用“怎样用C#调用Web Service出图?”里的示例程序做说明。
在程序的“MapImage mapImage = this.mapService.GetMapImage(mapParam);”下面加断点,跟踪mapImage,可以看到返回的结果里有服务里描述的ReturnMapParam属性,里面有地图信息,地图名,中心点坐标,地图图片大小,地图范围,显示区域等,图层信息等。跟踪结果如下图:
简单的说Web Service开发,先在功能列表里找到需要的功能,再按功能描述提交相应的参数,Web Service实现提交的功能,并按描述返回需要返回参数。
问:怎样用C#调用Web Service出图?
答:新建C#工程,这里新建了一个Web工程。
在工程里点鼠标右键,添加Web引用
查找引用地址如:
[url]http://localhost/WebService_v50/MapService.asmx[/url]
为引用起名,可任意,如:nijl
引用添加成功,添加一个Web Form
如:GetMapImage.aspx
在Web Form上添加两个Web控件,一个按钮,一个Image
添加页面代码,
Code:
using t501w.nijl;
private void Button1_Click(object sender, System.EventArgs e)
{
      //using t501w.nijl;
      // 地图参数
      MapParam mapParam = new MapParam();
      // 生成图片
      mapParam.ReturnImage = true;
      // 地图名称
      mapParam.MapName = "changchun";
      // 地图出图大小
      mapParam.Viewer = new PixelRect();
      mapParam.Viewer.LeftTop = new PixelCoord();
      mapParam.Viewer.RightBottom = new PixelCoord();
      mapParam.Viewer.LeftTop.X = 0;
      mapParam.Viewer.LeftTop.Y = 0;
      mapParam.Viewer.RightBottom.X = 400;
      mapParam.Viewer.RightBottom.Y = 300;
MapImage mapImage = this.mapService.GetMapImage(mapParam);
      Image1.ImageUrl = mapImage.MapUrl;
}
按F5运行程序,点按钮显示图片
代码下载
is5_ws_simple.rar
问:怎样实现完整的地图操作功能?
答:以一个有平移和全幅功能的示例程序说明,在
is5_ws_simple.rar
里添加
is5_ws_action.rar
页面,可实现实现平移和全幅功能。
代码说明:
用session保存地图的提交参数
Code:
private MapParam mapParam
{
      get
      {
             return (MapParam)Session["mp"];
      }
      set
      {
             Session["mp"] = value;
      }
}
页面第一次加载,显示工作空间里的第一幅地图,默认的地图范围。
Code:
private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
      this.mapService = new nijl.MapService();
      if(!Page.IsPostBack)
      {
             this.mapParam = new MapParam();
mapParam.Viewer = new PixelRect();
             mapParam.Viewer.LeftTop = new PixelCoord();
             mapParam.Viewer.RightBottom = new PixelCoord();
             mapParam.Viewer.LeftTop.X = 0;
             mapParam.Viewer.LeftTop.Y = 0;
             mapParam.Viewer.RightBottom.X = Convert.ToInt32(Image1.Width.Value);
             mapParam.Viewer.RightBottom.Y = Convert.ToInt32(Image1.Height.Value);
string[] maplist = mapService.GetMapList();
// 生成图片
             mapParam.ReturnImage = true;
             // 地图名称
             mapParam.MapName = maplist[0];
MapImage mapImage = this.mapService.GetMapImage(mapParam);
             Image1.ImageUrl = mapImage.MapUrl;       
             //保存地图参数
             this.mapParam = mapImage.ReturnMapParam;
      }
}
点移动按钮,移动地图,并再次保存返回后地图,
Code:
private void ButtonLeft_Click(object sender, System.EventArgs e)
{
      MapImage mapImage = this.mapService.Pan((int)-100,(int)0,this.mapParam);
      Image1.ImageUrl = mapImage.MapUrl;
      //保存地图参数
      this.mapParam = mapImage.ReturnMapParam;
}
全幅功能同上。
其中全幅函数有两个参数,第一个参数可以指定以某个层全幅,为空则地图全幅。

black560 2006-6-27 14:09

TcpMap
问:简单调用
答:
Code:
//添加引用
//using SuperMap.IS.Web ;
//using SuperMap.IS.Utility;
string mapServer = "localhost";
int port = 8800;
string mapName = string.Empty;
Linker linker = ClientAppBalancer.Instance.ConnectRemoteService(RemotingProtocol.TCP,mapServer,port, mapName);
MapFactory mapFactory = MapFactory.Instance;
mapFactory.AppServerLinker = linker;
TcpMap tcpMap = mapFactory.CreateTcpMap();
//注意想要做其它tcpMap操作,现在需要先做一次GetDefaultMapImage
MapImage mi = tcpMap.GetDefaultMapImage(mapName,200,200);

geotime 2006-6-27 17:02

SUPERMAP哪有下载啊?

55555555 2006-6-30 21:50

太专业,谢谢

xszz 2006-10-17 15:17

学习,学习,再学习!

dwg1984 2007-5-28 00:19

没有狗  怎么用啊
页: [1]
查看完整版本: supermap常用功能问题