Javascript ArcGIS循环缓冲区

Javascript ArcGIS循环缓冲区,javascript,buffer,arcgis,esri,arcgis-js-api,Javascript,Buffer,Arcgis,Esri,Arcgis Js Api,我被卡住了,试图用ArcGIS绘制一个简单的圆形缓冲区。以下是我如何设置我的底图: dojo.require("esri.map"); dojo.require("esri.tasks.servicearea"); dojo.require("dijit.dijit"); dojo.require("dijit.layout.BorderContainer"); dojo.require("dijit.layout.ContentPane"); dojo.require("esri/layers

我被卡住了,试图用ArcGIS绘制一个简单的圆形缓冲区。以下是我如何设置我的底图:

dojo.require("esri.map");
dojo.require("esri.tasks.servicearea");
dojo.require("dijit.dijit");
dojo.require("dijit.layout.BorderContainer");
dojo.require("dijit.layout.ContentPane");
dojo.require("esri/layers/FeatureLayer");
dojo.require("esri/symbols/SimpleMarkerSymbol");

var mapLayers = new Array();
var map;
var GL = null;

function setMap() {
    function init() {
        require(
            [
                "esri/map",
                "dojo/dom-construct",
                "dojo/domReady!",
                "esri/tasks/GeometryService"
            ],
            function 
            (
                Map,
                domConstruct
            ) {
                map = Map("map-canvas",
                {
                    //infoWindow: popup
                });
                map.setZoom(1);
                coreFunctions();
            });

    }
    dojo.ready(init);
    dojo.connect(map, "onClick", addCircle);
}

function coreFunctions() {
    try {
        addLayersToMap();
    }
    catch (err) {
        console.log(err);
    }
}
function addLayersToData() {
    var layer = new esri.layers.ArcGISTiledMapServiceLayer("https://www.onemap.sg/ArcGIS/rest/services/BASEMAP/MapServer");
    mapLayers.push(layer);
    var layer2 = new esri.layers.ArcGISTiledMapServiceLayer("http://www.onemap.sg/ArcGIS/rest/services/LOT_VIEW/MapServer");
    mapLayers.push(layer2);
    layer2.hide();
}

function addLayersToMap() {
    addLayersToData();
    for (var a = 0; a < mapLayers.length; a++) {
        map.addLayer(mapLayers[a]);
    }
    map.setZoom(1);
}
dojo.require(“esri.map”);
dojo.require(“esri.tasks.servicerage”);
dojo.require(“dijit.dijit”);
require(“dijit.layout.BorderContainer”);
require(“dijit.layout.ContentPane”);
dojo.require(“esri/layers/FeatureLayer”);
dojo.require(“esri/symbols/SimpleMarkerSymbol”);
var mapLayers=新数组();
var映射;
var-GL=null;
函数setMap(){
函数init(){
要求(
[
“esri/map”,
“dojo/dom构造”,
“dojo/domReady!”,
“esri/tasks/GeometryService”
],
作用
(
地图,
domConstruct
) {
map=map(“映射画布”,
{
//信息窗口:弹出窗口
});
map.setZoom(1);
核心函数();
});
}
dojo.ready(init);
connect(映射“onClick”,addCircle);
}
函数coreffunctions(){
试一试{
addLayersToMap();
}
捕捉(错误){
控制台日志(err);
}
}
函数addLayersToData(){
var layer=新esri.layers.ArcGISTiledMapServiceLayer(“https://www.onemap.sg/ArcGIS/rest/services/BASEMAP/MapServer");
mapLayers.push(图层);
var layer2=新esri.layers.ARCGISTILEDAPSERVICELAYER(“http://www.onemap.sg/ArcGIS/rest/services/LOT_VIEW/MapServer");
mapLayers.push(第2层);
第2层隐藏();
}
函数addLayersToMap(){
addLayersToData();
对于(var a=0;a
这是另一种方法,我试着在地图上画一个圆圈:

function addCircle(e) {
sym = new esri.symbol.SimpleFillSymbol().setColor(new dojo.Color([180, 0, 180, 1.0]));

console.log("clicked the map: ", e);
var pt, radius, circle, ring, pts, angle;

pt = e.mapPoint;
circle = new esri.geometry.Polygon(map.spatialReference);
ring = []; // point that make up the circle
pts = 40; // number of points on the circle
angle = 360 / pts; // used to compute points on the circle
for (var i = 1; i <= pts; i++) {
    // convert angle to raidans
    var radians = i * angle * Math.PI / 180;;
    // add point to the circle
    ring.push([pt.x + radius * Math.cos(radians), pt.y + radius * Math.sin(radians)]);
    console.log(ring[i]);
}
ring.push(ring[0]); // start point needs to == end point
circle.addRing(ring);
map.graphics.add(new esri.Graphic(circle, sym));
console.log("added a graphic");
}
函数addCircle(e){
sym=新的esri.symbol.SimpleFillSymbol().setColor(新的dojo.Color([180,0,180,1.0]);
log(“单击地图:”,e);
变量pt、半径、圆、环、pt、角度;
pt=e.mapPoint;
圆=新esri.geometry.Polygon(地图空间参考);
环=[];//构成圆的点
pts=40;//圆上的点数
角度=360/pts;//用于计算圆上的点

对于(var i=1;i您非常非常接近-唯一的问题是您从未设置变量的值
radius
,因此所有坐标都被计算为
pt.x+(无)*Math.cos(弧度)
…在javascript中是
NaN
。我在
for
循环之前添加了
radius=100;
,一切都很好


这实际上是一个很容易调试的错误。我认为,如果你没有使用Chrome进行ESRI JS开发,那么你应该这样做——它内置的开发工具非常适合检查对象属性。我解决问题的方法就是将
map.graphics.graphics
数组转储到控制台,然后你可以深入到
geometry.rings
每个数组元素,并很快计算出每个点都有
x=NaN
y=NaN
,从那里可以明显看出您的计算有问题。

在API版本3.8中,已经有一个类用于此任务,使用该类您甚至可以绘制测地圆。

第二个代码块的第二行-应该是
esri.tasks.GeometryService
?@Juffy是的,我更改了它,但问题仍然存在。我尝试了另一种方法,创建一个proxy.ashx,因为根据我的研究,我认为请求太长,所以它可能必须使用代理。但是,仍然没有运气。你有吗有没有其他方法可以解决这个问题?你有空的时候能检查一下我编辑的部分吗?嗯…好吧,我有点搞不清楚我们在说什么错误-代理未设置或geometryservice未定义。你能把你的问题整理一下,一次只问一件事吗?:)@Juffy你好Juffy,我已经更改了问题。请在您有空时帮我看一看。谢谢您的帮助!半径是问题之一。但是地图空间参考存在另一个问题,导致圆没有显示在地图上。我已经解决了它。