写在前面:越来越水系列o(* ̄︶ ̄*)o,本来应该好好介绍一下KML的DOM,好好梳理一下Google Earth API Utility libraries扩展的API,哎没那个精力,还是就写点儿Demo过了吧!我打算开启下一个系列了(#^.^#),每每回顾一年前的东西都感到头疼,现在手头主要在搞Qt的地图方案了。

还是老规矩,在GepWebBrowser控件中可以通过调用Google Earth API Utility libraries的API,来实现几何类型为Polyline和Polygon的PlaceMarker的绘制,示例代码如下:

bool bounce = false;
bool clockwise = true;Action<int> drawCallback = i => { /* 当你绘制完第i个点时希望后端做点儿什么... */ }
Action finishCallback = () => { /* 当你完成所有点的绘制时希望后端做点儿什么... */ }// 调用前端JS脚本中的GepBeginDrawPolyline方法
var uid = (string)Document.InvokeScript("GepBeginDrawPolyline", new object[] { bounce, clockwise, drawCallback, finishCallback });// 调用前端JS脚本中的GepBeginDrawPolygon方法
var uid = (string)Document.InvokeScript("GepBeginDrawPolygon", new object[] { bounce, clockwise, drawCallback, finishCallback });

再来看看前端JS怎么实现GepBeginDrawPolyline和GepBeginDrawPolygon:

// Polyline Placemark的列表
var polylinePlacemarks = {};
/*** 通过鼠标事件开始绘制多义线* @function* @param {Boolean} bounce 是否开启绘制点的弹跳效果* @param {Boolean} ensureCounterClockwise 是否对点进行逆时针存储* @param {Function} drawCallback 每当绘制一个节点就触发的回调函数,回调参数是节点的数组索引* @param {Function} finishCallback 完成绘制时触发事件(鼠标左键双击或单击起始点形成闭环时)* @return {String} 返回唯一ID*/
function GepBeginDrawPolyline(bounce, ensureCounterClockwise, drawCallback, finishCallback){var id = getUniqueId();polylinePlacemarks[id] = gex.dom.addLineStringPlacemark([], {id: id,style: {line: { width: 2, color: 'red' }}});var lineString = polylinePlacemarks[id].getGeometry();gex.edit.drawLineString(lineString, {bounce: bounce,drawCallback: drawCallback,finishCallback: finishCallback,ensureCounterClockwise: ensureCounterClockwise});return id;
}// Polygon Placemark的列表
var polygonPlacemarks = {};
/*** 通过鼠标事件开始绘制多义面* @function* @param {Boolean} bounce 是否开启绘制点的弹跳效果* @param {Boolean} ensureCounterClockwise 是否对点进行逆时针存储* @param {Function} drawCallback 每当绘制一个节点就触发的回调函数,回调参数是节点的数组索引* @param {Function} finishCallback 完成绘制时触发事件(鼠标左键双击或单击起始点形成闭环时)* @return {String} 返回唯一ID*/
function GepBeginDrawPolygon(bounce, ensureCounterClockwise, drawCallback, finishCallback){var id = getUniqueId();polygonPlacemarks[id] = gex.dom.addPolygonPlacemark([], {id: id,style: {poly: '8000ff00',line: { width: 1, color: 'blue' }}});var lineString = polygonPlacemarks[id].getGeometry().getOuterBoundary();gex.edit.drawLineString(lineString, {bounce: bounce,drawCallback: drawCallback,finishCallback: finishCallback,ensureCounterClockwise: ensureCounterClockwise});return id;
}

和绘制点图标时一样,上面两个函数中的style也可用放到参数列表中去,从后端通过JSon传参的方式传递过来解析。

来看看在谷歌地球上绘制的实际样子:

与此同时,Google Earth API Utility libraries还提供了编辑已有Polyline和Polygon的API。在GepWebBrowser控件中,可以通过如下示例代码实现:

string uid = [PlaceMarker Unique ID] // 前面绘制时返回的唯一ID
Action editCallback = () => { /* 当编辑发生时你想让后端做点儿什么... */ }// 开始编辑Polyline
Document.InvokeScript("GepBeginEditPolyline", new object[] { uid, editCallback });
// 停止编辑Polyline
Document.InvokeScript("GepEndEditPolyline", new object[] { uid });// 开始编辑Polygon
Document.InvokeScript("GepBeginEditPolygon", new object[] { uid, editCallback });
// 停止编辑Polygon
Document.InvokeScript("GepEndEditPolygon", new object[] { uid });

前端JS脚本实现GepBeginEditPolyline、GepEndEditPolyline、GepBeginEditPolygon和GepEndEditPolygon:

/*** 通过鼠标事件编辑指定的多义线* @function* @param {String} id 指定的多义线的ID* @param {Function} editCallback 编辑时触发的回调函数*/
function GepBeginEditPolyline(id, editCallback){if (!polylinePlacemarks[id]) {alert('无法编辑:该要素不存在!');return;}var lineString = polylinePlacemarks[id].getGeometry();gex.edit.editLineString(lineString, {editCallback: editCallback});
}/*** 停止通过鼠标事件编辑指定的多义线* @function* @param {String} id 指定的多义线的ID*/
function GepEndEditPolyline(id){if (polylinePlacemarks.length <= 0)return; var lineString = polylinePlacemarks[id].getGeometry();gex.edit.endEditLineString(lineString);
}/*** 通过鼠标事件编辑指定的多义面* @function* @param {String} id 指定的多义面的ID* @param {Function} editCallback 编辑时触发的回调函数*/
function GepBeginEditPolygon(id, editCallback){if (!polygonPlacemarks[id]) {alert('无法编辑:该要素不存在!');return;}var lineString = polygonPlacemarks[id].getGeometry().getOuterBoundary();gex.edit.editLineString(lineString, {editCallback: editCallback});
}
/*** 停止通过鼠标事件编辑指定的多义面* @function* @param {String} id 指定的多义面的ID*/
function GepEndEditPolygon(id){if (polygonPlacemarks.length <= 0)return; var lineString = polygonPlacemarks[id].getGeometry().getOuterBoundary();gex.edit.endEditLineString(lineString);
}

bingo!

转载于:https://my.oschina.net/HangXiaoZhuOSZone/blog/2966426

Hello earth(四)——让我们来画Polyline和Polygon吧!相关推荐

  1. polyline与polygon

    这几天一直在和数据格式打交道,主要是shp的格式.由于格式限制,整个shp文件不可能有圆弧或者bezier曲线之类的.如果原文件有,可以先构成ellipticalarc或者cicurarc,然后转换到 ...

  2. 【已解决】leaflet-geoman启用编辑模式时,map上所有(marker、polyline、Polygon等)元素处于编辑状态

    文章目录 leaflet-geoman启用编辑模式时,map上所有(marker.polyline.Polygon等)元素处于编辑状态特别影响体验,尤其是使用了L.motion后,由于切割较碎导致数据 ...

  3. 【CAD二次开发】最完美EntityJig画polyline arc实例

    下面是效果图 2021/10/11更新添加可以捕捉拐点的功能 public static class JigCommand{public static void RunBulgePolyJig(str ...

  4. Silverlight开发历程—(绘制矢量图之Polyline 和 Polygon)

    Polyline(多线段) 和 Polygon(多边形) Polyline(多线段) 和 Polygon(多边形)是Silverlight中简单但功能强大的绘图对象.它允许你声明N个Points属性值 ...

  5. 问题三十二:怎么用ray tracing画多边形(polygon, triangle)

    画多边形主要分为两步: 1,光线和多边形所在的平面相交,求得交点: 2,判断交点是否在多边形内: 32.1 光线和多边形所在的平面相交 分别定义光线.多边形和多边形所在平面.光线和平面的方程如下:(注 ...

  6. Android 高德地图计算 Circle 计算上下左右四个点经纬度,Circle和Polygon是否全部包含,计算地图中点到线的最短距离

    /*** 假设地球为一半径为R的表面光滑圆球体,* 表面上同一经线圈上相差1"两点间的距离为 2πR/360/3600* 表面上同一纬线圈上相差1"两点间的距离为 2πR×cos( ...

  7. python3画直方图出现“Polygon‘ object has no property ‘normed”

    直方图原程序 import numpy as np import matplotlib.pyplot as pltnp.random.seed(0) mu,sigma = 100, 20 #均值和标准 ...

  8. Arcgis for Android在地图上画多边形并进行边长、周长和面积的测量

    Arcgis for Android的地图操作里,放大缩小地图.图层切换.定位.测距测面等都是它的一些基本操作,封装后一般调用就是了,很简单.不过最近有了个需求,在地图上画一个多边形时候同时进行多边形 ...

  9. 荷花用计算机怎么画,怎样画荷花荷叶简笔画

    怎样画荷花荷叶简笔画 简笔画是通过目识.心记.手写等活动,提取客观形象最典型.最突出的主要特点,以平面化.程式化的形式和简洁洗练的笔法,表现出既有概括性又有可识性和示意性的绘画.下面是小编搜集的画荷花 ...

最新文章

  1. 大盘点 | 2020年5篇图像分割算法最佳综述
  2. jQuery autoComplete 样式
  3. object references an unsaved transient instance【异常】
  4. html5表单讲解,HTML5 表单新增元素与属性讲解
  5. JZOJ 5701. 【gdoi2018 day2】第一题 谈笑风生(magic)
  6. python读取视频分辨率_Python实现以不同分辨率分类视频
  7. python中的loop啥意思_python怎么进行loop
  8. Rabbitmq~对Vhost的配置
  9. 【实用代码片段】将json数据绑定到html元素 (转)
  10. 21. 包含min函数的栈(C++版本)
  11. Drool规则引擎详解(一)
  12. 平面几何基本知识——学习笔记(2)
  13. 景观设计常用的SU插件(Sketchup)
  14. 矩阵的乘法(python、matlab、excel的不同实现方法)
  15. 制作颜色选择器(全)
  16. mame 游戏铁钩船长/拳皇97 支持多手柄,电视遥控器~~
  17. C语言printf函数格式化打印之长整型
  18. web页在微信中访问增加遮罩层 右上角弹出在浏览器中打开
  19. 在天翼网关2.0上如何使用自己的路由器
  20. c++第二次作业-定期存款利息计算器

热门文章

  1. 用python写一个语音转文字的代码
  2. QLExpress 系列入门教程-06-QLExpress isPrecise 精度设置,isShortCircuit 逻辑短路 配置
  3. 唐山师范学院一位大四女生从教学楼15层跳下自杀
  4. 数据结构5——圆方树
  5. 北京有限公司合理节税的方式有哪些?
  6. 关于公布《山西省专业技术人员职业资格与职称对应目录》的通知
  7. 基于mediapipe和KNN算法的深蹲/引体向上计数检测【mediapipe】【BlazePose】【KNN邻接算法】
  8. Phase Sensitive Filter
  9. 冰箱什么品牌最好排名前十名 冰箱什么品牌最省电2023
  10. 振动论坛---MATLAB