<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>扇形可视域</title>
<link rel="stylesheet" href="https://js.arcgis.com/4.12/esri/css/main.css">
<script src="https://js.arcgis.com/4.12/"></script>
<script src="js/jquery-1.12.4.js" type="text/javascript" charset="utf-8"></script>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
.btn {
position: absolute;
top: 100px;
left: 100px;
width: 60px;
text-align: center;
}
.radius-range {
position: absolute;
top: 60px;
left: 50px;
height: 30px;
line-height: 30px;
font-size: 14px;
}
.sector-range1 {
position: absolute;
top: 100px;
left: 50px;
height: 30px;
line-height: 30px;
font-size: 14px;
}
.sector-range {
position: absolute;
top: 140px;
left: 50px;
height: 30px;
line-height: 30px;
font-size: 14px;
}
.sector-animate {
position: absolute;
top: 180px;
left: 50px;
width: 60px;
button {
width: 100%;
height: 30px;
line-height: 30px;
font-size: 14px;
}
}
</style>
</head>
<body>
<div id="viewDiv"></div>
<div class="sector-animate">
<button class="open-animate">开启环视动画</button>
<button class="close-animate">关闭环视动画</button>
</div>
<script type="text/javascript">
$(function() {
require([
"esri/config",
"esri/Map",
"esri/views/MapView",
"esri/layers/GraphicsLayer",
"esri/layers/TileLayer",
"esri/geometry/Point",
"esri/Graphic",
"esri/geometry/Polyline",
"esri/geometry/Polygon",
"esri/geometry/geometryEngine",
"esri/PopupTemplate",
"esri/symbols/PictureMarkerSymbol",
"esri/symbols/TextSymbol",
"esri/geometry/support/webMercatorUtils",
"esri/widgets/DistanceMeasurement2D",
"esri/widgets/Sketch/SketchViewModel",
"esri/geometry/SpatialReference",
"esri/widgets/CoordinateConversion",
"dojo/domReady!"
], function(
esriConfig,
Map,
MapView,
GraphicsLayer,
TileLayer,
Point,
Graphic,
Polyline,
Polygon,
geometryEngine,
PopupTemplate,
PictureMarkerSymbol,
TextSymbol,
webMercatorUtils,
DistanceMeasurement2D,
SketchViewModel,
SpatialReference,
CoordinateConversion) {
var centerGp = null,
moveGp = null;
var map = new Map({
basemap: "streets"
});
//创建GraphicsLayer层
var deviceLayer = new GraphicsLayer(); //设备图层
var sidePointLayer = new GraphicsLayer(); //弧上的点图层
var sectorLayer = new GraphicsLayer(); //扇形图层
map.add(deviceLayer)
map.add(sectorLayer)
map.add(sidePointLayer)
var view = new MapView({
map: map,
container: "viewDiv",
center: [113.190248, 23.03],
zoom: 10
})
var coor = new CoordinateConversion({
view: view
})
view.ui.add(coor, "bottom-left")
var devicePt = new Point({
x: 113.190248,
y: 23.03,
spatialReference: {
wkid: 4326
}
});
var symbol = new PictureMarkerSymbol({
url: "image/car.png",
width: 40,
height: 40
});
var devcieGraphic = new Graphic({
geometry: devicePt,
symbol: symbol
});
deviceLayer.add(devcieGraphic)
function getPoints(center, radius, startAngle, endAngle, pointNum) {
var sin, cos, x, y, angle;
var points = [];
points[0] = center;
for(var i = 1; pointNum && i <= pointNum; i++) {
angle = startAngle + (endAngle - startAngle) * i / pointNum;
sin = Math.sin(angle * Math.PI / 180);
cos = Math.cos(angle * Math.PI / 180);
x = center[0] + radius * sin;
y = center[1] + radius * cos;
points[i] = [x, y];
}
points[points.length] = points[0];
return points;
}
var sectorGrp = null;
var clon = 113.190248;
var clat = 23.03;
var curRad = 0.1;
var curStartAng = -200;
var curEndAng = 30;
function drawPoint(centerPtArr, radius, startAng, endAng, pointNum) {
sectorLayer.removeAll();
var apoint1 = getPoints(centerPtArr, radius, startAng, endAng, pointNum);
generatePoint(radius, apoint1);
var sectorSym = {
type: "simple-fill",
style: "solid",
color: [255, 0, 0, 0.3],
outline: {
width: "0.5px",
color: [255, 0, 0]
}
}
var polygon = new Polygon({
rings: apoint1
});
sectorGrp = new Graphic(polygon, sectorSym, {
"lon": 12,
"lat": 444,
"name": 5555
});
console.log(sectorGrp)
sectorLayer.add(sectorGrp)
}
drawPoint([clon,clat],curRad,curStartAng,curEndAng,60);
/*
*生成移动的点
*/
function generatePoint(radius, points) {
sidePointLayer.removeAll();
var originPt = new Point({
x: points[0][0],
y: points[0][1],
spaticalReference: {
wkid: 4326
}
});
var movePt = new Point({
x: points[points.length - 2][0],
y: points[points.length - 2][1],
spaticalReference: {
wkid: 4326
}
});
var centerPt = new Point({
x: points[points.length / 2][0],
y: points[points.length / 2][1],
spaticalReference: {
wkid: 4326
}
});
//计算pt1到中心点pt的距离
var vertices = [
[points[0][0], points[0][1]],
[points[1][0], points[1][1]]
]
console.log(vertices)
var polyline = new Polyline({
paths: vertices,
spatialReference: view.spatialReference
})
var dis = geometryEngine.geodesicLength(polyline, "meters");
//比例
scale = radius / dis;
originGp = new Graphic(originPt, {
type: "simple-marker",
style: "circle",
color: [255, 0, 0, 0.7]
}, {
"edge": "edge",
"ptType": "origin"
})
moveGp = new Graphic(movePt, {
type: "simple-marker",
style: "circle",
color: [0, 255, 0, 0.7]
}, {
"edge": "edge",
"ptType": "move"
})
centerGp = new Graphic(centerPt, {
type: "simple-marker",
style: "circle",
color: [0, 0, 255, 0.7]
}, {
"edge": "edge",
"ptType": "center"
})
sidePointLayer.add(originGp);
sidePointLayer.add(moveGp);
sidePointLayer.add(centerGp);
}
//获取两点的构成的扇形夹角
function getAngle(cx, cy, x2, y2) {
if(cx == x2 && cy == y2) {
return -1;
}
var x = Math.abs(cx - x2);
var y = Math.abs(cy - y2);
var z = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
var cos = y / z;
var radina = Math.acos(cos); //用反三角函数求弧度
var angle = Math.floor(180 / (Math.PI / radina)); //将弧度转换成角度
console.log(angle)
//x2大于cx
if(x2 > cx) {
if(y2 > cy) { // 第一象限
console.log("第一象限 旋转的夹角:" + angle)
} else if(y2 < cy) { //第四象限
angle = 180 - angle;
console.log("第四象限 旋转的夹角:" + angle)
}
} else if(x2 < cx) {
if(y2 > cy) { //第二象限
angle = (-1) * angle;
console.log("第二象限 旋转的夹角:" + angle)
} else if(y2 < cy) { //第三象限
angle = (-1) * (180 - angle);
console.log("第三象限 旋转的夹角:" + angle)
}
}
//计算出