ArcGIS API for JS生成格网(格网的生成是根据原点坐标,像元大小,起始行,起始列,结束行,结束列,间隔标注生成的)

本文介绍如何使用 ArcGIS JavaScript API 实现格网的绘制,并展示了一个具体的应用实例,包括设置地图、添加图层和服务、定义坐标轴、绘制网格线以及添加文字标注等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.20/3.20/dijit/themes/tundra/tundra.css"/>
    <link rel="stylesheet" type="text/css" href="http://localhost/arcgis_js_api/library/3.20/3.20/esri/css/esri.css" />
    <script type="text/javascript" src="http://localhost/arcgis_js_api/library/3.20/3.20/init.js"></script>
    <style>
        #myMapDiv{
            height: 500px;
            width: 800px;
            border: 1px solid black;
        }
    </style>
    <script>
            require(["dojo/dom","esri/symbols/SimpleMarkerSymbol","esri/symbols/Font", "esri/symbols/TextSymbol","esri/layers/GraphicsLayer","esri/graphic","esri/map","esri/layers/ArcGISDynamicMapServiceLayer","esri/geometry/Polyline","esri/symbols/SimpleLineSymbol","dojo/colors","esri/geometry/Point","dojo/domReady!"],
            function (dom,SimpleMarkerSymbol,Font,TextSymbol,GraphicsLayer,Graphic,Map,ArcGISDynamicMapServiceLayer,Polyline,SimpleLineSymbol,Color,Point) {
            var map=new Map("myMapDiv");
            var layer=new ArcGISDynamicMapServiceLayer("http://localhost:6080/arcgis/rest/services/服务/test/MapServer");
            map.addLayer(layer);
            map.centerAt([0,0]);
                var oOriginX=dom.byId("originX");  //获取原点X坐标
                var oOriginY=dom.byId("originY");  //获取原点Y坐标
                var oPixelSize=dom.byId("pixelSize"); //获取像元大小
                var oStartRow=dom.byId("startRow"); //获取起始行号
                var oEndRow=dom.byId("endRow");    //获取结束行号
                var oStartColumn=dom.byId("startColumn");//获取起始列号
                var oEndColumn=dom.byId("endColumn");  //获取结束列号
                var oLable=dom.byId("lable");     //获取间隔标注
                var oDetermine=dom.byId("determine"); //获取确定按钮

            function changePoint(x,y) {   //生成点函数
                var p=new Point({
                    "x":x,
                    "y":y,
                    "spatialReference": {"wkid": 102100}
                });
                return p;
            };
                var axisContentGraphicLayer=new GraphicsLayer();//定义一个存放坐标轴及标注的全局变量
                var grideGraphicLayer=new GraphicsLayer();   //定义一个存放格网的全局变量
                oDetermine.onclick=function () {   //点击确定事件
                    var oOriginRow=parseFloat(oOriginY.value)/parseFloat(oPixelSize.value); //原点的行号
                    var oOriginColumn=parseFloat(oOriginX.value)/parseFloat(oPixelSize.value);//原点的列号
                    var V1=0;   //在绘制格网的的时候,让最下面的横线一个一个单位的向上移动,V1起一个标识作用,为什么不用i,因为i可能为负值
                    var oReallyStartRow=parseInt(oStartRow.value)+oOriginRow;//相对于原点的起始行号
                    var oReallyEndRow=parseInt(oEndRow.value)+oOriginRow; //相对于原点的结束行号
                    var oReallyStartColumn=parseInt(oStartColumn.value)+oOriginColumn;//相对于原点的起始列号
                    var oReallyEndColumn=parseInt(oEndColumn.value)+oOriginColumn;//相对于原点的结束列号

                    grideGraphicLayer.clear();//绘制格网之前,先把上次的grideGraphicLayer给clear了
                    for(var i=parseInt(oStartRow.value);i<parseInt(oEndRow.value)+1;i++)  //将横轴线一条条向上移动函数,之前写的是i=oReallyStartRow,i<oReallyEndRow这个时候不能用相对位置了,因为这个相对位置是对线的坐标而言,而这个延长线的位置必须用绝对位置
                    {
                        var textFont=new Font('15px').setWeight(Font.WEIGHT_BOLD);//横轴标注字体
                        var textSymbol=new TextSymbol(i,textFont,new Color([0,0,0]));//横轴标注样式
                        textSymbol.setOffset(20,0);  //横轴标注偏移量
                        var k=0;         //定义一个k,是为了找到需要延长的线,让它的末点坐标+i*k,当然,如果不符合条件,那么k=0,相当于没加
                        if((i!=oOriginRow)&&(i%parseInt(oLable.value)==0))//延长线的符号条件
                        {
                            k=1; //符合条件后,将k=1
                            var graphicLable=new Graphic(changePoint(oReallyEndColumn*parseFloat(oPixelSize.value)+k*parseFloat(oPixelSize.value)*3,oReallyStartRow*parseFloat(oPixelSize.value)+parseFloat(oPixelSize.value)*V1),textSymbol);//这个graphic的geometry为延长线的末点坐标,symbol为文本标注
                            grideGraphicLayer.add(graphicLable);  //将X轴的标注graphic加到grideGraphicLayer里
                        }
                        var p1=changePoint(oReallyStartColumn*parseFloat(oPixelSize.value),oReallyStartRow*parseFloat(oPixelSize.value)+parseFloat(oPixelSize.value)*V1);//格网左下角的点
                        var p2=changePoint(oReallyEndColumn*parseFloat(oPixelSize.value)+k*parseFloat(oPixelSize.value)*3,oReallyStartRow*parseFloat(oPixelSize.value)+parseFloat(oPixelSize.value)*V1);//格网右下角的点
                        var line=new Polyline({"wkid":102100});//定义横轴的线,注意这个{"wkid":102100}很重要,不能使用map.spatialReference,要使用自己发布地图的坐标系编码
                        line.addPath([p1,p2]);  //将上面两点加进去
                        var linesymbol=new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color([255,0,0]),1);
                        var graphicLine=new Graphic(line,linesymbol);
                        grideGraphicLayer.add(graphicLine);
                        V1++;  //为了使横轴能够向上移动,V1每次需要+1
                    }
                    var V2=0;    //这个是纵轴的向右移动标识,和V1同理
                    for(var i=parseInt(oStartColumn.value);i<parseInt(oEndColumn.value)+1;i++) //对纵轴进行平移,与上面的同理
                    {
                        var textFont=new Font('15px').setWeight(Font.WEIGHT_BOLD);
                        var textSymbol=new TextSymbol(i,textFont,new Color([0,0,0]));
                        textSymbol.setOffset(0,20);
                        var k=0;
                        if((i!=oOriginColumn)&&(i%parseInt(oLable.value)==0))
                        {
                            k=1;
                            var graphicLable=new Graphic(changePoint(oReallyStartColumn*parseFloat(oPixelSize.value)+parseFloat(oPixelSize.value)*V2,oReallyEndRow*parseFloat(oPixelSize.value)+k*parseFloat(oPixelSize.value)*3),textSymbol);
                            grideGraphicLayer.add(graphicLable);  //将Y轴的标注graphic加到grideGraphicLayer里

                        }
                        var p1=changePoint(oReallyStartColumn*parseFloat(oPixelSize.value)+parseFloat(oPixelSize.value)*V2,oReallyStartRow*parseFloat(oPixelSize.value));//格网左下角的点
                        var p2=changePoint(oReallyStartColumn*parseFloat(oPixelSize.value)+parseFloat(oPixelSize.value)*V2,oReallyEndRow*parseFloat(oPixelSize.value)+k*parseFloat(oPixelSize.value)*3);//格网左上角的点
                        var line=new Polyline({"wkid":102100});
                        line.addPath([p1,p2]);
                        var linesymbol=new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color([255,0,0]),1);
                        var graphicLine=new Graphic(line,linesymbol);
                        grideGraphicLayer.add(graphicLine);
                          V2++;
                    }
                    var oLinesymbol=new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color([255,0,0]),1);
                    var oMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CIRCLE, 10, oLinesymbol, new Color([0, 255, 0]));
                    var oPt=changePoint(parseFloat(oOriginX.value),parseFloat(oOriginY.value));//为了将原点突出
                    var oGrideGraphic=new Graphic(oPt,oMarkerSymbol);
                    grideGraphicLayer.add(oGrideGraphic);
                    map.addLayer(grideGraphicLayer);

                    //坐标轴,原点及其标注的一些定义
                    var oo=changePoint(parseFloat(oOriginX.value),parseFloat(oOriginY.value));  //定义坐标原点
                    var oX=changePoint(oReallyEndColumn*parseFloat(oPixelSize.value)+parseFloat(oPixelSize.value)*5,parseFloat(oOriginY.value));//X轴右边末点,+parseFloat(oPixelSize.value)*5是为了坐标轴更长
                    var oX1=changePoint(oReallyStartColumn*parseFloat(oPixelSize.value)-parseFloat(oPixelSize.value)*5,parseFloat(oOriginY.value));//X轴左边末点
                    var oY=changePoint(parseFloat(oOriginX.value),oReallyEndRow*parseFloat(oPixelSize.value)+parseFloat(oPixelSize.value)*5);  //Y轴上边末点
                    var oY1=changePoint(parseFloat(oOriginX.value),oReallyStartRow*parseFloat(oPixelSize.value)-parseFloat(oPixelSize.value)*5);//Y轴下变末点
                    var X1=changePoint(oReallyEndColumn*parseFloat(oPixelSize.value)+parseFloat(oPixelSize.value)*4,parseFloat(oOriginY.value)-parseFloat(oPixelSize.value)/2);//定义X轴的箭头
                    var X2=changePoint(oReallyEndColumn*parseFloat(oPixelSize.value)+parseFloat(oPixelSize.value)*4,parseFloat(oOriginY.value)+parseFloat(oPixelSize.value)/2);//定义X轴的箭头
                    var Y1=changePoint(parseFloat(oOriginX.value)-parseFloat(oPixelSize.value)/2,oReallyEndRow*parseFloat(oPixelSize.value)+parseFloat(oPixelSize.value)*4);//定义Y轴的箭头
                    var Y2=changePoint(parseFloat(oOriginX.value)+parseFloat(oPixelSize.value)/2,oReallyEndRow*parseFloat(oPixelSize.value)+parseFloat(oPixelSize.value)*4);//定义Y轴的箭头
                    var textFont1=new Font('18px').setWeight(Font.WEIGHT_BOLD);  //定义坐标轴和原点的文本样式
                    var textSymbol1=new TextSymbol("原点",textFont1,new Color([0,0,0]));//定义原点标注内容
                    textSymbol1.setOffset(0,-20);       //定义原点标注偏移距离
                    var textSymbol2=new TextSymbol("X轴",textFont1,new Color([0,0,0]));//定义X轴标注内容
                    textSymbol2.setOffset(0,-20);      //定义X轴标注偏移距离
                    var textSymbol3=new TextSymbol("Y轴",textFont1,new Color([0,0,0]));//定义Y轴标注内容
                    textSymbol3.setOffset(-20,0);   //定义Y轴标注偏移距离
                    var axis=new Polyline({"wkid":102100}); // 定义坐标轴的线
                   // axis.addPath([oX1,oX]);  //这个时候为啥不直接将坐标轴的两个端点直接相连呢,是因为坐标轴的长度是根据格网的位置和格网的大小算出来的,如果客户定义一个距离坐标轴很远的格网,那么将出现坐标轴不能与原点相连的现象
                   // axis.addPath([oY1,oY]);
                    axis.addPath([oo,oX]);    //原点与X轴右边连接
                    axis.addPath([oo,oX1]);   //原点与X轴左边连接
                    axis.addPath([oo,oY]);    //原点与Y轴右边连接
                    axis.addPath([oo,oY1]);    //原点与Y轴左边连接
                    axis.addPath([X1,oX]);   //添加X轴的箭头
                    axis.addPath([oX,X2]);   //添加X轴的箭头
                    axis.addPath([Y1,oY]);   //添加Y轴的箭头
                    axis.addPath([oY,Y2]);    //添加Y轴的箭头
                    var lineSymbol1=new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,new Color([0,0,0]),2);//定义线样式
                    var graphic1=new Graphic(axis,lineSymbol1); //这个graphic包含了坐标轴及箭头
                    var graphic2=new Graphic(oo,textSymbol1);   //这个graphic是原点的标注
                    var graphic3=new Graphic(oX,textSymbol2);   //这个graphic是X轴的标注
                    var graphic4=new Graphic(oY,textSymbol3);   //这个graphic是Y轴的标注
                    axisContentGraphicLayer.clear();  //在绘制坐标轴之前,先把上次的给clear了
                    axisContentGraphicLayer.add(graphic1);
                    axisContentGraphicLayer.add(graphic2);
                    axisContentGraphicLayer.add(graphic3);
                    axisContentGraphicLayer.add(graphic4);
                    map.addLayer(axisContentGraphicLayer);//将axisContentGraphicLayer添加到地图中
                }

        })
    </script>
