public static geKML ToKML(IEnumerable <Location> locations)
        {
            geDocument doc = new geDocument();

            doc.Name = "Locations exported";
            foreach (var loc in locations)
            {
                gePlacemark pm = new gePlacemark();

                //Create some coordinates for the point at which
                //this placemark will sit. (Lat / Lon)
                geCoordinates coords = new geCoordinates(new geAngle90(loc.Latitude), new geAngle180(loc.Longitude));

                //Create a point with these new coordinates
                gePoint point = new gePoint(coords);

                //Assign the point to the Geometry property of the
                //placemark.
                pm.Geometry = point;

                //Now lets add some other properties to our placemark
                pm.Name        = loc.Name;
                pm.Description = "Visit at: " + loc.Time.ToString();
                //Finally, add the placemark to the document
                doc.Features.Add(pm);
            }
            //Now that we have our document, lets create our KML
            geKML kml = new geKML(doc);

            return(kml);
        }
Exemple #2
0
        public static geKML RunExample(string FileName)
        {
            // Use a Document as the root of the KML
            geDocument doc = new geDocument();

            doc.Name = "My Root Document";

            // Create a new style to be added the doc
            geStyle myStyle = new geStyle("myStyle");

            //add a new IconStyle to the style
            myStyle.IconStyle       = new geIconStyle();
            myStyle.IconStyle.Icon  = new geIcon("Example2.png");
            myStyle.IconStyle.Scale = 2F; //or (float)2

            //Add the style
            doc.StyleSelectors.Add(myStyle);

            //Create a Placemark to put in the document
            //This placemark is going to be a point
            //but it could be anything in the Geometry class
            gePlacemark pm = new gePlacemark();

            //Create some coordinates for the point at which
            //this placemark will sit. (Lat / Lon)
            geCoordinates coords = new geCoordinates(
                new geAngle90(37.422067),
                new geAngle180(-122.084437));

            //Create a point with these new coordinates
            gePoint point = new gePoint(coords);

            //Assign the point to the Geometry property of the
            //placemark.
            pm.Geometry = point;

            //Set the placemark's style to the style we created above
            pm.StyleUrl = "#myStyle";

            //Now lets add some other properties to our placemark
            pm.Name        = "My Placemark";
            pm.Snippet     = "This is where I put my Placemark";
            pm.Description =
                "I wonder where this is...GOOGLE!";

            //Finally, add the placemark to the document
            doc.Features.Add(pm);

            //Now that we have our document, lets create our KML
            geKML kml = new geKML(doc);

            //Add supporting files to the KMZ (assuming it's going to be rendered as KMZ
            byte[] myFile = File.ReadAllBytes(AppDomain.CurrentDomain.BaseDirectory + "\\images\\Example2.png");
            kml.Files.Add("Example2.png", myFile);

            return(kml);
        }
Exemple #3
0
        public geDocument SqlGeogCommandToKmlDoc(string docname, string connstr, string cmdstr)
        {
            // Use a Document as the root of the KML
            geDocument doc = new geDocument();

            doc.Name = docname;

            //Finally, add the placemark to the document
            gePlacemark pm = null;

            pm = SqlGeogCommandToKmlPlacemark(connstr, cmdstr);
            if (pm != null)
            {
                doc.Features.Add(pm);
            }

            return(doc);
        }
Exemple #4
0
        public geFolder SqlGeogCommandToKmlFolder(string connstr, string cmdstr, string fldname)
        {
            geFolder fld = new geFolder();

            fld.Name = fldname;

            using (SqlConnection conn = new SqlConnection(connstr))
                using (SqlCommand cmd = new SqlCommand(cmdstr, conn))
                {
                    try
                    {
                        conn.Open();
                        SqlDataReader rdr = cmd.ExecuteReader();
                        while (rdr.Read())
                        {
                            SqlGeography geog = (SqlGeography)rdr.GetValue(0);
                            if (!IsNullOrEmpty(geog))
                            {
                                gePlacemark pm = new gePlacemark();

                                if (rdr.FieldCount == 3)
                                {
                                    pm = SqlGeogToKmlPlacemark(geog,
                                                               rdr.GetString(1),
                                                               rdr.GetString(2));
                                }
                                else
                                {
                                    pm = SqlGeogToKmlPlacemark(geog,
                                                               rdr.GetString(1),
                                                               rdr.GetString(1));
                                }
                                fld.Features.Add(pm);
                            }
                        }
                    }
                    catch
                    {
                        return(null);
                    }
                }

            return(fld);
        }
