Select to view content in your preferred language

JSON.encode(graphic:Graphic)

843
2
05-04-2010 05:33 AM
TomSchuller
Frequent Contributor
Hy,
I'm trying to encode a graphic object into a json string.
I got translated the geometry but the symbology is ignored.

var myGraphimyGraphic.geometry = new MapPoint(70000,71000);
myGraphic.symbol = new SimpleMarkerSymbol("cross");
var jsonStr = JSON.encode(myGraphic);
trace(jsonStr);


The jsonStr variable has the value:
  {"geometry":{"x":70000,"y":71000}}

Why is the symbology ignored in the JSON.encode method?

Thanks,
Tom
Tags (2)
0 Kudos
2 Replies
RobertScheitlin__GISP
MVP Emeritus
Tom,

    I ran into the same issue and had to manually specify my symbology in my data before encoding. Maybe the API team can explain this limitation or agree to fix the issue, but until then here is what I did.

private function addGras():void 
   {
    drawAC = new ArrayCollection();
    var i:Number;
    var symTypeName:String = "";
    var symType:String = "";
    var symLType:String = "";
    var symFontE:String = "";
    var symSize:Number = 1;
    var symColor:Number = 0x000000;
    var symColor2:Number = 0x000000;
    var symWidth:Number = 1;
    var symText:String = "";
    var symAlpha1:Number = 1;
    var symAlpha2:Number = 1;
    var geomType:String = "";
    var geomSR:Number;
    var gname:String = "";
    
    for (i = 0; i < graphicsLayer.numGraphics; i++)
    {
     var geomArray:Array = [];
     symText = "";
     var gra:Graphic = graphicsLayer.getChildAt(i) as Graphic;
     switch(gra.geometry.type)
     {
      case Geometry.MAPPOINT:
         {
          if (gra.symbol is TextSymbol) {
           var txtSym:TextSymbol = gra.symbol as TextSymbol;
           symTypeName = "TextSymbol";
           var txtFormat:TextFormat = txtSym.textFormat;
           if(useDefaultFont){
            symType = "Arial"
           }else{
            symType = txtFormat.font
           }
           symText = txtSym.text;
           if (txtFormat.bold)
            symFontE += "B"
           if (txtFormat.italic)
            symFontE += "I"
           if (txtFormat.underline)
            symFontE += "U"
           symSize = Number(txtFormat.size);
           symColor = Number(txtFormat.color);
          } else {
           var ptSym:SimpleMarkerSymbol = gra.symbol as SimpleMarkerSymbol;
           symTypeName = "SimpleMarkerSymbol";
           symType = ptSym.style;
           symColor = ptSym.color;
           symSize = ptSym.size;
           symAlpha1 = ptSym.alpha;
           symColor2 = ptSym.outline.color;
           symAlpha2 = ptSym.outline.alpha;
           symWidth = ptSym.outline.width;
           symLType = ptSym.outline.style;
          }
          geomType = "MAPPOINT";
          var pnt:MapPoint = gra.geometry as MapPoint;
          geomSR = gra.geometry.spatialReference.wkid
          geomArray.push(pnt);
          break;
         }
         case Geometry.POLYLINE:
         {
          var lineSym:SimpleLineSymbol = gra.symbol as SimpleLineSymbol;
          symTypeName = "SimpleLineSymbol";
          symType = lineSym.style;
          symWidth = lineSym.width;
          symAlpha1 = lineSym.alpha;
          symColor = lineSym.color;
          geomType = "POLYLINE";
          var polyline:Polyline = gra.geometry as Polyline;
          for (var i1:int = 0; i1 < polyline.paths.length; i1++)
          {
           for (var j:int = 0; j < polyline.paths[i1].length; j++)
           {
            var mp:MapPoint = polyline.getPoint(i1,j) as MapPoint;
            geomArray.push(mp);
           }
          }
          geomSR = gra.geometry.spatialReference.wkid
          break;
         }
         case Geometry.POLYGON:
         {
          var polySym:SimpleFillSymbol = gra.symbol as SimpleFillSymbol;
          symTypeName = "SimpleFillSymbol";
          symType = polySym.style;
          symWidth = polySym.outline.width;
          symLType = polySym.outline.style;
          symAlpha1 = polySym.alpha;
          symAlpha2 = polySym.outline.alpha
          symColor = polySym.color;
          symColor2 = polySym.outline.color;
          geomType = "POLYGON";
          var poly:Polygon= gra.geometry as Polygon;
          for (var i2:int = 0; i2 < poly.rings.length; i2++)
          {
           for (var j1:int = 0; j1 < poly.rings[i2].length; j1++)
           {
            var mp2:MapPoint = poly.getPoint(i2,j1) as MapPoint;
            geomArray.push(mp2);
           }
          }
          geomSR = gra.geometry.spatialReference.wkid
          break;
         }
         case Geometry.EXTENT:
         {
          var rectSym:SimpleFillSymbol = gra.symbol as SimpleFillSymbol;
          symTypeName = "SimpleFillSymbol";
          symType = rectSym.style;
          symWidth = rectSym.outline.width;
          symLType = rectSym.outline.style;
          symAlpha1 = rectSym.alpha;
          symAlpha2 = rectSym.outline.alpha
          symColor = rectSym.color;
          symColor2 = rectSym.outline.color;
          geomType = "EXTENT";
          var rect:Extent= gra.geometry as Extent;
          var mp3:MapPoint;
          mp3 = new MapPoint(rect.xmin, rect.ymin, gra.geometry.spatialReference);
          geomArray.push(mp3);
          mp3 = new MapPoint(rect.xmax, rect.ymax, gra.geometry.spatialReference);
          geomArray.push(mp3);
          geomSR = gra.geometry.spatialReference.wkid
          break;
         }
     }
     var gObj:Object = {
      geomtype: geomType,
      geomarray: geomArray,
      geomsr: geomSR,
      symtypename: symTypeName,
      symtype: symType,
      symsize: symSize,
      symcolor: symColor,
      symcolor2: symColor2,
      symwidth: symWidth,
      symtext: symText,
      symalpha1: symAlpha1,
      symalpha2: symAlpha2,
      cmenu: gra.contextMenu,
      symfonte: symFontE,
      symltype: symLType,
      gname: gra.name
     }
     drawAC.addItem(gObj);
    }
    if(!fr) fr = new FileReference();
    fr.save(JSON.encode(drawAC.source),"SavedGraphics.txt")
       graphicsLayer.clear();
   }
