示例#1
0
        /// <summary>
        /// Serializes a value.
        /// </summary>
        /// <param name="context">The serialization context.</param>
        /// <param name="value">The value.</param>
        protected override void SerializeValue(BsonSerializationContext context, GeoJsonLinearRingCoordinates <TCoordinates> value)
        {
            var bsonWriter = context.Writer;

            bsonWriter.WriteStartArray();
            foreach (var position in value.Positions)
            {
                context.SerializeWithChildContext(_coordinatesSerializer, position);
            }
            bsonWriter.WriteEndArray();
        }
示例#2
0
        static public IRing ToRing <T>(this GeoJsonLinearRingCoordinates <T> linearRing) where T : GeoJsonCoordinates
        {
            var ring = new Ring();

            foreach (var position in linearRing.Positions)
            {
                var values = position.Values;
                ring.AddPoint(new Point(values[0], values[1]));
            }

            return(ring);
        }
示例#3
0
        internal static PartnerMongoDb ToPartnerMongoDb(this Partner partner)
        {
            var polygonsCoodinates = new List <GeoJsonPolygonCoordinates <GeoJson2DGeographicCoordinates> >();

            foreach (var multipolygon in partner.CoverageArea.Coordinates)
            {
                foreach (var polygon in multipolygon)
                {
                    var points = new List <GeoJson2DGeographicCoordinates>();
                    foreach (var coordinates in polygon)
                    {
                        var coordinatesArray = coordinates.ToArray();
                        var longitude        = coordinatesArray[0];
                        var latitude         = coordinatesArray[1];

                        var point = new GeoJson2DGeographicCoordinates(longitude, latitude);
                        points.Add(point);
                    }

                    var linearRings        = new GeoJsonLinearRingCoordinates <GeoJson2DGeographicCoordinates>(points);
                    var polygonCoordinates = new GeoJsonPolygonCoordinates <GeoJson2DGeographicCoordinates>(linearRings);
                    polygonsCoodinates.Add(polygonCoordinates);
                }
            }

            var coverageArea       = GeoJson.MultiPolygon(polygonsCoodinates.ToArray());
            var addressCoordinates = partner.Address.Coordinates.ToArray();
            var address            = GeoJson.Point(new GeoJson2DGeographicCoordinates(addressCoordinates[0], addressCoordinates[1]));

            var partnerDb = new PartnerMongoDb()
            {
                Document     = partner.Document,
                OwnerName    = partner.OwnerName,
                TradingName  = partner.TradingName,
                CoverageArea = coverageArea,
                Address      = address
            };

            return(partnerDb);
        }