Exemple #5
0
    /// <summary>
    /// This kml will contain the data that will be refreshed according to what is defined in GetINIT()
    /// </summary>
    /// <returns></returns>
    public static geKML GetWebExample1Data()
    {
        geDocument doc = new geDocument();

        //you probably won't see this since the document is a child of a network link
        doc.Name    = "WebExample1Data";
        doc.Snippet = "This data should auto refresh based on the RefreshInterval of our parent NetworkLink";

        gePlacemark   pm    = new gePlacemark();
        geCoordinates coord = new geCoordinates(new geAngle90(37.422067), new geAngle180(-122.084437));
        gePoint       point = new gePoint(coord);

        //Just show the server dateTime so that we know it's updating as advertised.
        pm.Name        = DateTime.Now.ToString();
        pm.Description = "This data will be automatically refreshed based on the parent NetworkLink";
        pm.Geometry    = point;

        doc.Features.Add(pm);

        return(new geKML(doc));
    }
Exemple #6
0
        public static geKML RunExample(string FileName)
        {
            // Use a Document as the root of the KML
            geDocument doc = new geDocument();

            doc.Name = "My Root Document";

            //Create a Placemark to put in the document
            //This placemark is going to be a point
            //but it could be anything in the Geometry class
            gePlacemark pm = new gePlacemark();

            //Create some coordinates for the point at which
            //this placemark will sit. (Lat / Lon)
            geCoordinates coords = new geCoordinates(
                new geAngle90(37.422067),
                new geAngle180(-122.084437));

            //Create a point with these new coordinates
            gePoint point = new gePoint(coords);

            //Assign the point to the Geometry property of the
            //placemark.
            pm.Geometry = point;

            //Now lets add some other properties to our placemark
            pm.Name        = "My Placemark";
            pm.Snippet     = "This is where I put my Placemark";
            pm.Description =
                "I wonder where this is...";

            //Finally, add the placemark to the document
            doc.Features.Add(pm);

            //Now that we have our document, lets create our KML
            geKML kml = new geKML(doc);

            return(kml);
        }
Exemple #7
0
        public gePlacemark SqlGeogToKmlPlacemark(SqlGeography geog, string pname, string description)
        {
            if (IsNullOrEmpty(geog))
            {
                return(null);
            }

            gePlacemark pm = new gePlacemark();

            pm.Description = description;
            pm.Name        = pname;

            switch (geog.STGeometryType().Value)
            {
            case "Point":
                pm.Geometry = DoPoint(geog);
                break;

            case "LineString":
                pm.Geometry = DoLineString(geog);
                break;

            case "Polygon":
                pm.Geometry = DoPolygon(geog);
                break;

            case "MultiPoint":
            case "MultiLineString":
            case "MultiPolygon":
            case "GeometryCollection":
                pm.Geometry = DoMulti(geog);
                break;

            default:
                break;
            }

            return(pm);
        }
Exemple #8
0
        public gePlacemark SqlGeogCommandToKmlPlacemark(string connstr, string cmdstr)
        {
            gePlacemark pm = null;

            using (SqlConnection conn = new SqlConnection(connstr))
                using (SqlCommand cmd = new SqlCommand(cmdstr, conn))
                {
                    try
                    {
                        conn.Open();
                        SqlDataReader rdr = cmd.ExecuteReader();
                        rdr.Read();

                        SqlGeography geog = (SqlGeography)rdr.GetValue(0);
                        if (!IsNullOrEmpty(geog))
                        {
                            if (rdr.FieldCount == 3)
                            {
                                pm = SqlGeogToKmlPlacemark(geog,
                                                           rdr.GetString(1),
                                                           rdr.GetString(2));
                            }
                            else
                            {
                                pm = SqlGeogToKmlPlacemark(geog,
                                                           rdr.GetString(1),
                                                           rdr.GetString(1));
                            }
                        }
                    }
                    catch
                    {
                        return(null);
                    }
                }

            return(pm);
        }