0 Kudos
TomSchuller
Frequent Contributor
Robert,
I just completed my own JSON encoding.
It's trying to reusing the REST-JSON format of the AGS Server:
  http://<agsserver>:8399/arcgis/sdk/rest/symbol.html

Below you can find my code (textsymbol is incomplete).

Tom

            private function jsonEncodeGraphic(graphic:Graphic):String {
                var graObj:Object = new Object();
                graObj.geometry = graphic.geometry;
                graObj.symbol = encodeSymbol(graphic.symbol);
                return JSON.encode(graObj);
            }

            private function encodeColor(color:uint, alpha:Number = 1):Array {
                var colorArray:Array = new Array();
                var alphaRestValue:uint = alpha * 255;
                var hexRep:String = color.toString(16);
                if (hexRep.length == 6) {
                    colorArray.push(new uint("0x" + hexRep.substring(0, 2)));
                    colorArray.push(new uint("0x" + hexRep.substring(2, 4)));
                    colorArray.push(new uint("0x" + hexRep.substring(4, 6)));
                } else if (hexRep.length == 4) {
                    colorArray.push(new uint(0));
                    colorArray.push(new uint("0x" + hexRep.substring(0, 2)));
                    colorArray.push(new uint("0x" + hexRep.substring(2, 4)));
                } else if (hexRep.length == 2) {
                    colorArray.push(new uint(0));
                    colorArray.push(new uint(0));
                    colorArray.push(new uint("0x" + hexRep.substring(0, 2)));
                } else {
                    colorArray.push(new uint(0));
                    colorArray.push(new uint(0));
                    colorArray.push(new uint(0));
                }
                colorArray.push(alphaRestValue);
                return colorArray;
            }

            private function encodeSymbol(symbol:Symbol):Object {
                var symbolObj:Object = new Object();
                if (symbol is TextSymbol) {
                    var textSym:TextSymbol = symbol as TextSymbol;
                    //not yet finished
                    symbolObj.type = "esriTS";
                    symbolObj.angle = textSym.angle;
                    symbolObj.color = encodeColor(textSym.color, textSym.alpha);
                    if (textSym.background)
                        symbolObj.backgroundColor = encodeColor(textSym.backgroundColor);
                    if (textSym.border)
                        symbolObj.borderLineColor = encodeColor(textSym.borderColor);
                    symbolObj.xoffset = textSym.xoffset;
                    symbolObj.yoffset = textSym.yoffset;
                    symbolObj.text = textSym.text;
                    return symbolObj;
                } else if (symbol is SimpleMarkerSymbol) {
                    var markerSym:SimpleMarkerSymbol = symbol as SimpleMarkerSymbol;
                    symbolObj.type = "esriSMS";
                    symbolObj.style = symbolObj.type + markerSym.style.substring(0, 1).toUpperCase() + markerSym.style.substring(1);
                    symbolObj.color = encodeColor(markerSym.color, markerSym.alpha);
                    symbolObj.size = markerSym.size;
                    symbolObj.angle = markerSym.angle;
                    symbolObj.xOffset = markerSym.xoffset;
                    symbolObj.yOffset = markerSym.yoffset;
                    if (markerSym.outline) {
                        var outlineObj:Object = new Object();
                        outlineObj.color = encodeColor(markerSym.outline.color, markerSym.outline.alpha);
                        outlineObj.width = markerSym.outline.width;
                        outlineObj.style = markerSym.outline.style;
                        symbolObj.outline = outlineObj;
                    }
                    return symbolObj;
                } else if (symbol is SimpleLineSymbol) {
                    var lineSym:SimpleLineSymbol = symbol as SimpleLineSymbol;
                    symbolObj.type = "esriSLS";
                    symbolObj.style = symbolObj.type + lineSym.style.substring(0, 1).toUpperCase() + lineSym.style.substring(1);
                    symbolObj.color = encodeColor(lineSym.color, lineSym.alpha);
                    symbolObj.width = lineSym.width;
                    return symbolObj;
                } else if (symbol is SimpleFillSymbol) {
                    var fillSym:SimpleFillSymbol = symbol as SimpleFillSymbol;
                    symbolObj.type = "esriSFS";
                    symbolObj.style = symbolObj.type + fillSym.style.substring(0, 1).toUpperCase() + fillSym.style.substring(1);
                    symbolObj.color = encodeColor(fillSym.color, fillSym.alpha);
                    if (fillSym.outline)
                        symbolObj.outline = encodeSymbol(fillSym.outline);
                    return symbolObj;
                }
                Alert.show("Unknown SYMBOL type to convert to json: " + symbol);
                return null;
            }
0 Kudos