示例#4
0
        public MongoDbFeatureCursor(MongoDbFeatureClass fc, IQueryFilter filter)
            : base(fc.SpatialReference, filter.FeatureSpatialReference)
        {
            IFindFluent <Json.GeometryDocument, Json.GeometryDocument> findFluent = null;

            int bestLevel = -1;

            if (fc.GeneralizationLevel >= 0 && fc.GeometryType != Framework.Geometry.geometryType.Point && filter.MapScale > 0)
            {
                var resolution = filter.MapScale / _dpm;
                bestLevel = resolution.BestResolutionLevel();
            }

            if (bestLevel >= 0)
            {
                bestLevel          = Math.Max(fc.GeneralizationLevel, bestLevel);
                _shapeFieldname    = $"_shapeGen{bestLevel}";
                _shapePropertyInfo = typeof(Json.GeometryDocument).GetProperty($"ShapeGeneralized{bestLevel}");
                _isWkbShape        = true;
            }

            if (filter is ISpatialFilter)
            {
                ISpatialFilter sFilter = (ISpatialFilter)filter;
                var            env     = sFilter.Geometry.Envelope;

                env.minx = Math.Max(-180, env.minx);
                env.miny = Math.Max(-90, env.miny);
                env.maxx = Math.Min(180, env.maxx);
                env.maxy = Math.Min(90, env.maxy);

                GeoJson2DGeographicCoordinates   bottomleft  = new GeoJson2DGeographicCoordinates(env.minx, env.miny);
                GeoJson2DGeographicCoordinates   topleft     = new GeoJson2DGeographicCoordinates(env.minx, env.maxy);
                GeoJson2DGeographicCoordinates   topright    = new GeoJson2DGeographicCoordinates(env.maxx, env.maxy);
                GeoJson2DGeographicCoordinates   bottomright = new GeoJson2DGeographicCoordinates(env.maxx, env.miny);
                GeoJson2DGeographicCoordinates[] coord_array = new GeoJson2DGeographicCoordinates[] { bottomleft, topleft, topright, bottomright, bottomleft };
                GeoJsonLinearRingCoordinates <GeoJson2DGeographicCoordinates> ringcoord = new GeoJsonLinearRingCoordinates <GeoJson2DGeographicCoordinates>(coord_array);
                GeoJsonPolygonCoordinates <GeoJson2DGeographicCoordinates>    boxcoord  = new GeoJsonPolygonCoordinates <GeoJson2DGeographicCoordinates>(ringcoord);
                GeoJsonPolygon <GeoJson2DGeographicCoordinates> box = new GeoJsonPolygon <GeoJson2DGeographicCoordinates>(boxcoord);

                var bsonFilter =
                    fc.GeometryType == Framework.Geometry.geometryType.Point ?
                    Builders <Json.GeometryDocument> .Filter
                    .GeoIntersects(x => x.Shape, box) :
                    Builders <Json.GeometryDocument> .Filter
                    .GeoIntersects(x => x.Bounds, box);

                //.GeoWithinBox(x => x.Shape, env.minx, env.miny, env.maxx, env.maxy);

                var findOptions = new FindOptions()
                {
                    BatchSize = 10000
                };

                findFluent = fc.MongoCollection.Find(bsonFilter, options: findOptions);
            }
            else
            {
                findFluent = fc.MongoCollection.Find(_ => true);
                //filter.Limit = 1000;
            }

            if (filter.Limit > 0)
            {
                findFluent = findFluent.Limit(filter.Limit);
            }
            if (filter.BeginRecord > 1)
            {
                findFluent = findFluent.Skip(filter.BeginRecord - 1);
            }
            if (filter.SubFields != "*")
            {
                StringBuilder project = new StringBuilder();
                project.Append("{");
                foreach (var field in filter.SubFields.Split(' '))
                {
                    if (project.Length > 1)
                    {
                        project.Append(",");
                    }
                    if (field == "_id")
                    {
                        project.Append($"{field}:1");
                    }
                    else if (field == "_shape")
                    {
                        project.Append($"{_shapeFieldname}:1");
                    }
                    else
                    {
                        project.Append($"\"properties.{field}\":1");
                    }
                }
                project.Append("}");
                findFluent = findFluent.Project <Json.GeometryDocument>(project.ToString());
            }
            else
            {
                string project = String.Join(",", Enumerable.Range(0, 15).Select(i => $"{{_shapeGen{i}:0}}"));
                findFluent = findFluent.Project <Json.GeometryDocument>(project);
            }

            _cursor = findFluent.ToCursor();
        }