Exemple #9
0
        public static geKML RunExample(string FileName)
        {
            // Use a Document as the root of the KML
            geDocument doc = new geDocument();

            doc.Name = "My Root Document";

            gePlacemark pm = new gePlacemark();

            //Always complete the boundary by adding an end point that matches your beginning point

            List <geCoordinates> outerCoords = new List <geCoordinates>();

            outerCoords.Add(new geCoordinates(new geAngle90(37), new geAngle180(-114)));
            outerCoords.Add(new geCoordinates(new geAngle90(37), new geAngle180(-108)));
            outerCoords.Add(new geCoordinates(new geAngle90(31), new geAngle180(-108)));
            outerCoords.Add(new geCoordinates(new geAngle90(31), new geAngle180(-114)));
            outerCoords.Add(new geCoordinates(new geAngle90(37), new geAngle180(-114)));

            List <geCoordinates> innerCoords1 = new List <geCoordinates>();

            innerCoords1.Add(new geCoordinates(new geAngle90(36), new geAngle180(-113)));
            innerCoords1.Add(new geCoordinates(new geAngle90(36), new geAngle180(-112)));
            innerCoords1.Add(new geCoordinates(new geAngle90(35), new geAngle180(-112)));
            innerCoords1.Add(new geCoordinates(new geAngle90(35), new geAngle180(-113)));
            innerCoords1.Add(new geCoordinates(new geAngle90(36), new geAngle180(-113)));

            List <geCoordinates> innerCoords2 = new List <geCoordinates>();

            innerCoords2.Add(new geCoordinates(new geAngle90(34), new geAngle180(-113)));
            innerCoords2.Add(new geCoordinates(new geAngle90(34), new geAngle180(-112)));
            innerCoords2.Add(new geCoordinates(new geAngle90(33), new geAngle180(-112)));
            innerCoords2.Add(new geCoordinates(new geAngle90(33), new geAngle180(-113)));
            innerCoords2.Add(new geCoordinates(new geAngle90(34), new geAngle180(-113)));

            geOuterBoundaryIs outer = new geOuterBoundaryIs(new geLinearRing(outerCoords));

            gePolygon poly = new gePolygon(outer);

            geInnerBoundaryIs inner1 = new geInnerBoundaryIs(new geLinearRing(innerCoords1));
            geInnerBoundaryIs inner2 = new geInnerBoundaryIs(new geLinearRing(innerCoords2));

            poly.InnerBoundaries.Add(inner1);
            poly.InnerBoundaries.Add(inner2);

            pm.Geometry = poly;

            doc.Features.Add(pm);

            //Lets add a Line somewhere too...
            geStyle myLineStyle = new geStyle("myLineStyle");

            myLineStyle.LineStyle = new geLineStyle();
            myLineStyle.LineStyle.Color.SysColor = Color.Yellow;
            myLineStyle.LineStyle.Width          = 4; //This may or may not work, depends on the end user's video card

            doc.StyleSelectors.Add(myLineStyle);

            gePlacemark pmLine = new gePlacemark();

            pmLine.StyleUrl    = "#myLineStyle";
            pmLine.Name        = "Example Line";
            pmLine.Description = "Some description";

            List <geCoordinates> lineCoords = new List <geCoordinates>();

            lineCoords.Add(new geCoordinates(new geAngle90(35), new geAngle180(-117)));
            lineCoords.Add(new geCoordinates(new geAngle90(35), new geAngle180(-106)));

            geLineString line = new geLineString(lineCoords);

            pmLine.Geometry = line;

            doc.Features.Add(pmLine);

            //Now that we have our document, lets create our KML
            geKML kml = new geKML(doc);

            return(kml);
        }
