コード例 #1
0
 /// <summary>
 /// ServiceException
 ///     sets response for exception
 /// </summary>
 /// <param name="response">WKTResponse</param>
 /// <param name="message">string exception messsage</param>
 /// <param name="code">int error code</param>
 public void ServiceException(WKTResponse response, string message, int code)
 {
     response.ErrorCode     = code;
     response.OutputMessage = message;
     response.OutputShapes.Clear();
     log.Error(message);
 }
コード例 #2
0
        public WKTResponse GetSQLDataWKT(WKTParameters Parameters)
        {
            DateTime queryStart = DateTime.Now;
            DateTime queryStop;
            int      recordCnt = 0;

            WKTResponse _WKTResponse = new WKTResponse();

            _WKTResponse.ErrorCode     = 0;
            _WKTResponse.OutputMessage = "Success";
            _WKTResponse.OutputShapes  = new List <WKTShape>();
            string        connStr = ConfigurationManager.ConnectionStrings["DataConnectionString"].ConnectionString;
            SqlConnection conn    = new SqlConnection(connStr);
            SqlDataReader rdr     = null;

            try
            {
                #region Build Query

                if (Parameters.Querytype == null || Parameters.Querytype.Length == 0)
                {
                    throw new ArgumentException("Invalid Parameters: querytype=\"" + Parameters.Querytype + "\"");
                }
                if (Parameters.Querytype.ToLower().Equals("buffer") && Parameters.Radius <= 0)
                {
                    throw new ArgumentException("Invalid Parameters: querytype requires radius >0 - \"" + Parameters.Radius + "\"");
                }
                if (Parameters.Points.Length == 0 && Parameters.Querytype.ToLower().Equals("buffer"))
                {
                    throw new ArgumentException("Invalid Parameters: points must contain at least one point for querytype buffer");
                }
                if (Parameters.Points.Split(',').Length != 5 && Parameters.Querytype.ToLower().Equals("bbox"))
                {
                    throw new ArgumentException("Invalid Parameters: points must contain 5 points for a closed querytype bbox");
                }

                StringBuilder query = new StringBuilder();

                geomFieldDB = geomField;
                string RegionIndexName;
                string LocalAuthorityIndexName;
                string ReduceQuery;

                if (Parameters.Reduce >= 1000)
                {
                    // Use Shape1000 data - pre-calculated data from Shape field, already reduced by 1000
                    geomFieldDB             = geomField + "1000";
                    RegionIndexName         = "geog_sidx1";
                    LocalAuthorityIndexName = "geog_sidx1";
                    ReduceQuery             = string.Empty;
                }
                else
                {
                    // Use Shape data
                    geomFieldDB             = geomField;
                    RegionIndexName         = "shape_sidx";
                    LocalAuthorityIndexName = "geog_sidx";
                    ReduceQuery             = ".Reduce(50)";
                    //ReduceQuery = string.Empty;
                }

                if (Parameters.Querytype.ToLower().Equals("bbox"))
                {   //BBox
                    if (Parameters.Table.ToLower() == "region")
                    {
                        query.Append("SELECT Code, RegionID, RegionName, DateUpdated, LastUpdatedUserCode, RowIdentifier, " + geomFieldDB + ReduceQuery + ".STAsText() as " + geomField + "wkt FROM [dbo].[" + Parameters.Table + "] WITH(INDEX(" + (Parameters.Table.ToLower() == "localauthority" ? LocalAuthorityIndexName : RegionIndexName) + ")) WHERE ");
                    }
                    else if (Parameters.Table.ToLower() == "localauthority")
                    {
                        query.Append("SELECT ID, NAME, AREA_CODE, DESCRIPTIO, FILE_NAME, NUMBER, NUMBER0, POLYGON_ID, UNIT_ID, CODE, HECTARES, AREA, TYPE_CODE, DESCRIPT0, TYPE_COD0, DESCRIPT1, Region, LANamePc, " + geomFieldDB + ReduceQuery + ".STAsText() as " + geomField + "wkt FROM [dbo].[" + Parameters.Table + "] WITH(INDEX(" + (Parameters.Table.ToLower() == "localauthority" ? LocalAuthorityIndexName : RegionIndexName) + ")) WHERE ");
                    }
                    else
                    {
                        query.Append("SELECT *, " + geomFieldDB + ReduceQuery + ".STAsText() as " + geomField + "wkt FROM [dbo].[" + Parameters.Table + "] WITH(INDEX(" + (Parameters.Table.ToLower() == "localauthority" ? LocalAuthorityIndexName : RegionIndexName) + ")) WHERE ");
                    }
                    query.Append(geomFieldDB + ".STIntersects(geography::STGeomFromText('POLYGON(('+@points+'))', @srid))=1 AND " + Parameters.RegionField + " NOT IN ('Scotland','Wales')");
                }
                else if (Parameters.Querytype.ToLower().Equals("buffer"))
                {
                    query.Append("SELECT *," + geomFieldDB + ReduceQuery + ".STAsText() as " + geomField + "wkt FROM [dbo].[" + Parameters.Table + "] WITH(INDEX(" + (Parameters.Table.ToLower() == "localauthority" ? LocalAuthorityIndexName : RegionIndexName) + ")) WHERE ");
                    if (Parameters.Points.Split(',').Length > 1)
                    {   //Polyline Buffer
                        query.Append(geomFieldDB + ".STIntersects(geography::STGeomFromText('LINESTRING('+@points+')', @srid).STBuffer(@radius))=1 AND " + Parameters.RegionField + " NOT IN ('Scotland','Wales')");
                    }
                    else
                    {   //Point Buffer
                        query.Append(geomFieldDB + ".STIntersects(geography::STGeomFromText('POINT('+@points+')', @srid).STBuffer(@radius))=1 AND " + Parameters.RegionField + " NOT IN ('Scotland','Wales')");
                    }
                }

                #endregion

                log.Info(query);

                queryStart = DateTime.Now;
                SqlCommand cmd = new SqlCommand(query.ToString(), conn);
                cmd.Parameters.Add(new SqlParameter("reduce", Parameters.Reduce));
                cmd.Parameters.Add(new SqlParameter("srid", srid));
                cmd.Parameters.Add(new SqlParameter("points", Parameters.Points));
                cmd.Parameters.Add(new SqlParameter("radius", Parameters.Radius));
                conn.Open();

                rdr = cmd.ExecuteReader();
                while (rdr.Read())
                {
                    WKTShape shp = new WKTShape();
                    shp.Fields = new Dictionary <string, string>();
                    for (int i = 0; i < rdr.FieldCount; i++)
                    {
                        //log.Debug(rdr[i].GetType() + "  " + rdr.GetName(i));
                        if (rdr[i].GetType().Equals(typeof(SqlGeography)) ||
                            rdr[i].GetType().Equals(typeof(SqlGeometry))
                            )
                        { //skip
                          //log.Debug("skip " + rdr[i].GetType());
                        }
                        else
                        {
                            if (rdr.GetName(i).Equals("ID"))
                            {
                                shp.ID = rdr[i].ToString();
                                //log.Debug(rdr[i].GetType() + "  " + rdr.GetName(i) + "  " + rdr[i].ToString());
                            }
                            else if (rdr.GetName(i).Equals(geomField + "wkt"))
                            {
                                //log.Debug(rdr[i].GetType() + "  " + rdr.GetName(i) + "  " + rdr[i].ToString());
                                shp.WKT = rdr[i].ToString();
                            }
                            else
                            {
                                shp.Fields.Add(rdr.GetName(i), rdr[i].ToString());
                                //log.Debug(rdr.GetName(i) + " : " + rdr[i].ToString());
                            }
                        }
                    }
                    //log.Debug(shp.ID + "  " + shp.WKT);
                    if (recordCnt++ > recordLimit)
                    {
                        throw new Exception("Query result exceeds limit " + recordLimit);
                    }
                    _WKTResponse.OutputShapes.Add(shp);
                }
            }
            catch (ArithmeticException e)
            {
                ServiceException(_WKTResponse, "ArithmeticException " + e.Message, 3);
            }
            catch (ArgumentException e)
            {
                ServiceException(_WKTResponse, "ArgumentException " + e.Message, 1);
            }
            catch (Exception e)
            {
                ServiceException(_WKTResponse, e.Message, 2);
            }
            finally
            {
                if (rdr != null)
                {
                    rdr.Close();
                }
                if (conn != null)
                {
                    conn.Close();
                }
            }
            queryStop = DateTime.Now;
            //log.Debug(String.Format("Query Time: {0,0:0}ms", (queryStop - queryStart).TotalMilliseconds));
            _WKTResponse.QueryTime = (queryStop - queryStart).TotalMilliseconds;

            return(_WKTResponse);
        }