为了实现在地图上手动画线的功能,煞费了一翻苦心,不过最后实现的方法还是很简单的,只是这个过程复杂了点。所以只有找对了方法才能事半功倍。
当时我的第一反应就是去百度上搜索,但网上关于MapXtreme的资料本来就少,几乎没有找到任何与此相关的。于是只能自己动手,丰衣足食。最开始的想法是,通过JavaScript在客户端画线,把点的坐标传回到服务器端进行处理。于是颇费了一番周折,在网上搜到一些画线的js代码,自己作了一些修改,达到想要的效果。但毕竟对js不熟,接下来就遇到问题了,要控制只能在地图上画线,并且把这些点的数据传回服务器端,还要在服务器端把这些点都提取出来,感觉是非常麻烦的。
在我一愁莫展的时刻,一位朋友为我指明了出路。MapXtreme测距工具在客户端的实现基本上和画线是一样的,并具也要将点传回服务器端进行距离的计算,我怎么没想到时呢,真是一语惊醒梦中人啊!
下面说明一下实现的过程:
(1)首先在后台代码中加入自定义的服务器端命令的类Line。代码如下:
复制内容到剪贴板
代码:
[Serializable]
public class Line : MapInfo.WebControls.MapBaseCommand
{
public Line()
{
Name = "Line";
}
public override void Process()
{
MapControlModel model = MapControlModel.GetModelFromSession();
model.SetMapSize(MapAlias, MapWidth, MapHeight);
//extract points from url of client side.
System.Drawing.Point[] points = ExtractPoints(DataString);
MapInfo.Mapping.Map map = model.GetMapObj(MapAlias);
MapInfo.Mapping.FeatureLayer workLayer = (MapInfo.Mapping.FeatureLayer)map.Layers["LineLayer"];
MapInfo.Data.Table tblTemp = MapInfo.Engine.Session.Current.Catalog.GetTable("LineLayerTable");
for (int i = 0; i < points.Length - 1; i++)
{
DPoint startPoint;
DPoint endPoint;
map.DisplayTransform.FromDisplay(points[i], out startPoint);
map.DisplayTransform.FromDisplay(points[i + 1], out endPoint);
FeatureGeometry lfg = MultiCurve.CreateLine(workLayer.CoordSys, startPoint, endPoint);
MapInfo.Styles.SimpleLineStyle lstyle = new MapInfo.Styles.SimpleLineStyle(
new MapInfo.Styles.LineWidth(3, MapInfo.Styles.LineWidthUnit.Pixel), 2, System.Drawing.Color.OrangeRed);
MapInfo.Styles.CompositeStyle cstyle = new MapInfo.Styles.CompositeStyle(lstyle);
MapInfo.Data.Feature lft = new MapInfo.Data.Feature(tblTemp.TableInfo.Columns);
lft.Geometry = lfg;
lft.Style = cstyle;
lft["index"] = i;
workLayer.Table.InsertFeature(lft);
}
System.IO.MemoryStream ms = model.GetMap(MapAlias, MapWidth, MapHeight, ExportFormat);
StreamImageToClient(ms);
}
}
(2)在页面加载中添加Line的命令注册。代码如下:
复制内容到剪贴板
代码:
if (Session.IsNewSession)
{
MapControlModel model = MapControlModel.SetDefaultModelInSession();
model.Commands.Add(new Line());
}
(3)在页面上拖放一个自定义控件WebTool,对其样式进行设置,有几个属性需要选择:
复制内容到剪贴板
代码:
ID:LineTool1
ClientCommand:MapCommand
ClientInteraction:PolyineInteraction
Command:Line
这样就实现了手动画线的功能,为什么这么简单呢?因为在交互PolyineInteraction中会获取所有点的坐标(测距工具也是使用PolyineInteraction交互),而MapCommand会把点坐标回传到服务器,只要的服务器端,调用System.Drawing.Point[] points = ExtractPoints(DataString)就可以得到所有点的坐标。
当时我的第一反应就是去百度上搜索,但网上关于MapXtreme的资料本来就少,几乎没有找到任何与此相关的。于是只能自己动手,丰衣足食。最开始的想法是,通过JavaScript在客户端画线,把点的坐标传回到服务器端进行处理。于是颇费了一番周折,在网上搜到一些画线的js代码,自己作了一些修改,达到想要的效果。但毕竟对js不熟,接下来就遇到问题了,要控制只能在地图上画线,并且把这些点的数据传回服务器端,还要在服务器端把这些点都提取出来,感觉是非常麻烦的。
在我一愁莫展的时刻,一位朋友为我指明了出路。MapXtreme测距工具在客户端的实现基本上和画线是一样的,并具也要将点传回服务器端进行距离的计算,我怎么没想到时呢,真是一语惊醒梦中人啊!
下面说明一下实现的过程:
(1)首先在后台代码中加入自定义的服务器端命令的类Line。代码如下:
复制内容到剪贴板
代码:
[Serializable]
public class Line : MapInfo.WebControls.MapBaseCommand
{
public Line()
{
Name = "Line";
}
public override void Process()
{
MapControlModel model = MapControlModel.GetModelFromSession();
model.SetMapSize(MapAlias, MapWidth, MapHeight);
//extract points from url of client side.
System.Drawing.Point[] points = ExtractPoints(DataString);
MapInfo.Mapping.Map map = model.GetMapObj(MapAlias);
MapInfo.Mapping.FeatureLayer workLayer = (MapInfo.Mapping.FeatureLayer)map.Layers["LineLayer"];
MapInfo.Data.Table tblTemp = MapInfo.Engine.Session.Current.Catalog.GetTable("LineLayerTable");
for (int i = 0; i < points.Length - 1; i++)
{
DPoint startPoint;
DPoint endPoint;
map.DisplayTransform.FromDisplay(points[i], out startPoint);
map.DisplayTransform.FromDisplay(points[i + 1], out endPoint);
FeatureGeometry lfg = MultiCurve.CreateLine(workLayer.CoordSys, startPoint, endPoint);
MapInfo.Styles.SimpleLineStyle lstyle = new MapInfo.Styles.SimpleLineStyle(
new MapInfo.Styles.LineWidth(3, MapInfo.Styles.LineWidthUnit.Pixel), 2, System.Drawing.Color.OrangeRed);
MapInfo.Styles.CompositeStyle cstyle = new MapInfo.Styles.CompositeStyle(lstyle);
MapInfo.Data.Feature lft = new MapInfo.Data.Feature(tblTemp.TableInfo.Columns);
lft.Geometry = lfg;
lft.Style = cstyle;
lft["index"] = i;
workLayer.Table.InsertFeature(lft);
}
System.IO.MemoryStream ms = model.GetMap(MapAlias, MapWidth, MapHeight, ExportFormat);
StreamImageToClient(ms);
}
}
(2)在页面加载中添加Line的命令注册。代码如下:
复制内容到剪贴板
代码:
if (Session.IsNewSession)
{
MapControlModel model = MapControlModel.SetDefaultModelInSession();
model.Commands.Add(new Line());
}
(3)在页面上拖放一个自定义控件WebTool,对其样式进行设置,有几个属性需要选择:
复制内容到剪贴板
代码:
ID:LineTool1
ClientCommand:MapCommand
ClientInteraction:PolyineInteraction
Command:Line
这样就实现了手动画线的功能,为什么这么简单呢?因为在交互PolyineInteraction中会获取所有点的坐标(测距工具也是使用PolyineInteraction交互),而MapCommand会把点坐标回传到服务器,只要的服务器端,调用System.Drawing.Point[] points = ExtractPoints(DataString)就可以得到所有点的坐标。
发表评论
-
mapxtreme添加标记和删除标记
2009-03-30 16:23 1818新增2个pointselectiontool, clientc ... -
添加数据库中的经纬度信息
2009-03-30 16:22 1779C# Code: 复制内容到剪贴板 代码: MapInfo ... -
MapXtreme 2005自定义图层控制代码(WEB)
2009-03-30 16:21 1582虽然MapXtreme 2005 6.7.1提供了图层控制的控 ... -
MapxTreme测试:绘制图标和文字标注
2009-03-30 16:19 3700代码: using System; using System ... -
mapxtreme 2004 改变feature颜色
2009-03-30 16:18 15841.C# code: 复制内容到剪贴板 代码: MapI ... -
MapxTreme2005地图打印
2009-03-30 16:18 1226MapxTreme2005地图打印 一、语言: c# net2 ... -
在C#应用中如何读取存在ORACLE(或SQL Server)中的MapInfo表
2009-03-30 16:17 1242using MapInfo.Data; ... -
MapXtreme 2005查找图元方法,web的
2009-03-30 16:16 1794先添加一个TextBox和 DropDownList控件 复 ... -
MapXtreme点取地图获得信息
2009-03-30 16:15 1895拖一个pointselectiontool到页面, 修改属性 ... -
MapXtreme查看整个地图的代码
2009-03-30 16:14 937Map map = mapControl1.Map; IMap ... -
MapXtreme 2005 鹰眼源代码
2009-03-30 16:13 1800研究了一段时间的MapXtreme2005 v6.6, 实现了 ... -
Web页面中实现鼠标中键缩放
2009-03-30 16:11 1541在MapXtreme 2005中,在Windows应用程序中自 ... -
两种方法实现动态轨迹
2009-03-30 16:11 1386在GIS中,动态轨迹的实现是非常有用的,可用GPS定位,热点跟 ... -
总结查找图元的三种方法
2009-03-30 16:10 1259在MapXtreme 2005中,查找图元提供了非常多的方法, ... -
添加标注图层
2009-03-30 16:08 1182在MapXtreme 2005中添加标注图层是非常容易的,只要 ... -
向图层中添加线段
2009-03-30 16:07 945向图层中添加线段和向图层中添加点是一样的,其本质都是向图层中添 ... -
向图层中添加点
2009-03-30 16:06 1037在添加点之前先要在地图上创建一个临时图层,创建临时图层请参考《 ... -
mapxtreme2005 改变选中的图元样式
2009-03-30 16:05 1089MapInfo.Styles.CompositeStyle c ... -
Mapxtreme2005 两点之间画直线
2009-03-30 16:04 1155private void DrawLine(MapInfo.D ... -
mapxtreme2005 创建各种样式
2009-03-30 16:04 1138public MapInfo.Styles.Composite ...
相关推荐
最后,"SimpleDrawing"可能是一个项目或示例工程的名字,它应该包含了一个完整的B4A程序,演示了如何在实际应用中实现手动画线和多边形绘制。通过查看并运行这个项目,你可以直观地理解代码的工作原理,并将这些知识...
在安卓编程领域,开发者经常需要实现用户交互式的图形绘制功能,比如手动画线和快速多边形绘制。这里我们关注的是一个使用Basic4Android(B4A)开发的实例项目——"SimpleDrawing",它提供了在移动设备上进行此类...
canvas 实现点击画线/打点画闭合多边形,靠近元素高亮
用MFC实现画线 infile.open(OpenDialog.GetPathName(),ios_base::binary); // if(!infile.is_open()) { return; } //读入个数 int nLine = 0; infile.read((char*)&nLine,sizeof(int)); ...
为了实现手动画线,可以使用鼠标事件监听,当鼠标按下时记录起点,移动时更新当前点,松开时确定终点。这些点将用于构建凸多边形的顶点数组,然后传递给OpenGL进行裁剪运算。 总之,这个项目涉及到了OpenGL编程、...
在Windows API开发中,创建一个可以画点和画线的简单程序是一项基础任务,它涉及到图形设备接口(GDI)的使用。GDI是Windows操作系统的一部分,提供了丰富的绘图功能,使得开发者能够创建出具有复杂视觉效果的应用...
总结起来,"高德地图画线,单条多条带方向示例"涉及到的关键技术点包括:高德地图JavaScript API的使用、`AMap.Polyline`对象的创建、坐标点的表示、线条样式设置以及方向指示的实现。通过这些技术,开发者可以在...
在C#中,我们可以使用`Graphics`类的`DrawLine`方法直接绘制直线,但为了理解中点画线法的工作原理,手动实现这个算法是非常有价值的。 在实际应用中,中点画线法可以用于游戏开发、图像处理、数据可视化等多个领域...
在“互联网区域地图边界手动画上获取坐标”的过程中,我们将主要利用百度地图API中的绘图工具和坐标系统。 1. **坐标系统**:在百度地图API中,坐标系统主要使用百度墨卡托坐标(BD09)和WGS84坐标。WGS84是全球...
在Qt框架下,开发一款能够实现鼠标画线并带有流畅笔锋效果的桌面应用程序是一项技术挑战。本项目通过巧妙地运用双缓冲技术和优化算法,确保了在4K高分辨率显示器上的出色性能,使得用户在画线时可以获得如同使用真实...
在该指标公式源码中,参数XD用于选择是否显示线段的画线。该参数的默认值为1,表示画线段;如果设置为0,则不画线段只画笔。 四、缠论画笔、线段函数的实际应用 缠论画笔、线段函数的实际应用非常广泛,例如: * ...
以上就是自定义View画曲线并实现平移缩放功能的主要技术点。实际开发中,你可能还需要处理各种边界条件,优化用户交互体验,以及考虑在不同设备和屏幕尺寸上的适配问题。通过不断实践和调试,你将能创建出高效、美观...
本篇文章将深入探讨如何使用Kotlin语言和Android的Canvas API,通过Paint对象来绘制一个动态的手动画模拟方向盘。 首先,我们要创建一个新的自定义View类,继承自Android的`View`类。在Kotlin中,这可以通过以下...
例如,我们可以调用`canvas.drawLine()`画线,`canvas.drawCircle()`画圆,`canvas.drawText()`写字等。同时,为了实现手写识别和手势追踪,我们需要跟踪用户的触摸事件,这可以通过重写`View`的`onTouchEvent()`...
3. **画线功能**:在K线图上,用户可能需要进行手动画线,比如绘制趋势线、斐波那契回撤线、支撑阻力线等。这要求开发者提供图形用户界面(GUI)元素,让用户能够自由地在图表上绘制线条,并保存和加载这些自定义...
Qt 中有相当方便的绘制接口 ( 由 QPainter 提供 ) 。 例如贝塞尔曲线的 API: QPainterPath 的 quadTo() 和 ...因此,我想到利用贝塞尔的公式生成曲线点,然后用直线来连接,即可实现「 N阶贝塞尔曲线绘制 」。
线数据可以来自各种来源,例如 GPS 设备、遥感影像、或者手动绘制。无论线数据来自哪里,都需要将其导入 Arcgis 中,并转换为 Arcgis 可以识别的格式。 二、使用 GP 工具搜索”在折点处分割线” 在 Arcgis 中,GP ...
本文将详细讲解如何使用C#来实现在PC端和APP端的手动签字功能。 首先,理解手动签字功能的核心需求。用户应该能在屏幕上自由绘制签名,然后保存并可能传输到其他系统或设备。这通常涉及到图形绘制、图像处理和数据...
【手动画的报表(EAReportPmm)】是一款专门用于创建和编辑自定义报表的组件集,它允许用户通过鼠标操作来构建类似Word的表格和报表。这个组件库包含了一系列的小部件,如Image(图像)、Label(标签)和Line(线条)...
`ObjectAnimator`可以直接作用于对象的属性,而`ValueAnimator`则需要手动更新属性值。 其次,理解折纸动画的关键是理解折痕的形成。在真实世界中,折纸是通过折叠纸张的边缘来形成折痕,然后根据折痕进行翻转和...