Exemple #10
0
        private void processPolygonLayer(LayerProperties layerProps, geFolder folder)
        {
            //I have a polygon layer, and a kml folder :)
            IFeatureClass clasa = (layerProps.Layeru as IFeatureLayer).FeatureClass;
            //get acces to features
            IFeatureCursor featurele = clasa.Search(null, true);
            int            nrFeature = clasa.FeatureCount(null);

            //if I have any features
            Polygon  poligon;
            IFeature currentFeature;

            while ((currentFeature = featurele.NextFeature()) != null)
            {
                poligon = currentFeature.Shape as Polygon;
                //coordinates and vertices
                double      coordLat;
                double      coordLong;
                IEnumVertex colection = poligon.EnumVertices;
                IPoint      polyVertex;

                //create coord system WGS 84 (Google earth)
                IGeographicCoordinateSystem gcs;
                SpatialReferenceEnvironment sre = new SpatialReferenceEnvironment();
                gcs = sre.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
                //create spatial reference
                ISpatialReference pointToSpatialReference;
                pointToSpatialReference = gcs;

                #region add points to polygon
                //create a placemark for the line
                gePlacemark pmPolygon = new gePlacemark();
                pmPolygon.StyleUrl = "#Shape2KMLGeneratedStyle";

                List <geCoordinates> polyCoords = new List <geCoordinates>();
                int index1, index2;
                //iterate points...



                while (!colection.IsLastInPart())
                {
                    //create polygon from vertices
                    colection.Next(out polyVertex, out index1, out index2);
                    //project point and get coordinates
                    polyVertex.Project(pointToSpatialReference);
                    polyVertex.QueryCoords(out coordLong, out coordLat);
                    //add point to line

                    try
                    {
                        //create points for polygon based on altitude mode.
                        switch (layerProps.AltitudeMode)
                        {
                        case AltitudeMode.absolute:
                            if (layerProps.Field == "")
                            {
                                //add point to line
                                polyCoords.Add(new geCoordinates(new geAngle90(coordLat), new geAngle180(coordLong), layerProps.Altitude));
                            }
                            else
                            {
                                int altitude;
                                //if altitude is integer, this should work
                                altitude = (int)currentFeature.get_Value(currentFeature.Fields.FindField(layerProps.Field));

                                //add point to line
                                polyCoords.Add(new geCoordinates(new geAngle90(coordLat), new geAngle180(coordLong), layerProps.Multiplier * altitude));
                            }
                            break;

                        case AltitudeMode.clampToGround:
                            //add point to line
                            polyCoords.Add(new geCoordinates(new geAngle90(coordLat), new geAngle180(coordLong)));
                            break;

                        case AltitudeMode.relativeToGround:
                            if (layerProps.Field == "")
                            {
                                //add point to line
                                polyCoords.Add(new geCoordinates(new geAngle90(coordLat), new geAngle180(coordLong), layerProps.Altitude));
                            }
                            else
                            {
                                float altitude;
                                //if altitude is integer, this should work
                                altitude = (float)currentFeature.get_Value(currentFeature.Fields.FindField(layerProps.Field));

                                //add point to line
                                polyCoords.Add(new geCoordinates(new geAngle90(coordLat), new geAngle180(coordLong), layerProps.Multiplier * altitude));
                            }

                            break;

                        default:
                            break;
                        }
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Altitude field is not a number value");
                        break;
                    }
                }

                //create line from list of coords
                geOuterBoundaryIs outer = new geOuterBoundaryIs(new geLinearRing(polyCoords));
                gePolygon         poly  = new gePolygon(outer);
                //and add it to document

                switch (layerProps.AltitudeMode)
                {
                //set altitude mode...
                case AltitudeMode.absolute:
                    poly.AltitudeMode = geAltitudeModeEnum.absolute;
                    break;

                case AltitudeMode.clampToGround:
                    poly.AltitudeMode = geAltitudeModeEnum.clampToGround;
                    break;

                case AltitudeMode.relativeToGround:
                    poly.AltitudeMode = geAltitudeModeEnum.relativeToGround;
                    break;

                default:
                    break;
                }

                if (layerProps.DescField != "")
                {
                    pmPolygon.Description = currentFeature.get_Value(currentFeature.Fields.FindField(layerProps.DescField)).ToString();
                }

                if (layerProps.NameField != "")
                {
                    pmPolygon.Name = currentFeature.get_Value(currentFeature.Fields.FindField(layerProps.NameField)).ToString();
                }

                pmPolygon.Geometry = poly;
                folder.Features.Add(pmPolygon);

                #endregion
            }
        }