示例#5
0
        public async Task<HttpResponseMessage> feature_mobile(string area, string subj, double SWlong, double SWlat, double NElong, double NElat)
        {



            // set connection string in web.config 
            _mongoClient = new MongoClient(ConfigurationManager.ConnectionStrings["MongoDBContext"].ConnectionString);
            _mongoDatabase = _mongoClient.GetDatabase(ConfigurationManager.AppSettings["civilgisDBname"]);
            var _max_row_count = Convert.ToInt16(ConfigurationManager.AppSettings["max_row_count_mobile"]);

            var table_name = area + "_" + subj;



            var _mongoCollection = _mongoDatabase.GetCollection<FeatureDoc>(table_name);


            if ((SWlong == 0) || (SWlat == 0) || (NElong == 0) || (NElat == 0))
            {
                SWlong = -117.963690;
                SWlat = 33.634180;
                NElong = -117.854780;
                NElat = 33.702970;
            }



            GeoJson2DGeographicCoordinates bottomleft = new GeoJson2DGeographicCoordinates(SWlong, SWlat);
            GeoJson2DGeographicCoordinates topleft = new GeoJson2DGeographicCoordinates(SWlong, NElat);
            GeoJson2DGeographicCoordinates topright = new GeoJson2DGeographicCoordinates(NElong, NElat);
            GeoJson2DGeographicCoordinates bottomright = new GeoJson2DGeographicCoordinates(NElong, SWlat);
            GeoJson2DGeographicCoordinates[] coord_array = new GeoJson2DGeographicCoordinates[] { bottomleft, topleft, topright, bottomright, bottomleft };
            GeoJsonLinearRingCoordinates<GeoJson2DGeographicCoordinates> ringcoord = new GeoJsonLinearRingCoordinates<GeoJson2DGeographicCoordinates>(coord_array);
            GeoJsonPolygonCoordinates<GeoJson2DGeographicCoordinates> boxcoord = new GeoJsonPolygonCoordinates<GeoJson2DGeographicCoordinates>(ringcoord);
            GeoJsonPolygon<GeoJson2DGeographicCoordinates> box = new GeoJsonPolygon<GeoJson2DGeographicCoordinates>(boxcoord);


            var filter = Builders<FeatureDoc>.Filter.GeoIntersects(x => x.geometry, box);



            long count = 0;
            string result = "";




            // count only, not select
            var temp = _mongoCollection.CountAsync(filter);
            temp.Wait();
            count = temp.Result;



            if ((count > 0) && (count < _max_row_count))
            {

                //var result = "{ \"type\": \"FeatureCollection\",\"features\": [";
                // result = @"{ ""type"": ""FeatureCollection"",""features"": [";
                result = @"{ ""type"": ""FeatureCollection"",""features"": ";



                // ------------------- use Find ----------------------------------------
                var _listBsonDoc = await _mongoCollection.Find(filter).ToListAsync();


                //--------------------- 1 ---------------------------------------------------
                var batch_json = _listBsonDoc.ToJson();

                //ObjectId("55c532cf21167708171b02a2") must change to  "55c532cf21167708171b02a2"
                // below use 1.1    1.2 is alternative


                //----------------- 1.1 ok ---------------------------
                batch_json = batch_json.Replace("ObjectId(\"", "\"");
                batch_json = batch_json.Replace("\")", "\"");
                //----------------------------------------------------

                /*
                        //--------------------1.2 ---------------------------------
                         batch_json = Regex.Replace(batch_json, "ObjectId", "");
                         batch_json = Regex.Replace(batch_json, @"(", "");
                         batch_json = Regex.Replace(batch_json, @")", "");
                        //----------------------------------------------------------
                 */

                result = result + batch_json;

                //----------------------------------- end 1 --------------------------------------







                // batch.toString() has bug, 
                // -------- temp fix the bug, there are one ][ occur between {1}][{2}, it should be {1},{2}, so ][ need to replace with , -------------
                result = result.Replace("][", ",");
                //================================================== bug fix {}][{} ====================================================================


                result = result + "}";

            }

            else if (count == 0)
            {
                // no record
                result = count.ToString();

            }
            else
            {
                // more than limit
                result = count.ToString();
            }



            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, result, "text/plain");



            return response;

        }
示例#6
0
        static public GeoJsonGeometry <T> ToGeoJsonGeometry <T>(this IGeometry geometry) where T : GeoJsonCoordinates
        {
            if (geometry is IPoint)
            {
                var point = (IPoint)geometry;

                return(new GeoJsonPoint <T>(
                           (T)Activator.CreateInstance(typeof(T), new object[] { point.X, point.Y })));
            }
            if (geometry is IPolyline)
            {
                var polyline = (IPolyline)geometry;

                if (polyline.PathCount == 1)
                {
                    var lineStringCoordinates = new GeoJsonLineStringCoordinates <T>(polyline[0].ToGeoJsonCoordinates <T>());
                    return(new GeoJsonLineString <T>(lineStringCoordinates));
                }
                if (polyline.PathCount > 1)
                {
                    var lineStrings = new List <GeoJsonLineStringCoordinates <T> >();
                    for (int p = 0, p_to = polyline.PathCount; p < p_to; p++)
                    {
                        lineStrings.Add(new GeoJsonLineStringCoordinates <T>(polyline[p].ToGeoJsonCoordinates <T>()));
                    }

                    var multiLineStrings = new GeoJsonMultiLineStringCoordinates <T>(lineStrings);
                    return(new GeoJsonMultiLineString <T>(multiLineStrings));
                }
            }
            if (geometry is IPolygon)
            {
                var polygon = (IPolygon)geometry;
                polygon.MakeValid();
                polygon.CloseAllRings();

                if (polygon.OuterRingCount == 1)
                {
                    var outerRing  = new GeoJsonLinearRingCoordinates <T>(polygon.OuterRings().First().ToGeoJsonCoordinates <T>());
                    var innerRings = new List <GeoJsonLinearRingCoordinates <T> >();
                    if (polygon.InnerRingCount > 0)
                    {
                        foreach (var hole in polygon.InnerRings(polygon.OuterRings().First()))
                        {
                            innerRings.Add(new GeoJsonLinearRingCoordinates <T>(hole.ToGeoJsonCoordinates <T>()));
                        }
                    }
                    var polygonCoordinates = innerRings.Count > 0 ? new GeoJsonPolygonCoordinates <T>(outerRing, innerRings) : new GeoJsonPolygonCoordinates <T>(outerRing);
                    return(new GeoJsonPolygon <T>(polygonCoordinates));
                }
                else if (polygon.OuterRingCount > 1)
                {
                    List <GeoJsonPolygonCoordinates <T> > polygonCoordinatesArray = new List <GeoJsonPolygonCoordinates <T> >();
                    foreach (var ring in polygon.OuterRings())
                    {
                        var outerRing  = new GeoJsonLinearRingCoordinates <T>(ring.ToGeoJsonCoordinates <T>());
                        var innerRings = new List <GeoJsonLinearRingCoordinates <T> >();
                        foreach (var hole in polygon.InnerRings(ring))
                        {
                            innerRings.Add(new GeoJsonLinearRingCoordinates <T>(hole.ToGeoJsonCoordinates <T>()));
                        }
                        polygonCoordinatesArray.Add(innerRings.Count > 0 ? new GeoJsonPolygonCoordinates <T>(outerRing, innerRings) : new GeoJsonPolygonCoordinates <T>(outerRing));
                    }

                    var multiPolygonCoordinates = new GeoJsonMultiPolygonCoordinates <T>(polygonCoordinatesArray);
                    return(new GeoJsonMultiPolygon <T>(multiPolygonCoordinates));
                }
            }

            return(null);
        }
