Я работаю над приложением, которое будет извлекать данные из разных источников и создавать объекты ESRI GraphicsLayer из данных и отображать их на карте. Я создал пользовательские FeatureLayers раньше, но для этого проекта требуется использование GraphicsLayers, потому что мне нужно иметь возможность переключать видимость слоев. Код ниже извлекает данные с хоста и помещает его в GraphicsLayer.Пользовательский графический слой ArcGIS (JavaScript)
define(["dojo/_base/declare", "dojo/_base/array", "dojo/request", "esri/graphic", "esri/geometry/Geometry", "esri/InfoTemplate"],
function(declare, array, request, Graphic, Geometry, InfoTemplate) {
return declare(null, {
getAllCurrentReadings: function() {
var rtn = [];
var stations = ["S", "SN", "AN", "UP", "GR", "PL", "SR", "J", "N", "FL"];
array.forEach(stations, function(item, i) {
request.post("includes/buoybay_proxy.php", {
data: {
"method": "RetrieveCurrentReadings",
"params": "CBIBS," + item + ",113f8b...f27e0a0bb" // NOTE: id: 1 is necessary as well but is added manually by jsonRPCClient
},
sync: true,
handleAs: "json"
}).then(
function(response) {
var gfx, attr, t;
//console.log(response);
// Now build the Graphic Object and push it into rtn
gfx = new Graphic();
gfx.spatialReference = {
wkid: 102100
};
// Define attribute object
attr = {};
attr["station"] = response.station;
attr["title"] = translateStationID(response.station);
for (var j = 0; j < response.measurement.length; j++) {
attr[String(response.measurement[j])] = response.value[j];
}
gfx.attributes = attr;
// Define geometry object
gfx.geometry = new Geometry(gfx.spatialReference, "point");
gfx.geometry.spatialReference = {
wkid: 102100
};
gfx.geometry.type = "point";
t = esri.geometry.geographicToWebMercator(new esri.geometry.Point(attr["longitude"], attr["latitude"], gfx.spatialReference));
gfx.geometry.x = t.x;
gfx.geometry.y = t.y;
// Define infoTemplate object
gfx.infoTemplate = new esri.InfoTemplate();
gfx.infoTemplate.setTitle(attr["title"]);
gfx.infoTemplate.setContent("${*}");
// Define symbol
gfx.symbol = new esri.symbol.PictureMarkerSymbol("../images/marker.png", 15, 15);
//console.log(gfx);
rtn.push(gfx);
},
function(error) {
console.log("Error: " + error + "\n");
}
)
});
//console.log(rtn);
return rtn;
}
})
})
Этот код кажется построить GraphicsLayers правильно, но когда я добавляю их к объекту карты нет точек отображаются на карте. Код, который я использую для добавления их в объект карты, приведен ниже.
require(["dojo/parser", "dojo/_base/array", "dijit/layout/BorderContainer", "dijit/layout/ContentPane", "dojo/ready", "esri/map", "esri/layers/ArcGISTiledMapServiceLayer", "js/cbibsGfxModule", "dojo/domReady!"],
function(parser, array, BorderContainer, ContentPane, ready, map, ArcGISTiledMapServiceLayer, cbibsGfxModule) {
var Map, cbibs, gfxLayer, t = [];
function init() {
Map = new map("mapDiv", {
basemap: "oceans",
center: [-77.0357, 38.7877],
zoom: 7
});
dojo.connect(Map, "onLoad", displayData); // Map didn't load until 3rd arg was a function name; why?
function displayData() {
cbibs = new cbibsGfxModule();
t = cbibs.getAllCurrentReadings();
gfxLayer = new esri.layers.GraphicsLayer();
array.forEach(t, function(item) {
gfxLayer.add(item);
Map.graphics.add(item);
});
gfxLayer.spatialReference = {
wkid: 102100
};
//Map.addLayer(gfxLayer); // Add GraphicsLayer to Map object
console.log(Map); // Custom GraphicLayers are under _layers
};
};
dojo.ready(init);
}
);
Я понимаю, что gfxLayer.add(item)
и Map.graphics.add(item)
несколько излишним, но даже с данными в двух местах в карте объекта точки все еще не отображаются на карте.
Я работаю над этим в течение некоторого времени, и я действительно свеж от идей. Любая помощь, которую может предложить любой человек, будет очень благодарна. Спасибо.
Ответил ли мой ответ на ваш вопрос? Если это так, вы должны это принять. –
No Dave Очки все еще не нарисованы, но я ценю вашу помощь. Вы прояснили мне одну вещь, поэтому я дал ей голос. –