[GIS] Define spatial reference of layer in ArcGis JavaScript API

arcgis-javascript-apicoordinate systemlayers

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.

 var layerDefinition = {
        "extent": {
            "xmin": 0,
            "ymin": 0,
            "xmax": 0,
            "ymax": 0,
            "spatialReference": {
                "wkid": 3301,
                "latestWkid": 3301
            }
        },
        "fields": [{
            "name": "OBJECTID",
            "type": "esriFieldTypeOID",
            "alias": "OBJECTID",
            "domain": null
        }]
    }

    var featureCollection = {
        layerDefinition: layerDefinition,
        featureSet: null
    };

    var featureLayer = new esri.layers.FeatureLayer(featureCollection, {
        mode: esri.layers.FeatureLayer.MODE_SNAPSHOT
    });

    window.app.map.addLayers([featureLayer, vectorLayer]);