Openlayers 3计算长度和面积
1.比较粗糙的计算方式
计算长度
var length = lineFeature.getGeometry().getLength();
if (length > 1000) {
length = length / 1000;
unit = 'km';
} else {
unit = 'm';
}
说明:直接使用geom的getLength方法获取长度,openlayers默认的长度单位是m。所有如果长度大于1000,需要转换成km。
计算面积
var area = polygonFeature.getGeometry().getArea();
if (area > 1000000) {
area = area / 1000000;
unit = 'km²';
} else {
unit = 'm²';
}
说明:直接使用geom的getArea方法获取面积,同理如果面积大于1000000,需要转换为km(2)。
2.精准计算
计算长度
var sphere = new ol.Sphere(6378137);
…
var lonLatLine = lineFeature.getGeometry().transform(mapProjection, 'EPSG:4326');
var lineCoordinates = lonLatLine.getCoordinates();
var length = 0;
for (var i = 0; i < lineCoordinates.length - 1; i += 1) {
length += sphere.haversineDistance(lineCoordinates[i], lineCoordinates[i + 1]);
}
if (length > 1000) {
length = length / 1000;
unit = 'km';
} else {
unit = 'm';
}
说明:ol.Sphere是一个地形对象,可提供计算精准长度和面积。通过实际地理形状计算,需要把坐标转换为对应坐标系的经纬度,调用geom的transform(projection1, projection2),把投影系1下的坐标转化为投影系2的坐标,例如把墨卡托投影系EPSG:3857(大地坐标)下的坐标转换为EPSG:4236投影系下的坐标(经纬度)。使用Sphere对象的haversineDistance函数计算两个坐标之间的距离。
计算面积
var lonLatPolygon = polygonFeature.getGeometry().transform(mapProjection, 'EPSG:4326');
var area = Math.abs(sphere.geodesicArea(lonLatPolygon.getCoordinates()[0]));
if (area > 1000000) {
area = area / 1000000;
unit = 'km²';
} else {
unit = 'm²';
}
说明:其他不用再多介绍了,主要说下geodesicArea函数,它用来计算多边形的面积,计算出来的面积有正负之分,如果多边形是沿顺时针方向画,面积为正;否则为负。所以需要使用Math.abs求绝对值。
Openlayers 3计算长度和面积的更多相关文章
- OpenLayers测量距离和面积
<!DOCTYPE html> <html> <head> <title>测量距离和面积</title> <meta http-equ ...
- Topology and Geometry in OpenCascade-Adapters
Topology and Geometry in OpenCascade-Adapters eryar@163.com 摘要Abstract:本文简要介绍了适配器模式(adapter pattern) ...
- three.js使用gpu选取物体并计算交点位置
光线投射法 使用three.js自带的光线投射器(Raycaster)选取物体非常简单,代码如下所示: var raycaster = new THREE.Raycaster(); var mouse ...
- 聊聊GIS中的坐标系|再版
本文约6500字,建议阅读时间15分钟. 作者:博客园/B站/知乎/csdn/小专栏 @秋意正寒 版权:转载请告知,并在转载文上附上转载声明与原文链接(https://www.cnblogs.com/ ...
- OpenLayers动态测量距离和面积,并可自定义测量的线样式
全局操作变量 /** * @description 标注弹出框 */ HtmlPopup = null; /** * @description 临时图层类数据源 */ VectorSource = n ...
- hdu 1255 覆盖的面积(线段树 面积 交) (待整理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. In ...
- hdu 1255 覆盖的面积 (线段树处理面积覆盖问题(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1255 覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memo ...
- Geoserver基本使用、WMS服务发布与OpenLayers测试
1.Geoserver与OpenLayers的下载 Geoserver:http://geoserver.org/ OpenLayers:http://openlayers.org/ 2.安装部署Ge ...
- OpenLayers学习笔记4——使用jQuery UI实现測量对话框
OpenLayers学习最好的方式就是跟着其自带的演示样例进行学习,另外对web前端的开发设计要了解,慢慢积累,这样在一般的小项目中应该是足够用了. 本篇參照量測demo实现对话框形式的量測,抛砖引玉 ...
随机推荐
- Java 源码赏析 - java.lang - Void
被人鄙视了,于是也来读读源码... package java.lang; /** * The Void class is an uninstantiable placeholder class to ...
- js 添加天数
//日期加上天数得到新的日期 //dateTemp 需要参加计算的日期,days要添加的天数,返回新的日期,日期格式:YYYY-MM-DD function getNewDay(dateTemp, d ...
- webpack7--css压缩成单独的css文件
先看下下面的图片: 我们可以看到,通过Webpack打包后,默认CSS是通过 内部样式表 写入的.我们如何把压缩后的CSS单独导出为CSS 呢? 1.安装 extract-text-webpack-p ...
- 微信小程序——页面之间传递值
小程序页面传值的方式: 1.正向传值:上一页面 --> 下一页面 url传值 本地储存 全局的app对象 2.反向传值:下一页面 --> 上一页面 本地储存 全局的app对象 先说一下 ...
- 记录第一次使用jni编译so包的入门操作
1.配置 下载自己相对应的ndk平台版本后配置到studio 在local.properties加入路径 在gradle.properties文件添加 2.创建工具类(注意方法都是native的) 3 ...
- javascript验证键盘keycode
document.onkeyup = function(event){ var event = event || window.event; alert(event.keyCode); }
- JS函数重载解决方案
JS的函数定义可以指定形式参数名称,多多少少我们会以为js至少可以支持参数个数不同的方法重载,然而遗憾的是这仅仅是一个假象,js所有的参数都是以arguments传递过去的,这个参数类似于数组,在函数 ...
- Sword STL容器分类介绍
标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.slist是一个单 ...
- Python __str__函数
class Cat: def __init__(self,_name): self.name = _name def __str__(self): return "i am %s" ...
- java-selenium下载百度图片
package download; import java.io.DataInputStream; import java.io.File; import java.io.FileOutputStre ...