</head>
<body>
<div id="myMapDiv"></div>
<span>输入X坐标:</span><input type="text" id="originX">
<span>输入Y坐标:</span><input type="text" id="originY"><br>
<span>输入像元大小:</span><input type="text" id="pixelSize"><span>米</span><br>
<span>输入起始行:</span><input type="text" id="startRow">
<span>输入结束行:</span><input type="text" id="endRow"><br>
<span>输入起始列:</span><input type="text" id="startColumn">
<span>输入结束列:</span><input type="text" id="endColumn"><br>
<span>输入标注间隔:</span><input type="text" id="lable">
<input type="button" id="determine" value="确定">
</body>
</html>

ArcGIS中创建渔网(Fishnet)是一种常见的空间分析操作,通常用于划分区域、网格化数据或进统计分析。以下是一个详细的教程,涵盖从准备到生成渔网的具体步骤。 ### 创建渔网的基本流程 1. **确定渔网的范围** 在开始之前,需要明确渔网覆盖的空间范围。可以使用一个现有的矢量文件(如四川省的边界)来定义这个范围;也可以手动输入坐标值指定范围[^1]。 2. **打开Create Fishnet工具** 在ArcMap环境中,依次点击“Toolboxes” → “Data Management Tools.tbx” → “Sampling” → “Create Fishnet”,打开该工具窗口。 3. **设置输出路径与名称** 第一个参数是输出的渔网文件路径和名称,这决定了最终生成的矢量文件存储的位置以及文件名。 4. **定义渔网的空间范围** 选择已有的矢量文件作为渔网的范围边界,或者直接在参数框中输入左下角、右上角的坐标来限定范围[^1]。 5. **设置原点与Y轴顶点坐标** 原点指的是渔网最左下角的坐标,而Y轴顶点则决定渔网的起始方向。这两个坐标共同决定了渔网的方向和位置。 6. **设定格网大小或数量** 如果希望每个格网具有特定的长度与宽度(例如0.2694度),可以直接输入这些数值;如果更倾向于根据格网数量来生成,则可以留空长度与宽度参数,并填写格网数与数[^1]。 7. **指定右上角坐标** 输入渔网右上角的坐标,进一步确认渔网的最终尺寸和形状。 8. **是否生成点要素图层** 可以选择是否同时生成一个点要素图层,其中每个点位于渔网格网的中心位置。 9. **选择输出类型** 渔网可以输出为线要素或多边形要素。多边形通常更适合进区域分析,而线要素则适合展示边界[^2]。 10. **运工具并查看结果** 设置完所有参数后,点击“OK”运工具。生成的渔网将自动添加到地图视图中,同时会附带属性表,记录每个格网的基本信息[^1]。 ### 示例代码 ```python # 示例:Python脚本调用ArcGIS Create Fishnet工具 import arcpy # 设置工作空间 arcpy.env.workspace = "C:/data" # 定义输出路径 out_feature_class = "fishnet_output.shp" # 定义范围(最小边界矩形) template_dataset = "sichuan_boundary.shp" # 原点坐标(左下角) origin_coord = "102.0 26.0" y_axis_coord = "102.0 34.0" # Y轴顶点坐标 # 格网大小 cell_width = "0.2694" cell_height = "0.2694" # 格网数量 number_rows = "" number_columns = "" # 右上角坐标 opposite_corner = "110.0 34.0" # 是否生成点要素 create_label_points = "LABELS" # 输出类型(POLYLINE 或 POLYGON) geometry_type = "POLYGON" # 执Create Fishnet工具 arcpy.CreateFishnet_management( out_feature_class, origin_coord, y_axis_coord, cell_width, cell_height, number_rows, number_columns, opposite_corner, geometry_type, template_dataset, create_label_points ) ``` ### 后处理:裁剪渔网与指定多边形相交部分 若只需要保留渔网与某个特定多边形(如黄陵县边界)相交的部分,可以使用叠加分析中的“相交”工具: - 工具路径:`Analysis Tools` → `Overlay` → `Intersect` - 输入渔网数据与目标多边形数据,系统将自动计算两者的交集,保留重叠区域[^2]。 ### 相关问题处理方法 1. **如何删除渔网中不需要的部分?** - 使用“按位置选择”工具选中与目标多边形不重叠的渔网格子,然后进入编辑模式删除所选项。 - 注意:这种方式不会生成新文件,而是直接修改原始渔网数据。 2. **如何确保渔网单位为米?** 若希望Cell Size Width与Cell Size Height的单位为米,需先对栅格数据进投影转换,确保其坐标系为合适的投影系统(如UTM)[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值