Exemple #11
0
        private void processPointLayer(LayerProperties layerProps, geFolder folder)
        {
            //I have a point layer, and a kml folder :)
            IFeatureClass clasa = (layerProps.Layeru as IFeatureLayer).FeatureClass;
            //get acces to features
            IFeatureCursor featurele = clasa.Search(null, true);

            //if I have any features
            Point    punct;
            IFeature currentFeature;

            //create coord system WGS 84 (Google earth)
            IGeographicCoordinateSystem gcs;
            SpatialReferenceEnvironment sre = new SpatialReferenceEnvironment();

            gcs = sre.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
            //create spatial reference
            ISpatialReference pointToSpatialReference;

            pointToSpatialReference = gcs;

            #region add points
            while ((currentFeature = featurele.NextFeature()) != null)
            {
                punct = currentFeature.Shape as Point;
                //coordinates and vertices
                double coordLat;
                double coordLong;


                //create a placemark for the point
                gePlacemark pmPoint = new gePlacemark();
                pmPoint.StyleUrl = "#Shape2KMLGeneratedStyle";

                //project point and get coordinates
                punct.Project(pointToSpatialReference);
                punct.QueryCoords(out coordLong, out coordLat);
                //add point

                geCoordinates coords;
                gePoint       point;

                switch (layerProps.AltitudeMode)
                {
                case AltitudeMode.absolute:

                    if (layerProps.Field == "")
                    {
                        //add point
                        coords = new geCoordinates(new geAngle90(coordLat), new geAngle180(coordLong), layerProps.Altitude);
                    }
                    else
                    {
                        int altitude;
                        //if altitude is integer, this should work
                        altitude = (int)currentFeature.get_Value(currentFeature.Fields.FindField(layerProps.Field));

                        //add point
                        coords = new geCoordinates(new geAngle90(coordLat), new geAngle180(coordLong), layerProps.Multiplier * altitude);
                    }
                    point = new gePoint(coords);
                    point.AltitudeMode = geAltitudeModeEnum.absolute;
                    break;

                case AltitudeMode.clampToGround:
                    coords             = new geCoordinates(new geAngle90(coordLat), new geAngle180(coordLong));
                    point              = new gePoint(coords);
                    point.AltitudeMode = geAltitudeModeEnum.clampToGround;
                    break;

                case AltitudeMode.relativeToGround:
                    if (layerProps.Field == "")
                    {
                        //add point
                        coords = new geCoordinates(new geAngle90(coordLat), new geAngle180(coordLong), layerProps.Altitude);
                    }
                    else
                    {
                        int altitude;
                        //if altitude is integer, this should work
                        altitude = (int)currentFeature.get_Value(currentFeature.Fields.FindField(layerProps.Field));

                        //add point
                        coords = new geCoordinates(new geAngle90(coordLat), new geAngle180(coordLong), layerProps.Multiplier * altitude);
                    }
                    point = new gePoint(coords);
                    point.AltitudeMode = geAltitudeModeEnum.relativeToGround;
                    break;

                default:
                    point = null;
                    break;
                }

                if (layerProps.DescField != "")
                {
                    pmPoint.Description = currentFeature.get_Value(currentFeature.Fields.FindField(layerProps.DescField)).ToString();
                }

                if (layerProps.NameField != "")
                {
                    pmPoint.Name = currentFeature.get_Value(currentFeature.Fields.FindField(layerProps.NameField)).ToString();
                }

                pmPoint.Geometry = point;
                folder.Features.Add(pmPoint);
                #endregion
            }
        }
        // This method is to be called once all the targets
        // are loaded via AddNewTarget. Once KML is created the list
        // will be emptied.
        public void BuildKML()
        {
            string exampleFileName = "";
            string exampleFileExt  = "kmz";
            string file_name       = "ASTX_TO_KML";

            // Use a Document as the root of the KML
            geDocument doc = new geDocument();

            doc.Name = "Asterix to KML";

            // Create a new style to be added the doc
            geStyle myStyle = new geStyle("myStyle");

            //add a new IconStyle to the style
            myStyle.IconStyle       = new geIconStyle();
            myStyle.IconStyle.Icon  = new geIcon("ac_image.png");
            myStyle.IconStyle.Scale = 1.0F; //or (float)1

            myStyle.LabelStyle = new geLabelStyle();
            myStyle.LabelStyle.Color.SysColor = Color.White;

            myStyle.LineStyle = new geLineStyle();
            myStyle.LineStyle.Color.SysColor = Color.Black;
            myStyle.LineStyle.Width          = 4;


            //Add the style
            doc.StyleSelectors.Add(myStyle);

            foreach (DynamicDisplayBuilder.TargetType Target in TargetList)
            {
                //Create a Placemark to put in the document
                //This placemark is going to be a point
                //but it could be anything in the Geometry class
                gePlacemark pm = new gePlacemark();

                //Create some coordinates for the point at which
                //this placemark will sit. (Lat / Lon)
                geCoordinates coords = new geCoordinates(
                    new geAngle90(Target.Lat),
                    new geAngle180(Target.Lon));

                double LevelInMeeters = 0.0;

                // Assign the altitude
                if (Target.ModeC != null)
                {
                    if (Target.ModeC != "---")
                    {
                        LevelInMeeters = (double.Parse(Target.ModeC) * 100.00) * SharedData.FeetToMeeters;
                    }
                }

                coords.Altitude = (float)LevelInMeeters;

                //Create a point with these new coordinates
                gePoint point = new gePoint(coords);
                point.AltitudeMode = geAltitudeModeEnum.absolute;
                point.Extrude      = true;

                //Assign the point to the Geometry property of the
                //placemark.
                pm.Geometry = point;

                //Set the placemark's style to the style we created above
                pm.StyleUrl = "#myStyle";


                if (Properties.Settings.Default.GE_Show_ModeA)
                {
                    pm.Name = Target.ModeA;
                }

                if (Properties.Settings.Default.GE_Show_ModeC)
                {
                    if (Properties.Settings.Default.Show_ModeC_as_FL)
                    {
                        pm.Name = pm.Name + "  " + "FL:" + Target.ModeC;
                    }
                    else
                    {
                        pm.Name = pm.Name + "  " + LevelInMeeters.ToString() + "m";
                    }
                }

                if (Properties.Settings.Default.GE_Show_ModeC)
                {
                    pm.Name = pm.Name + " " + Target.ACID_Mode_S;
                }

                pm.Snippet     = "Snipet Test";
                pm.Description = "Blaa Bla Blaaaa";

                //Finally, add the placemark to the document
                doc.Features.Add(pm);
            }

            geKML kml = new geKML(doc);

            //Add supporting files to the KMZ (assuming it's going to be rendered as KMZ
            byte[] myFile = File.ReadAllBytes(@"C:\ASTERIX\GE\ac_image.png");
            kml.Files.Add("ac_image.png", myFile);

            exampleFileName = Properties.Settings.Default.GE_Dest_Path + "\\" + file_name + "." + exampleFileExt;
            File.WriteAllBytes(exampleFileName, kml.ToKMZ());

            // Clear the list
            TargetList.Clear();
        }
