ArcGIS Circle Buffer

Я застрял, пытаясь нарисовать простой круговой буфер с помощью 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);
}

Итак, вот еще один метод, в котором я пытаюсь нарисовать круговую графику на карте:

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");
}

Он выполнил функцию, но на карте нет круга и сообщения об ошибке. Интересно, какая часть моей логики пошла не так?

Заранее спасибо.


person Community    schedule 09.07.2014    source источник
comment
Вторая строка вашего второго блока кода - это должно быть esri.tasks.GeometryService?   -  person Juffy    schedule 10.07.2014
comment
@Juffy Да, я изменил его, но проблема не исчезла. Я пробовал использовать другой метод - создать proxy.ashx, потому что из того, что я получил в результате исследования, я считаю, что запрос слишком длинный, поэтому, возможно, придется использовать прокси. Но все равно не повезло. Есть ли у вас альтернативный способ решить эту проблему? Можете ли вы проверить мою отредактированную часть, когда будете свободны?   -  person    schedule 10.07.2014
comment
Умм ... хорошо, я немного не понимаю, о какой ошибке мы говорим - прокси не установлен или геометрическая служба не определена. Не могли бы вы прояснить свой вопрос и задавать по одному, пожалуйста? :)   -  person Juffy    schedule 10.07.2014
comment
@Juffy Привет, Джаффи, я уже изменил вопрос. Помогите мне взглянуть, когда вы освободитесь.   -  person    schedule 10.07.2014


Ответы (2)


Вы очень, очень близки - единственная проблема в том, что вы никогда не устанавливаете значение своей переменной radius, поэтому все ваши координаты вычисляются как _2 _...., что в javascript равно NaN. Я добавил radius = 100; перед вашим for циклом, и все работает нормально.

На самом деле эту ошибку довольно легко отладить. ИМО, если вы не используете Chrome для разработки ESRI JS, тогда вам следует - его встроенные инструменты разработчика отлично подходят для изучения свойств объекта. Я решил, что происходит, просто выгрузил массив map.graphics.graphics в консоль - затем вы можете развернуть geometry.rings каждого элемента массива и очень быстро определить, что каждая точка имеет x = NaN и y = NaN, и оттуда очевидно что что-то не так с вашим расчетом.

person Juffy    schedule 11.07.2014
comment
Спасибо за помощь! Радиус - одна из проблем. Но есть еще одна проблема с пространственной привязкой карты, из-за которой круг не отображается на карте. Я это уже решил. - person ; 14.07.2014

В версии API 3.8 уже есть класс для этой задачи https://developers.arcgis.com/javascript/jsapi/circle-amd.html с помощью этого класса вы даже можете рисовать геодезические круги.

person mchepurnoy    schedule 14.07.2014