AnsweredAssumed Answered

Add Shapefile code - Why all shapefile features shows the same location on map?

Question asked by Mayur_Dodiya on Feb 3, 2016
Latest reply on Nov 17, 2017 by ronaldvenegasp1991

I am developing the JS app using 3.15. I have tried this code in my app Add Shapefile  from the esri samples here

Add shapefile | ArcGIS API for JavaScript

but shapefile features added at the same location on map.If the polygon features it shows square but not the actual shape of the polygon.

My map intialextent and Spatialreference for basemap are

var initialExtent = new esri.geometry.Extent({
  "xmin": 51.53195000000005,
  "ymin": 22.62777042700003,
  "xmax": 56.01812603400003,
  "ymax": 25.164240001000053,
  "spatialReference": {
  "wkid": 4326

map = new Map("map", { extent: esri.geometry.geographicToWebMercator(initialExtent), zoom: 2, logo: false });


and code for add shapefile is following and attahced is the screenshot of result all features are at same location.

var portalUrl = "";

//var form = dom.byId("uploadFormShapefile");
// on(form, "form:click", function (event) {
on(dom.byId("uploadFormShapefile"), "change", function (event) {
  var fileName =;

  if (sniff("ie")) { //filename is full path in IE so extract the file name
  var arr = fileName.split("\\");
  fileName = arr[arr.length - 1];
  if (fileName.indexOf(".zip") !== -1) {//is file a zip - if not notify user
  else {
  dom.byId('upload-status').innerHTML = '<p style="color:red">Add shapefile as .zip file</p>';

function generateFeatureCollectionShapeFile(fileName) {
  var name = fileName.split(".");
  //Chrome and IE add c:\fakepath to the value - we need to remove it
  //See this link for more info:
  name = name[0].replace("c:\\fakepath\\", "");

  dom.byId('upload-status').innerHTML = '<b>Loading </b>' + name;

  //Define the input params for generate see the rest doc for details
  var params = {
  'name': name,
  'targetSR': map.spatialReference,
  'maxRecordCount': 1000,
  'enforceInputFileSizeLimit': true,
  'enforceOutputJsonSizeLimit': true

  //generalize features for display Here we generalize at 1:40,000 which is approx 10 meters
  //This should work well when using web mercator.

  var extent = esri.geometry.getExtentForScale(map, 40000);
  //var extent = scaleUtils.getExtentForScale(map, 40000); //new esri.geometry.geographicToWebMercator(scaleUtils.getExtentForScale(map, 40000));
  var resolution = extent.getWidth() / map.width;
  params.generalize = true;
  params.maxAllowableOffset = resolution;
  params.reducePrecision = true;
  params.numberOfDigitsAfterDecimal = 0;

  var myContent = {
  'filetype': 'shapefile',
  'publishParameters': JSON.stringify(params),
  'f': 'json',
  'callback.html': 'textarea'

  //use the rest generate operation to generate a feature collection from the zipped shapefile
  url: portalUrl + '/sharing/rest/content/features/generate',
  content: myContent,
  form: dom.byId('uploadFormShapefile'),
  handleAs: 'json',
  load: lang.hitch(this, function (response) {
  if (response.error) {
  var layerName = response.featureCollection.layers[0];
  dom.byId('upload-status').innerHTML = '<b>Loaded: </b>' + layerName;
  error: lang.hitch(this, errorHandler)
function errorHandler(error) {
  dom.byId('upload-status').innerHTML =
  "<p style='color:red'>" + error.message + "</p>";
function addShapefileToMap(featureCollection) {
  //add the shapefile to the map and zoom to the feature collection extent
  //If you want to persist the feature collection when you reload browser you could store the collection in
  //local storage by serializing the layer using featureLayer.toJson() see the 'Feature Collection in Local Storage' sample
  //for an example of how to work with local storage.
  var fullExtent;
  var layers = [];

  arrayUtils.forEach(featureCollection.layers, function (layer) {
  var infoTemplate = new InfoTemplate("Details", "${*}");
  var featureLayer = new FeatureLayer(layer, {
  infoTemplate: infoTemplate
  //associate the feature with the popup on click to enable highlight and zoom to
  featureLayer.on('click', function (event) {
  //change default symbol if desired. Comment this out and the layer will draw with the default symbology
  fullExtent = fullExtent ?
  fullExtent.union(featureLayer.fullExtent) : featureLayer.fullExtent;
  map.setExtent(fullExtent.expand(1.25), true);

  dom.byId('upload-status').innerHTML = "";
function changeRenderer(layer) {
  //change the default symbol for the feature collection for polygons and points
  var symbol = null;
  switch (layer.geometryType) {
  case 'esriGeometryPoint':
  symbol = new PictureMarkerSymbol({
  'angle': 0,
  'xoffset': 0,
  'yoffset': 0,
  'type': 'esriPMS',
  'url': 'images/BluePin1LargeB.png',
  'contentType': 'image/png',
  'width': 20,
  'height': 20
  case 'esriGeometryPolygon':
  symbol = new SimpleFillSymbol(SimpleFillSymbol.STYLE_SOLID,
  new SimpleLineSymbol(SimpleLineSymbol.STYLE_SOLID,
  new Color([112, 112, 112]), 1), new Color([136, 136, 136, 0.25]));
  if (symbol) {
  layer.setRenderer(new SimpleRenderer(symbol));