Exemple #1
0
        private void RenderKml(sqlServerConnection sql /*, string longlatCols_, string kmlCol*/)
        {
            bool   kmlFromLonglat = false;
            bool   kmlFromSnippet = false;
            bool   kmlName        = false;
            bool   kmlDesc        = false;
            string longitude      = ""; //column
            string latitude       = ""; //column
            string snippet        = ""; //column
            string name           = ""; //column
            string description    = ""; //column

            //get KML metadata
            var reader = sql.GetReader("select * from odpdataservicemetadata where EntitysetName='" + _entitySet + "';");

            if (reader.Rows.Count > 0)//just read one
            {
                //TODO can we recycle this, see gskhasdfsfdsagf
                //exclude this from the OData feed
                var lon   = reader.Rows[0]["Longitude"];
                var lat   = reader.Rows[0]["Latitude"];
                var kml_  = reader.Rows[0]["KmlSnippet"];
                var name_ = reader.Rows[0]["KmlName"];
                var desc  = reader.Rows[0]["KmlDescription"];

                kmlFromLonglat = lon.GetType() != typeof(System.DBNull) && lat.GetType() != typeof(System.DBNull);
                kmlFromSnippet = !kmlFromLonglat && kml_.GetType() != typeof(System.DBNull);
                kmlName        = name_.GetType() != typeof(System.DBNull);
                kmlDesc        = desc.GetType() != typeof(System.DBNull);

                if (kmlFromLonglat)
                {
                    longitude = lon.ToString();
                    latitude  = lat.ToString();
                }

                if (kmlFromSnippet)
                {
                    snippet = kml_.ToString();
                }

                if (kmlName)
                {
                    name = name_.ToString();
                }

                if (kmlDesc)
                {
                    description = desc.ToString();
                }
            }

            string columns;//to select from the table

            if (kmlFromLonglat || kmlFromSnippet)
            {
                if (kmlFromLonglat)
                {
                    columns = longitude + ", " + latitude;
                }
                else
                {
                    columns = snippet;
                }
                if (kmlName)
                {
                    columns += ", " + name;
                }
                if (kmlDesc)
                {
                    columns += ", " + description;
                }
            }
            else//geometry property
            {
                _context.Response.StatusCode = 404;//not found
                _context.Response.End();
                return;
            }

            _context.Response.ContentType = "application/vnd.google-earth.kml+xml";
            _context.Response.Write(string.Format(STARTING_KML, _entitySet));

            string table = sql.GetTableName(_ogdiAlias, _entitySet);

            string where = sqlServerConnection.WcfToSqlFilter(_filter);

            string sqltest = "SELECT " + columns + " FROM " + table + (string.IsNullOrEmpty(where) ? "" : (" WHERE " + where)) + ";";

            reader = sql.GetReader(
                "SELECT " + columns + " FROM " + table +
                (string.IsNullOrEmpty(where) ? "" : (" WHERE " + where)) + ";");

            var format = new NumberFormatInfo()
            {
                NumberDecimalSeparator = "."
            };

            foreach (DataRow row in reader.Rows)
            {
                if (!Convert.IsDBNull(row[0]) && !Convert.IsDBNull(row[1]))
                {
                    string placemark = "";

                    if (kmlFromLonglat || kmlFromSnippet)
                    {
                        var    nameVal = kmlName ? row[name].ToString() : "";
                        var    descVal = kmlName ? row[description].ToString() : "";
                        string geom    = "";
                        if (kmlFromLonglat)
                        {
                            geom = string.Format(POINT_KML, Convert.ToDouble(row[0]).ToString(format), Convert.ToDouble(row[1]).ToString(format));//TODO include Z if needed
                        }
                        else
                        if (kmlFromSnippet)
                        {
                            geom = row[snippet].ToString();
                            if (string.IsNullOrEmpty(geom))
                            {
                                continue;
                            }
                        }
                        placemark = string.Format(PLACEMARK_KML, geom, nameVal, descVal);
                    }
                    else//from geometry otherwise we wouldn't be here
                    {
                        placemark = "kmlfrom geometry not implemented\n";
                    }

                    _context.Response.Write(placemark);
                }
            }
            _context.Response.Write(ENDING_KML);
        }
        private void RenderKml(sqlServerConnection sql/*, string longlatCols_, string kmlCol*/)
        {
            bool kmlFromLonglat = false;
            bool kmlFromSnippet = false;
            bool kmlName = false;
            bool kmlDesc = false;
            string longitude = "";//column
            string latitude = "";//column
            string snippet = "";//column
            string name = "";//column
            string description = "";//column

            //get KML metadata
            var reader = sql.GetReader("select * from odpdataservicemetadata where EntitysetName='" + _entitySet + "';");
            if (reader.Rows.Count > 0)//just read one
            {
                //TODO can we recycle this, see gskhasdfsfdsagf
                //exclude this from the OData feed
                var lon = reader.Rows[0]["Longitude"];
                var lat = reader.Rows[0]["Latitude"];
                var kml_ = reader.Rows[0]["KmlSnippet"];
                var name_ = reader.Rows[0]["KmlName"];
                var desc = reader.Rows[0]["KmlDescription"];

                kmlFromLonglat = lon.GetType() != typeof(System.DBNull) && lat.GetType() != typeof(System.DBNull);
                kmlFromSnippet = !kmlFromLonglat && kml_.GetType() != typeof(System.DBNull);
                kmlName = name_.GetType() != typeof(System.DBNull);
                kmlDesc = desc.GetType() != typeof(System.DBNull);

                if (kmlFromLonglat)
                {
                    longitude = lon.ToString();
                    latitude = lat.ToString();
                }

                if (kmlFromSnippet)
                    snippet = kml_.ToString();

                if (kmlName)
                    name = name_.ToString();

                if (kmlDesc)
                    description = desc.ToString();
            }

            string columns;//to select from the table

            if (kmlFromLonglat || kmlFromSnippet)
            {
                if (kmlFromLonglat)
                    columns = longitude + ", " + latitude;
                else
                    columns = snippet;
                if (kmlName)
                    columns += ", " + name;
                if (kmlDesc)
                    columns += ", " + description;
            }
            else//geometry property
            {
                _context.Response.StatusCode = 404;//not found
                _context.Response.End();
                return;
            }

            _context.Response.ContentType = "application/vnd.google-earth.kml+xml";
            _context.Response.Write(string.Format(STARTING_KML, _entitySet));

            string table = sql.GetTableName(_ogdiAlias, _entitySet);
            string where = sqlServerConnection.WcfToSqlFilter(_filter);

            string sqltest = "SELECT " + columns + " FROM " + table + (string.IsNullOrEmpty(where) ? "" : (" WHERE " + where)) + ";";

            reader = sql.GetReader(
                "SELECT " + columns + " FROM " + table +
                (string.IsNullOrEmpty(where) ? "" : (" WHERE " + where)) + ";");

            var format = new NumberFormatInfo() { NumberDecimalSeparator = "." };
            foreach(DataRow row in reader.Rows)
            {
                if (!Convert.IsDBNull(row[0]) && !Convert.IsDBNull(row[1]))
                {
                    string placemark = "";

                    if (kmlFromLonglat || kmlFromSnippet)
                    {
                        var nameVal = kmlName ? row[name].ToString() : "";
                        var descVal = kmlName ? row[description].ToString() : "";
                        string geom = "";
                        if (kmlFromLonglat)
                            geom = string.Format(POINT_KML, Convert.ToDouble(row[0]).ToString(format), Convert.ToDouble(row[1]).ToString(format));//TODO include Z if needed
                        else
                            if (kmlFromSnippet)
                            {
                                geom = row[snippet].ToString();
                                if (string.IsNullOrEmpty(geom))
                                    continue;
                            }
                        placemark = string.Format(PLACEMARK_KML, geom, nameVal, descVal);
                    }
                    else//from geometry otherwise we wouldn't be here
                    {
                        placemark = "kmlfrom geometry not implemented\n";
                    }

                    _context.Response.Write(placemark);
                }
            }
            _context.Response.Write(ENDING_KML);
        }