示例#7
0
        public async Task <HttpResponseMessage> feature2(string area, string subj, double SWlong, double SWlat, double NElong, double NElat)
        {
            // embeded connection string in code
            //_mongoClient = new MongoClient("mongodb://*****:*****@"{ ""type"": ""FeatureCollection"",""features"": [";
                result = @"{ ""type"": ""FeatureCollection"",""features"": ";

                //here use FindAsync() with cursor to iterate through each record.
                using (var cursor = await _mongoCollection.FindAsync(filter))
                {
                    while (await cursor.MoveNextAsync())
                    {
                        var batch = cursor.Current;



                        //--------------------- 1 ---------------------------------------------------
                        var batch_json = batch.ToJson();

                        //ObjectId("55c532cf21167708171b02a2") must change to  "55c532cf21167708171b02a2"
                        // below use 1.1    1.2 is alternative


                        //----------------- 1.1 ok ---------------------------
                        batch_json = batch_json.Replace("ObjectId(\"", "\"");
                        batch_json = batch_json.Replace("\")", "\"");
                        //----------------------------------------------------

                        /*
                         *      //--------------------1.2 ---------------------------------
                         *       batch_json = Regex.Replace(batch_json, "ObjectId", "");
                         *       batch_json = Regex.Replace(batch_json, @"(", "");
                         *       batch_json = Regex.Replace(batch_json, @")", "");
                         *      //----------------------------------------------------------
                         */

                        result = result + batch_json;

                        //----------------------------------- end 1 --------------------------------------
                    } // while await
                }     // using


                // batch.toString() has bug,
                // -------- temp fix the bug, there are one ][ occur between {1}][{2}, it should be {1},{2}, so ][ need to replace with , -------------
                result = result.Replace("][", ",");
                //================================================== bug fix {}][{} ====================================================================


                result = result + "}";
            }

            else if (count == 0)
            {
                // no record
                result = count.ToString();
            }
            else
            {
                // more than limit
                result = count.ToString();
            }



            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, result, "text/plain");



            return(response);
        }
示例#8
0
        public async Task<HttpResponseMessage> feature0(string area, string subj, double SWlong, double SWlat, double NElong, double NElat)
        {


            // embeded connection string in code
            //_mongoClient = new MongoClient("mongodb://*****:*****@"{ ""type"": ""FeatureCollection"",""features"": [";

                //here use FindAsync() with cursor to iterate through each record.
                using (var cursor = await _mongoCollection.FindAsync(filter))
                {
                    while (await cursor.MoveNextAsync())
                    {
                        var batch = cursor.Current;
                        foreach (var bsonDocument in batch)
                        {

                            //bsonDocument objectID field convert to non-string style, like ObjectId(""000000000000000000000000"")", must remove it or change it to "0"

                            ObjectId nullID = new ObjectId();
                            bsonDocument.id = nullID;

                            string rd = bsonDocument.ToJson();
                            string nullstr = @"ObjectId(""000000000000000000000000"")";
                            string rd1 = rd.Replace(nullstr, "0");


                            result = result + rd1 + ",";
                            count++;
                        }
                    }
                }// using

                // remove last ","
                result = result.Remove(result.Length - 1);

                result = result + "]}";

            }

            else if (count == 0)
            {
                // no record
                result = count.ToString();

            }
            else
            {
                // more than limit
                result = count.ToString();
            }



            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, result, "text/plain");



            return response;

        }