Exemple #13
0
        public static geKML RunExample(string FileName)
        {
            // Use a Document as the root of the KML
            geDocument doc = new geDocument();

            doc.Name = "My Root Document";

            /*
             *
             * //Create a Placemark to put in the document
             * //This placemark is going to be a point
             * //but it could be anything in the Geometry class
             * gePlacemark pm = new gePlacemark();
             *
             * //Create some coordinates for the point at which
             * //this placemark will sit. (Lat / Lon)
             * geCoordinates coords = new geCoordinates(
             *  new geAngle90(37.422067),
             * new geAngle180(-122.084437));
             *
             * //Create a point with these new coordinates
             * gePoint point = new gePoint(coords);
             *
             * //Assign the point to the Geometry property of the
             * //placemark.
             * pm.Geometry = point;
             *
             * //Now lets add some other properties to our placemark
             * pm.Name = "My Placemark";
             * pm.Snippet = "This is where I put my Placemark";
             * pm.Description =
             *  "I wonder where this is...";
             */

            Utilities util = new Utilities();

            // Point

            /*
             * gePlacemark pm = util.SqlGeogCommandToKmlPlacemark(
             *  "server=.;database=geonames;integrated security=sspi",
             *  "select top(1) geog, name from geonames");
             *
             * // LineString
             * gePlacemark pm = util.SqlGeogCommandToKmlPlacemark(
             *  "server=.;database=Sample_USA;integrated security=sspi",
             *  "select geog, signt + ' ' + signn from Highways where id = 1132");
             */

            // Polygon

            /*
             * gePlacemark pm = util.SqlGeogCommandToKmlPlacemark(
             *  "server=.;database=Sample_USA;integrated security=sspi",
             *  "select geog, name_2 from counties where id = 847");
             */

            // Multi-ring polygon

            /*
             * gePlacemark pm = util.SqlGeogCommandToKmlPlacemark(
             *  "server=.;database=SpatialSamples;integrated security=sspi",
             *  "select geog, cntry_name from cntry00 where fips_cntry = 'WE'");
             */

            // MultiLineString
            gePlacemark pm = util.SqlGeogCommandToKmlPlacemark(
                "server=.;database=Sample_USA;integrated security=sspi",
                "select geog, signt + ' ' + signn from Highways where id = 6315");

            //Finally, add the placemark to the document
            doc.Features.Add(pm);

            //Now that we have our document, lets create our KML
            geKML kml = new geKML(doc);

            return(kml);
        }