arcgis for js如何画台风风圈

arcgis for js里面,画一个圆不是什么难事。小的可以用SimpleMarkerSymbol"style": "esriSMSCircle"
大的话,直接就来一个new Circle

但是,如果是类似台风风圈这类的呢?
这里写图片描述

似圆非圆,该咋画?
答案是画多边形。如图所示的风圈,正是3个多边形。其实所谓的圆,不就是多边形无限逼近的结果吗?好像微积分里有说到这个?

画台风风圈的原理如下:以圆心为原点,以正北方向为0度,顺时针画点,1度为1个点,并连成线,并最终回到正北方向,形成封闭的多边形;然后再加以填充。由于台风半径分为东北、东南、西南、西北四个方向,每个方向距离圆心可能长度不一,于是就形成了有四个锯齿状的风圈。

代码如下:

function getAirRing(c, center, index) {//风圈;level风力级数,center原点
	var arColor;
	switch (c.level) {
		case 7: arColor = [83, 168, 113]; break;//7级风圈
		case 10: arColor = [175, 192, 130]; break;
		case 12: arColor = [185, 121, 96]; break;
		default: arColor = [83, 168, 113]; break;
	}

	//算出所有的点
	var points = new Array();
	getPoints(center, c.EN, 0);//东北方向
	getPoints(center, c.ES, 90);
	getPoints(center, c.WS, 180);
	getPoints(center, c.WN, 270);
	points[points.length] = points[0];//首尾连接

	//设置填充symbol
	var bColor = arColor; bColor.push(0.5);//透明度
	var sfl = new esri.symbol.SimpleFillSymbol(
		esri.symbol.SimpleFillSymbol.STYLE_SOLID,
		new esri.symbol.SimpleLineSymbol(
			esri.symbol.SimpleLineSymbol.STYLE_SOLID,
			new dojo.Color(arColor),
			2
		),
		new dojo.Color(bColor)
	);

	//将点连成多边形
	var polygon = new esri.geometry.Polygon(points);
	//并填充,还附带上各种风圈数据
	var gr = new esri.Graphic(polygon, sfl,
		{
			"level": c.level, "wn": c.WN, "en": c.EN, "es": c.ES, "ws": c.WS,
			"attrtype": "airRing", "index": index,
		},
		new esri.InfoTemplate("风圈:${level}", tplAirRing));
	return gr;

	//此方法照抄来的,1度1个点
	function getPoints(center, cradius, startAngle) {
		var radius = cradius / 100; 
		var pointNum = 90;
		var endAngle = startAngle + 90;

		var sin;
		var cos;
		var x;
		var y;
		var angle;

		for (var i = 0; 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.push([x, y]);
		}
	}
}

2019.08.11
所谓画台风风圈,其实就是画一个多边形,一个可能有4个锯齿,近似圆形的多边形。

怎么画多边形呢?无非就是将一些点连成封闭的面而已。所以关键是要得到这些点的坐标。

本文例子中,是二维地图,因此我们要求得的是点的平面坐标。台风数据里面,有风眼坐标,风圈半径。其中风眼坐标是经纬度,换言之,是球面坐标。所以要做转换,将风眼坐标转换成平面坐标,然后求得风圈点集合。再将风圈点集合生成一个多边形。

/* 以下示例用arcgis for jsapi 3.19 */
var polygon = new esri.geometry.Polygon(_map.spatialReference);//使用平面坐标系构造一个多边形
polygon.addRing(points);//将求得的风圈点集合加入多边形,画一个环
var gr = new esri.Graphic(polygon, sfl,
    {
        "level": c.level, "wn": c.WN, "en": c.EN, "es": c.ES, "ws": c.WS,
        "attrtype": "airRing", "index": index,
    },
    new esri.InfoTemplate("风圈:${level}", tplAirRing));
return gr;

function getPoints(center, cradius, startAngle) {//获得组成风圈的点(平面坐标)
    var radius = cradius * 1000;//转换为米
    var pointNum = 90;
    var endAngle = startAngle + 90;

    var sin;
    var cos;
    var x;
    var y;
    var angle;

    for (var i = 0; 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.push([x, y]);
    }
}
function lngLatToXY(pt){//经纬度转化为平面坐标
    var _f = 6378137, _p = 0.017453292519943;
    var lng = pt[0];//经度
    var lat = pt[1];//纬度

    if (lat > 89.999999){
        lat = 89.999999;
    }
    else if (lat < -89.999999){
        lat = -89.999999;
    }
    var c = lat * _p;
    x = lng * _p * _f;
    y = _f / 2 * Math.log((1 + Math.sin(c)) / (1 - Math.sin(c)));

    return [x,y];
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
ArcGIS for JS可以通过鼠标拖拽的方式绘制点。你可以使用ArcGIS API for JavaScript提供的绘图工具来实现这个功能。具体步骤如下: 1. 首先,引入ArcGIS API for JavaScript的库文件,并创建一个地图容器,用于显示地图。 2. 创建一个绘图工具对象,并指定绘制点的类型。 3. 监听鼠标点击事件,在鼠标点击时获取点击位置的坐标。 4. 在点击事件中,使用绘图工具对象的draw()方法绘制点,并将点添加到地图上。 下面是一个简单的示例代码,展示如何使用ArcGIS for JS绘制点: ```javascript // 引入ArcGIS API for JavaScript的库文件 require([ "esri/Map", "esri/views/MapView", "esri/views/draw/Draw", "esri/Graphic" ], function(Map, MapView, Draw, Graphic) { // 创建地图对象 var map = new Map({ basemap: "topo-vector" }); // 创建地图视图对象 var view = new MapView({ container: "viewDiv", map: map, center: [-118.805, 34.027], zoom: 13 }); // 创建绘图工具对象,并指定绘制点的类型为点 var draw = new Draw({ view: view }); var pointSymbol = { type: "simple-marker", color: [226, 119, 40], outline: { color: [255, 255, 255], width: 1 } }; // 监听鼠标点击事件 view.on("click", function(event) { // 获取点击位置的坐标 var point = { type: "point", longitude: event.mapPoint.longitude, latitude: event.mapPoint.latitude }; // 创建点图形 var pointGraphic = new Graphic({ geometry: point, symbol: pointSymbol }); // 将点图形添加到地图上 view.graphics.add(pointGraphic); }); }); ``` 这段示例代码可以在ArcGIS API for JavaScript的官方文档中找到。你可以根据需要进行修改和扩展,实现更复杂的功能。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [arcgis for javascript 3.18版本物体轨迹移动](https://download.csdn.net/download/qq_27751965/18933597)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [17 ArcGIS API for JavaScript 4.18通过鼠标绘制点、线、面](https://blog.csdn.net/qq_35117024/article/details/111514850)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值