I get an error "Map: Geometry (wkid: 3301) cannot be converted to spatial reference of the map (wkid: 4326)" when I want to add only graphics layer.
I found that spatial reference for a map is defined either by the extent passed to the map constructor or by the first layer added to the map, so I think that problem is that my layer is defined without property about wkid. My question is how to properly define it.
My code is following (it works when I add wms layer first, but I want to add only the "vectorLayer"):
var map;
require([
'esri/map', 'esri/layers/WMSLayer', 'esri/layers/WMSLayerInfo', 'esri/geometry/Extent',
'dojo/_base/array', 'dojo/dom', 'dojo/dom-construct', 'dojo/parser',
'dijit/layout/BorderContainer', 'dijit/layout/ContentPane', "dojo/_base/json" , "esri/request", 'dojo/domReady!'
], function (Map, WMSLayer, WMSLayerInfo, Extent, array, dom, domConst, parser, dojoJson, esriRequest, request, xhr) {
parser.parse();
var spatialReference2 = new esri.SpatialReference({"wkt": 'PROJCS["Estonian Coordinate System of 1997",GEOGCS["EST97",DATUM["D_Estonia_1997",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Lambert_Conformal_Conic"],PARAMETER["standard_parallel_1",59.33333333333334],PARAMETER["standard_parallel_2",58],PARAMETER["latitude_of_origin",57.51755393055556],PARAMETER["central_meridian",24],PARAMETER["false_easting",500000],PARAMETER["false_northing",6375000],UNIT["Meter",1]]'
});
var map = new esri.Map("map",
{
spatialReference: spatialReference2,
center: new esri.geometry.Point(550000, 6520000, new esri.SpatialReference({ wkid: 3301 })),
extent: new esri.geometry.Extent(350000, 6370000, 750000, 6630000, new esri.SpatialReference({"wkid": 3301})),
zoom: 4
});
// var wmsLayer = new WMSLayer('http://kaart.maaamet.ee/wms/alus?', {
// resourceInfo: {
// extent: new Extent(350000, 6370000, 750000, 6630000, {
// wkid: 3301
// }),
// layerInfos: new WMSLayerInfo({
// name: 'MA-ALUS',
// title: 'Maaameti WMS MA-ALUS'
// })
// },
// visibleLayers: ['MA-ALUS']
// });
// map.addLayers([wmsLayer]);
var vectorLayer = new esri.layers.GraphicsLayer();
var layerUrl = 'http://loom-gis.geo.ut.ee:8080/geoserver/ermas/ows?service=WFS&' +
'version=1.1.0&request=GetFeature&typeName=ermas:testdata_geopnt&' +
'outputFormat=text/javascript&format_options=callback:loadFeatures&maxFeatures=300&' +
'srsname=EPSG:3301&EPSG:3301';
var loadFeatures = function (response) {
for (var i = 0; i < response.features.length; i++) {
var geometry = new esri.geometry.Point(response.features[i].geometry.coordinates[0], response.features[i].geometry.coordinates[1], new esri.SpatialReference({ wkid: 3301 }));
var symbol = new esri.symbol.SimpleMarkerSymbol();
var graphic = new esri.Graphic(geometry, symbol);
vectorLayer.add(graphic)
}
map.addLayers([vectorLayer]);
};
window.loadFeatures = loadFeatures
esri.request({
url: layerUrl,
content: { f: "json" },
handleAs: "json",
callbackParamName: "loadFeatures"
});
});
Best Answer
The solution is to add a dummy layer. We can create a "fake" feature layer from JSON to trick the map into the desired projection. This feature layer should have the target spatial reference.