[mapguide-users] How to add layer to the map on the fly???

MichaelGl michael_gl at stav-gis.com
Thu Nov 19 06:43:54 EST 2009


I'm trying to add temporary layer to the map and I'm fail. Please help...
I have a button :
<input type="button" value="Start" onclick="DigitizePolygon();">
This is the client side code :
<script type="text/javascript">

    function submitRequest() 
    {
        var pageUrl =
document.getElementById("hfTargetURL").getAttribute("value");
        var pointsStr =
document.getElementById("hfPoints").getAttribute("value");
        params = new Array(
                        "SESSION", parent.parent.mapFrame.GetSessionId(),
                        "MAPNAME", parent.parent.mapFrame.GetMapName(),
                        "POINTS", pointsStr
                        );
        
        parent.parent.formFrame.Submit(pageUrl, params, "scriptFrame");
    }
        
    function DigitizePolygon() 
    {
        var lblBox = document.getElementsByName("lblArea");
        lblBox[0].innerText = "";
        parent.parent.mapFrame.DigitizePolygon(OnPolygonDigitized);
    }

    function OnPolygonDigitized(poly) 
    {
        ShowResults(CalculatePolygonArea(poly));
    }

    function CalculatePolygonArea(line) 
    {
        var str = "";
        var res = 0;
        var tmpInt = 0;
        var pointsStr = line.Count.toString() + ",";
        for (var i = (line.Count - 1); i > 0; i--)
        {
            var currP = line.Point(i);
            var nextP = line.Point(i - 1);
            res += ((currP.X * nextP.Y) - (nextP.X * currP.Y));
            pointsStr += currP.X.toString() + "," + currP.Y.toString() +
",";
            if (i == 1)
            {
                pointsStr += nextP.X.toString() + "," + nextP.Y.toString();
            }
        }
        res /= 2;
        tmpInt = parseInt(res * 100);
        res = tmpInt / 100;
        res = (res < 0) ? (res * -1) : res;
        str = res.toString();
        document.getElementById("hfPoints").setAttribute("value",
pointsStr);
        
        return str;
    }
    
    function ShowResults(res) 
    {
        var lblBox = document.getElementsByName("lblArea");
        lblBox[0].innerText = res ;
        submitRequest();
    }    
    
</script>

I'm passing all the points of the digitized polygon to the server side,and
this is the code of the server side 
C# :

<script runat="server">
    ArrayList xpts = new ArrayList();
    ArrayList ypts = new ArrayList();
    const string templPath = "c:\\Program
