arcgis jsapi接口入门系列(5):几何(点线面)基本操作
点
point: function () {
//通过wkt生成点
//wkt,代表点的坐标
let wkt = "POINT(113.566806 22.22445)"; //wkt转点几何对象
// * @param apiInstance api
// * @param wkt wkt
// * @param sr 空间参考
let point = mapUtil.geometry.wktToPoint(this.apiInstance, wkt, this.mapView.spatialReference); //通过坐标生成点,坐标格式是arcgis jsapi的标准,详情可看官方文档
let coord = [113.566806, 22.22445];
// * @param apiInstance api
// * @param wkt wkt
// * @param sr 空间参考
point = mapUtil.geometry.coordToPoint(this.apiInstance, coord, this.mapView.spatialReference); //点转wkt
wkt = mapUtil.geometry.pointToWkt(point); //获取点坐标
let x = point.x;
let y = point.y; },
线
polyline: function () {
//通过wkt生成线
//wkt,代表线的坐标
let wkt = "LINESTRING(113.545949 22.24015749,113.56989 22.24916,113.55324 22.220588)";
// * @param apiInstance api
// * @param wkt wkt
// * @param sr 空间参考
let polyline = mapUtil.geometry.wktToPolyline(this.apiInstance, wkt, this.mapView.spatialReference); //通过坐标生成线,坐标格式是arcgis jsapi的标准,详情可看官方文档
let coord = [[[113.545949, 22.24015749], [113.56989, 22.24916], [113.55324, 22.220588]]];
// * @param apiInstance api
// * @param coord 坐标对象,格式如:[[[113.545949, 22.24015749], [113.56989, 22.24916], [113.55324, 22.220588]]]
// * @param sr 空间参考
polyline = mapUtil.geometry.coordToPolyline(this.apiInstance, coord, this.mapView.spatialReference); //线转wkt
wkt = mapUtil.geometry.polylineToWkt(polyline); //几何对象是否几何正确的检查与修复
//线和面(点不会)存在几何错误的情况,当有几何错误,几何对象的某些操作会出错,jsapi提供检查是否有几何错误的isSimple方法以及解决几何错误的simplify方法
if (this.apiInstance.geometryEngine.isSimple(polyline) === false) {
polyline = this.apiInstance.geometryEngine.simplify(polyline);
} //遍历线的所有点的坐标
//paths指线的“路径”,一条线可以有多条路径,但我们使用大多数情况都只有一条路径
let path = polyline.paths[0];
//遍历一条路径的所有点坐标
for (let i = 0; i < path.length; i++) {
//获取点坐标
let pointCoord = path[i];
let x = pointCoord[0];
let y = pointCoord[1]; //获取点对象
let pointLine = polyline.getPoint(0, i);
} //获取线的起点和终点(假设只有一个path)
let pointStart = polyline.getPoint(0, 0);
let pointEnd = polyline.getPoint(0, polyline.paths[0].length - 1); //获取线长度
//jsapi提供两个获取长度的方法,大意是如果几何对象的坐标系是地理坐标系,例如wgs84,那就用geodesicLength,如果是平面坐标系,就用planarLength
//参数2是计算的长度的单位,可以有这些值:meters | feet | kilometers | miles | nautical-miles | yards
let length1 = this.apiInstance.geometryEngine.geodesicLength(polyline, "meters");
//PS:因为测试数据是wgs84,所以把planarLength屏蔽了,其实不是无效代码
// let length2 = this.apiInstance.geometryEngine.planarLength(polyline, "meters"); //几何对象的范围
let extent = polyline.extent; },
面
polygon: function () {
//通过wkt生成面
let wkt = "POLYGON((113.527839 22.27028,113.527238 22.2557786,113.5437178 22.2597268,113.54423 22.2730306,113.527839 22.27028))";
// * @param apiInstance api
// * @param wkt wkt
// * @param sr 空间参考
let polygon = mapUtil.geometry.wktToPolygon(this.apiInstance, wkt, this.mapView.spatialReference); //通过坐标生成面,坐标格式是arcgis jsapi的标准,详情可看官方文档
let coord = [[[113.527839, 22.27028], [113.527238, 22.2557786], [113.5437178, 22.2597268], [113.54423, 22.2730306], [113.527839, 22.27028]]];
// * @param apiInstance api
// * @param coord 坐标对象 格式是arcgis jsapi标准,例如:[[[113.527839, 22.27028], [113.527238, 22.2557786], [113.5437178, 22.2597268], [113.54423, 22.2730306], [113.527839, 22.27028]]]
// * @param sr 空间参考
polygon = mapUtil.geometry.coordToPolygon(this.apiInstance, coord, this.mapView.spatialReference); //面转wkt
wkt = mapUtil.geometry.polygonToWkt(polygon); //几何对象是否几何正确的检查与修复
//线和面(点不会)存在几何错误的情况,当有几何错误,几何对象的某些操作会出错,jsapi提供检查是否有几何错误的isSimple方法以及解决几何错误的simplify方法
if (this.apiInstance.geometryEngine.isSimple(polygon) === false) {
polygon = this.apiInstance.geometryEngine.simplify(polygon);
} //遍历面的所有点的坐标
//rings指面的“路径”,一条面对象可以有多个面,但我们使用大多数情况都只有一个面
let ring = polygon.rings[0];
//遍历一个面的所有点坐标
for (let i = 0; i < ring.length; i++) {
//获取点坐标
let pointCoord = ring[i];
let x = pointCoord[0];
let y = pointCoord[1]; //获取点对象
let pointLine = polygon.getPoint(0, i);
} //获取面的周长
//jsapi提供两个获取长度的方法,大意是如果几何对象的坐标系是地理坐标系,例如wgs84,那就用geodesicLength,如果是平面坐标系,就用planarLength
//参数2是计算的长度的单位,可以有这些值:meters | feet | kilometers | miles | nautical-miles | yards
let length1 = this.apiInstance.geometryEngine.geodesicLength(polygon, "meters");
//PS:因为测试数据是wgs84,所以把planarLength屏蔽了,其实不是无效代码
// let length2 = this.apiInstance.geometryEngine.planarLength(polygon, "meters"); //获取面积也是两个方法,也是geodesicArea和planarArea,情况和获取长度的相同
//参数2是计算的面积的单位,可以有这些值:acres | ares | hectares | square-feet | square-meters | square-yards | square-kilometers | square-miles
//PS:计算面积前要先检查是否有几何错误,目前已知有几何错误会导致面积计算不准确
let area1 = this.apiInstance.geometryEngine.geodesicArea(polygon, "square-meters");
// let area2 = this.apiInstance.geometryEngine.planarArea(polygon, "square-meters"); //获取面是否自相交
let isSelfIntersecting = polygon.isSelfIntersecting; //获取面的几何中心点
let pointCenter = polygon.centroid; //几何对象的范围
let extent = polygon.extent; //把extent转面
//PS:extent是矩形,也属于面(多边形),因此逻辑上可以单向转换
let polygon2 = this.apiInstance.Polygon.fromExtent(extent);
},
extent(范围,矩形,envelope)
extent: function () {
//先生成任意矩形,作为测试数据
let wkt = "LINESTRING(113.545949 22.24015749,113.56989 22.24916,113.55324 22.220588)";
let polyline = mapUtil.geometry.wktToPolyline(this.apiInstance, wkt, this.mapView.spatialReference);
let extent = polyline.extent; //矩形4个角的坐标
let xmax = extent.xmax;
let xmin = extent.xmin;
let ymax = extent.ymax;
let ymin = extent.ymin;
//矩形的宽高
let width = extent.width;
let height = extent.height; //矩形中心点
let centerPoint = extent.center; let point1 = mapUtil.geometry.xyToPoint(this.apiInstance, 113.545949, 22.24015749, this.mapView.spatialReference);
//把矩形移动到以某个点为中心点的位置
let extent3 = extent.centerAt(point1); //把矩形按比例缩放,例如值为1.2即放到到原来的1.2倍
extent3 = extent.expand(1.2); //生成矩形
let extent2 = new this.apiInstance.Extent({
xmin: -9177882,
ymin: 4246761,
xmax: -9176720,
ymax: 4247967,
spatialReference: this.mapView.spatialReference
}); },
几何计算
geometryCalculate: function () {
//测试的线
let wkt = "LINESTRING(113.545949 22.24015749,113.56989 22.24916,113.55324 22.220588)";
let polyline = mapUtil.geometry.wktToPolyline(this.apiInstance, wkt, this.mapView.spatialReference); //测试的面
wkt = "POLYGON((113.527839 22.27028,113.527238 22.2557786,113.5437178 22.2597268,113.54423 22.2730306,113.527839 22.27028))";
let polygon = mapUtil.geometry.wktToPolygon(this.apiInstance, wkt, this.mapView.spatialReference); //以下只包含常用的几何操作,其他操作请看官方文档的geometryEngine类的方法 //生成缓冲区
//参数1:生成缓冲区的几何对象
//参数2:缓冲半径
//参数3:缓冲半径单位
//PS:关于单位。当几何对象坐标系为地理坐标系时,如果单位用平面的坐标系,例如米,会报错,但是单位的选项没有经纬度
//这情况可以传null,官方文档说法是默认值就是几何对象坐标系的单位
let bufferPolygon = this.apiInstance.geometryEngine.buffer(polyline, 100, null); //判断两个几何对象是否重叠
//intersects关系是只要有任意部分重叠就为true
let isIntersect = this.apiInstance.geometryEngine.intersects(polyline, bufferPolygon); //获取两个几何对象的重叠部分并输出新的几何对象
let intersectGeometry = this.apiInstance.geometryEngine.intersect(polygon, bufferPolygon); //计算两个几何对象的距离
//参数3:距离的单位
let distance = this.apiInstance.geometryEngine.distance(polyline, bufferPolygon, null);
},
arcgis jsapi接口入门系列(5):几何(点线面)基本操作的更多相关文章
- arcgis jsapi接口入门系列(0):总览
开发环境: arcgis jsapi版本4.9 由于我们这套代码是基于vue,webpack开发的,会有少数vue代码,但总体不影响 里面还有些我们公司的js库和html css,给出的代码不能百分百 ...
- arcgis jsapi接口入门系列(2):图层基础操作
//图层相关demo layerFun: function () { //获取地图的所有图层(不包括的图层类型:底图图层(basemaps)) let layers = this.map.layers ...
- arcgis jsapi接口入门系列(4):用代码在地图画点线面
PS:用代码画点这样写是为了跟后面的用鼠标画点线面区分出来 画点 drawPointGraphic: function () { //点有多种样式:一般的点,显示文字,显示图片 //一般的点 let ...
- arcgis jsapi接口入门系列(10):图形高亮
jsapi也有提供高亮的实现接口,但这里没用,而用的是一种改变图形(graphic)样式的思路 本文实现效果是:地图有多个面图形,当鼠标移动到面的上方,面高亮显示,鼠标移出后高亮解除 初始化 //高亮 ...
- arcgis jsapi接口入门系列(7):鼠标在地图画线
初始化,每个map执行一次就行 drawPolylineInit: function () { //画几何对象初始化 //新建一个图形图层用于存放画图过程中的图形 let layer = new th ...
- arcgis jsapi接口入门系列(3):各种类型的图层添加
这里说的tomcat切片,是指arcgis server切片后,把切片图片文件用tomcat发布(其他任意web服务器发布都行) //添加tomcat切片图层 addTomcatTileLayer: ...
- arcgis jsapi接口入门系列(9):可以同时显示多个的地图popup
jsapi有提供popup功能,但缺点很多,例如地图上只能同时显示一个popup,popup内容有限制等 本文提供另一个方法,原理不用jsapi,在地图外用一个普通的div放在地图上面,再监听地图的鼠 ...
- arcgis jsapi接口入门系列(8):鼠标在地图画面
初始化,每个map执行一次 PS:画点也差不多,都是用SketchViewModel,因此本demo没有专门写画点的 drawPolygonInit: function () { //画几何对象初始化 ...
- arcgis jsapi接口入门系列(6):样式
symbol: function () { //线样式 //样式详情请看官方文档 let style = { //线颜色,支持多种格式: //CSS color string:例如"dodg ...
随机推荐
- 洛谷P1073最优贸易——双向取值
题目:https://www.luogu.org/problemnew/show/P1073 由于任何城市都可以多次经过,所以可以随便走,也就不用太在意有向边和无向边,把无向边当做两条有向边处理: 根 ...
- c++中stl----vector
1 vector是啥玩意 (1)可以使用下标访问个别的元素 (2)迭代器可以按照不同的方式遍历 (3)可以在容器的末尾增加或者删除元素 2 容器大小和容器的容量区别 (1)大小是元素的个数,容量是分配 ...
- IP地址库解析——读取IP地址获得实际地理位置信息的java源码实现
说明:IP地址库来自QQwry.dat数据库文件,通过解析地址库当中的ip,已经细化最后获取的信息:获取ip地址对应的:国家 / 省 / 市 / 运营商ISP信息. 解析主要用到三个类: (1) IP ...
- Unity(2) 脚本简单操作
生命周期(按顺序排列) Awake():脚本唤醒,系统执行的第一个方法,在脚本声明周期内只执行一次,初始化一般可以在这里 Start():Awake之后,Update之前,只执行一次,一般在awake ...
- MongoDb 安装服务 以及 安全配置
安装MongoDb 的服务 命令如下: (cmd以管理员运行) mongod –logpath "D:\Program Files\mongodb\data\logs.txt" – ...
- 洛谷P1776 宝物筛选_NOI导刊2010提高(02)
P1776 宝物筛选_NOI导刊2010提高(02) 题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了, ...
- jzoj5986. 【WC2019模拟2019.1.4】立体几何题 (权值线段树)
传送门 题面 题解 不难看出每个点的大小为行列限制中较小的那一个(因为数据保证有解) 对于行的每个限制,能取到的个数是列里限制大于等于它的数的个数,同理,对于列是行里大于它的个数(这里没有等于,为了避 ...
- [Xcode 实际操作]二、视图与手势-(7)UIView视图的渐变填充
目录:[Swift]Xcode实际操作 本文将演示创建一个具有渐变填充色的图形 import UIKit class ViewController: UIViewController { overri ...
- 自定义socket 模拟B/S服务端
目录 通过什么实现连接? B/S 客户端与服务端交互过程 socket server端 python代码 (静态html反馈) socket server端 python代码 (动态html反馈) 小 ...
- Shiro 权限管理框架
一.什么是Shiro Apache Shiro是一个强大易用的java安全框架,提供认证.授权.加密和会话管理等功能 · 认证:用户身份识别,俗称“登录”: · 授权:访问控制 · 密码加密:保护或隐 ...