示例#1
0
        private void ProcessGeometry <Toutput, Tpoint>(GeometryWriterBase <Toutput, Tpoint> writer, double reduceTolerance, double pixelRadiansAreaXY, ref int numPixels, ref SqlGeometry geom, double geomArea)
        {
            bool geomIsPixel = geomArea > 0 && geomArea <= pixelRadiansAreaXY;

            if (!geomIsPixel && _geometryReduce)
            {
                geom = geom.Reduce(reduceTolerance);
            }
            if (_geometryRemoveArtefacts)
            {
                geom = SqlServerModel.DoRemoveArtefacts(geom);
            }

            if (geomIsPixel)
            {
                numPixels++;
                writer.WritePoint(geom.STPointN(1));
            }
            else
            {
                writer.WriteGeometry(geom);
            }
        }
示例#2
0
        public Toutput GetObjectGeneric_FromCacheBBox <Toutput, Tpoint>(BoundingBoxQuery query, Metrics metrics, string tableName, GeometryWriterBase <Toutput, Tpoint> writer)
        {
            Toutput objOut = default(Toutput);

            metrics.Start("Init");

            try
            {
                double reduceTolerance       = Math.Min(query.BBox.Width / query.Width, query.BBox.Height / query.Height);           // degrees per pixel / 2
                double reduceToleranceMeters = reduceTolerance * 6378137;
                //double pixelArea = Math.Pow(BingMapsTileSystem.GroundResolution(query.BBox.maxY, query.ZoomLevel), 2); // mapResolution * mapResolution
                double pixelRadiansAreaXY = ((query.BBox.maxX - query.BBox.minX) / query.Width) * ((query.BBox.maxY - query.BBox.minY) / query.Height);
                int    numPixels          = 0;

                #region Get data from cache or open DB

                if (UseInMemoryCache)
                {
                    #region From Cache
                    #region Preload cache

                    metrics.Start("Cache");
                    if (!GeometryCache.IsCacheLoaded(query.Tables()[0]))
                    {
                        while (!GeometryCache.IsCacheLoaded(query.Tables()[0]))
                        {
                            GeometryCache.LoadCache(query.Tables()[0], this.GetConnectionString());
                            Trace.WriteLine(string.Format("Thread {0} waiting for cache...", System.Threading.Thread.CurrentThread.ManagedThreadId));
                        }
                    }
                    metrics.Stop("Cache");

                    #endregion

                    SqlGeometry bboxGeom            = SqlServerModel.GeometryFromBoundingBox(query.BBox);
                    IList <int> resultsWithIndexSTR = GeometryCache.Query(tableName, new Envelope(query.BBox.minX, query.BBox.maxX, query.BBox.minY, query.BBox.maxY));

                    if (resultsWithIndexSTR.Count > 0)
                    {
                        foreach (int id in resultsWithIndexSTR)
                        {
                            SqlGeometry geom     = GeometryCache.GetGeometry(tableName, id);
                            double      geomArea = GeometryCache.GetGeometryArea(tableName, id);

                            bool geomIsPixel = geomArea > 0 && geomArea <= pixelRadiansAreaXY;


                            metrics.Start("Process");
                            ProcessGeometry <Toutput, Tpoint>(writer, reduceTolerance, pixelRadiansAreaXY, ref numPixels, ref geom, geomArea);
                            metrics.Stop("Process");
                        }
                        metrics.Start("GetOutput");
                        objOut = writer.GetOutput();
                        metrics.Stop("GetOutput");
                    }

                    #endregion
                }
                else
                {
                    #region Get data from SQL DB

                    using (SqlConnection conn = GetOpenConnection())
                    {
                        string strQuery = SqlServerModel.GenerateGetGeomInBBoxScript(tableName, query.BBox);

                        using (var cmd = new SqlCommand(strQuery, conn))
                        {
                            cmd.CommandType = System.Data.CommandType.Text;

                            using (var rdr = cmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess))
                            {
                                if (rdr.HasRows)
                                {
                                    while (rdr.Read())
                                    {
                                        metrics.Start("Area");
                                        SqlGeometry geom     = SqlGeometry.STGeomFromWKB(rdr.GetSqlBytes(0), 4326);
                                        double      geomArea = geom.STArea().Value;                                    // optimize this by having area field in DB
                                        metrics.Stop("Area");

                                        metrics.Start("Process");
                                        ProcessGeometry <Toutput, Tpoint>(writer, reduceTolerance, pixelRadiansAreaXY, ref numPixels, ref geom, geomArea);
                                        metrics.Stop("Process");
                                    }
                                    metrics.Start("GetOutput");
                                    objOut = writer.GetOutput();
                                    metrics.Stop("GetOutput");
                                }


                                rdr.Close();
                            }
                        }
                    }

                    #endregion
                }
                #endregion
            }
            catch (Exception)
            {
                throw;
            }


            return(objOut);
        }