Files\\MapGuideOpenSource2.0\\WebServerExtensions\\www\\viewerfiles\\";

    protected void Page_Load(object sender, EventArgs e)
    {
        double centerX, centerY;
        NameValueCollection requestParams;

        try
        {
            //  Initialize and get request parameters
            InitializeWebTier();
            requestParams = GetRequestParameters();
            String mgSessionId = requestParams["SESSION"];
            String mgLocale = requestParams["LOCALE"];
            String mgMapName = requestParams["MAPNAME"];
            string pointsStr = requestParams["POINTS"];
            string layerName = "Lines";
            string layerLegendLabel = "New Lines";
            string groupName = "Analysis";
            string groupLegendLabel = "Analysis";
            string featureSourceName = "Session:" + mgSessionId +
"//TemporaryLines.FeatureSource";

            BuildPointsLists(pointsStr);
            //  Connect to the site and create a session
            MgUserInformation userInfo = new MgUserInformation(mgSessionId);
            MgSiteConnection siteConnection = new MgSiteConnection();
            siteConnection.Open(userInfo);

            // Get an instance of the required service.
            MgResourceService resourceService =
siteConnection.CreateService(MgServiceType.ResourceService) as
MgResourceService;
            MgFeatureService featureService =
siteConnection.CreateService(MgServiceType.FeatureService) as
MgFeatureService;

            //  Initiate the map
            MgMap map = new MgMap(siteConnection);
            map.Open(mgMapName);

            MgResourceIdentifier resId = new
MgResourceIdentifier(featureSourceName);
            bool featureSourceExists = DoesResourceExist(resId,
resourceService);

            if (featureSourceExists == false)
            {
                // Create a temporary feature source to draw the lines on

                // Create a feature class definition for the new feature
source
                MgClassDefinition classDefinition = new MgClassDefinition();
                classDefinition.SetName("Lines");
                classDefinition.SetDescription("Lines to display.");
                string geometryPropertyName = "SHPGEOM";
               
classDefinition.SetDefaultGeometryPropertyName(geometryPropertyName);

                // Create an identify property
                MgDataPropertyDefinition identityProperty = new
MgDataPropertyDefinition("KEY");
                identityProperty.SetDataType(MgPropertyType.Int32);
                identityProperty.SetAutoGeneration(true);
                identityProperty.SetReadOnly(true);

                // Add the identity property to the class definition
               
classDefinition.GetIdentityProperties().Add(identityProperty);
                classDefinition.GetProperties().Add(identityProperty);
                // Create a name property
                MgDataPropertyDefinition nameProperty = new
MgDataPropertyDefinition("NAME");
                nameProperty.SetDataType(MgPropertyType.String);

                // Add the name property to the class definition
                classDefinition.GetProperties().Add(nameProperty);

                // Create a geometry property
                MgGeometricPropertyDefinition geometryProperty = new
MgGeometricPropertyDefinition(geometryPropertyName);
               
geometryProperty.SetGeometryTypes(MgFeatureGeometricType.Surface);

                // Add the geometry property to the class definition
                classDefinition.GetProperties().Add(geometryProperty);

                // Create a feature schema
                MgFeatureSchema featureSchema = new
MgFeatureSchema("SHP_Schema", "Line schema");

                // Add the feature schema to the class definition
                featureSchema.GetClasses().Add(classDefinition);

                // Create the feature source
                string wkt = map.GetMapSRS();
                MgCreateSdfParams sdfParams = new MgCreateSdfParams("spatial
context", wkt, featureSchema);
                featureService.CreateFeatureSource(resId, sdfParams);
            }
            // Add the line to the feature source
            MgBatchPropertyCollection batchPropertyCollection = new
MgBatchPropertyCollection();
            for (int idx = 0; idx < xpts.Count - 1; idx++)
            {
                string lineName = "Line " + (idx + 1).ToString();
                MgPropertyCollection propertyCollection = MakeLine(lineName,
                                                                   
Convert.ToDouble(xpts[idx]),
                                                                   
Convert.ToDouble(ypts[idx]),
                                                                   
Convert.ToDouble(xpts[idx + 1]),
                                                                   
Convert.ToDouble(ypts[idx + 1]));
                batchPropertyCollection.Add(propertyCollection);
            }
            ////////////////////////////////////////////
            // Add the batch property collection to the feature source
            MgInsertFeatures cmd = new MgInsertFeatures(layerName,
batchPropertyCollection);
            MgFeatureCommandCollection featureCommandCollection = new
MgFeatureCommandCollection();
            featureCommandCollection.Add(cmd);

            // Execute the "add" commands
            featureService.UpdateFeatures(resId, featureCommandCollection,
false);

            //---------------------------------------------------//
            bool layerExists = DoesLayerExist(layerName, map);
            if (layerExists == false)
            {
                // Create a new layer which uses that feature source         

                // Create a line rule to stylize the lines
                string ruleLegendLabel = "Lines Rule";
                string filter = "";
                string color = "FF0000FF";
                string lineRule = ReadFileAsString(templPath +
"linerule.templ");
                String[] vals = { ruleLegendLabel, filter, color };
                lineRule = Substitute(lineRule, vals);

                // Create a line type style
                string lineTypeStyle = ReadFileAsString(templPath +
"linetypestyle.templ");
                String[] valsStyle = { lineRule };
                lineTypeStyle = Substitute(lineTypeStyle, valsStyle);

                // Create a scale range
                string minScale = "0";
                string maxScale = "1000000000000";
                string lineScaleRange = ReadFileAsString(templPath +
"scalerange.templ");
                String[] valsScale = { minScale, maxScale, lineTypeStyle };
                lineScaleRange = Substitute(lineScaleRange, valsScale);

                // Create the layer definiton
                string featureName = "SHP_Schema:Lines";
                string geometry = "SHPGEOM";
                string layerDefinition = ReadFileAsString(templPath +
"layerdefinition.templ");
                String[] valsLayerDef = { featureSourceName, featureName,
geometry, lineScaleRange };
                layerDefinition = Substitute(layerDefinition, valsLayerDef);

                //---------------------------------------------------//  
                // Add the layer to the map
                MgLayer newLayer = new MgLayer(resId, resourceService);
                newLayer.SetName(layerName);
                newLayer.SetLegendLabel(layerLegendLabel);
                newLayer.SetLayerDefinition(resId, resourceService);
///???????????????
                // Add the layer to a layer group
                MgLayerGroup newGroup = new MgLayerGroup(groupName);
                newGroup.SetLegendLabel(layerLegendLabel);
                map.GetLayerGroups().Add(newGroup);
                map.GetLayers().Insert(0, newLayer);
            }
            // --------------------------------------------------//
            // Turn on the visibility of this layer.
            // (If the layer does not already exist in the map, it will be
visible by default when it is added.
            // But if the user has already run this script, he or she may
have set the layer to be invisible.)
            MgLayerCollection layerCollection = map.GetLayers();
            if (layerCollection.Contains(layerName))
            {
                MgLayerBase linesLayer = layerCollection.GetItem(layerName);
                linesLayer.SetVisible(true);
            }
            MgLayerGroupCollection groupCollection = map.GetLayerGroups();
            if (groupCollection.Contains(groupName))
            {
                MgLayerGroup analysisGroup =
groupCollection.GetItem(groupName);
                analysisGroup.SetVisible(true);
            }
            //---------------------------------------------------//
            //  Save the map back to the session repository
            string sessionIdName = "Session:" + mgSessionId + "//" +
mgMapName + ".Map";
            MgResourceIdentifier sessionResourceID = new
MgResourceIdentifier(sessionIdName);
            sessionResourceID.Validate();
            map.Save(resourceService, sessionResourceID);
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
    }

    void BuildPointsLists(string p_pointsStr)
    {
        string[] parameters = p_pointsStr.Split(',');
        int length = Convert.ToInt32(parameters[0]);

        for (int idx = 1; idx <= (length * 2); idx+=2)
        {
            xpts.Add(Convert.ToDouble(parameters[idx]));
            ypts.Add(Convert.ToDouble(parameters[idx + 1]));
        }
    } 
   
///////////////////////////////////////////////////////////////////////////////////
    bool DoesResourceExist(MgResourceIdentifier p_redId, MgResourceService
p_resSrvc)
    // Returns true if the resource already exists, or false otherwise
    {
        try 
        {
            p_resSrvc.GetResourceContent(p_redId);
        }
        catch (MgResourceNotFoundException e)
        {
           return false;
        }   

        return true;
    }
  
   
///////////////////////////////////////////////////////////////////////////////////    
    MgPropertyCollection MakeLine(string p_name, double p_x0, double p_y0 ,
double p_x1, double p_y1)
    {
        MgPropertyCollection propertyCollection = new
MgPropertyCollection();
        MgStringProperty nameProperty = new MgStringProperty("NAME",
p_name);
        propertyCollection.Add(nameProperty);

        MgWktReaderWriter wktReaderWriter = new MgWktReaderWriter();
        MgAgfReaderWriter agfReaderWriter = new MgAgfReaderWriter();

        string linestring = "LINESTRING XY (" + p_x0.ToString() + " " +
p_y0.ToString() + ", " +
            p_x1.ToString() + " " + p_y1.ToString() + ")";
        MgGeometry geometry = wktReaderWriter.Read(linestring) as
MgLineString;
        MgByteReader geometryByteReader = agfReaderWriter.Write(geometry);
        MgGeometryProperty geometryProperty = new
MgGeometryProperty("SHPGEOM", geometryByteReader);
        propertyCollection.Add(geometryProperty);

        return propertyCollection;
    }
   
///////////////////////////////////////////////////////////////////////////////////    
    bool DoesLayerExist(string p_layerName, MgMap p_map)
    // Returns true if the layer already exists, or false otherwise
    {
        MgLayerCollection layerCollection = p_map.GetLayers();
        return (layerCollection.Contains(p_layerName) ? true : false);
    }
   
///////////////////////////////////////////////////////////////////////////////////    
    string ReadFileAsString(string p_fName)
    {
        string sContents = string.Empty;
        System.IO.StreamReader sr = new System.IO.StreamReader(p_fName);
        sContents = sr.ReadToEnd();
        sr.Close();
        
        return sContents;
    }   
   
///////////////////////////////////////////////////////////////////////////////////
    String Substitute(String templ, String[] vals)
    {
        StringBuilder res = new StringBuilder();
        int index = 0, val = 0;
        bool found;
        do
        {
            found = false;
            int i = templ.IndexOf('%', index);
            if (i != -1)
            {
                found = true;
                res.Append(templ.Substring(index, i - index));
                if (i < templ.Length - 1)
                {
                    if (templ[i + 1] == '%')
                        res.Append('%');
                    else if (templ[i + 1] == 's')
                        res.Append(vals[val++]);
                    else
                        res.Append('@');    //add a character illegal in
jscript so we know the template was incorrect
                    index = i + 2;
                }
            }
        } while (found);
        res.Append(templ.Substring(index));
        return res.ToString();
    }     
</script>


<script type="text/javascript">
    function OnPageLoad()
    {        
        parent.mapFrame.Refresh();
    }
</script>

The problem is that the polygon is not appear on the map. What am I
missing???
Thanks a lot.
-- 
View this message in context: http://n2.nabble.com/How-to-add-layer-to-the-map-on-the-fly-tp4031367p4031367.html
Sent from the MapGuide Users mailing list archive at Nabble.com.


More information about the mapguide-users mailing list