コード例 #1
0
    static void Main(string[] args)
    {
        DbGeometry test   = DbGeometry.FromText("POLYGON((1 1, 1 2, 3 3, 1 1))");
        var        foo    = test.AsText();
        var        points = new List <Point>();

        Console.WriteLine(foo);
        if (foo.StartsWith("POLYGON ((") &&
            foo.EndsWith("))"))
        {
            foo = foo.Substring(10, foo.Length - 12);
            var rawPoints = foo.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList();
            foreach (var rawPoint in rawPoints)
            {
                var splitPoint = rawPoint.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                points.Add(new Point()
                {
                    X = decimal.Parse(splitPoint[1]), Y = decimal.Parse(splitPoint[0])
                });
            }
        }
        foreach (var point in points)
        {
            Console.WriteLine(point.ToString());
        }
        Console.ReadKey();
    }
コード例 #2
0
        public static DbGeometry MakeValid(DbGeometry geom)
        {
            if (geom.IsValid)
            {
                return(geom);
            }

            return(DbGeometry.FromText(SqlGeometry.STGeomFromText(new SqlChars(geom.AsText()), 4326).MakeValid().STAsText().ToSqlString().ToString(), 4326));
        }
コード例 #3
0
 /// <summary>
 ///     Generates code to specify the default value for a <see cref="DbGeometry" /> column.
 /// </summary>
 /// <param name="defaultValue"> The value to be used as the default. </param>
 /// <returns> Code representing the default value. </returns>
 protected virtual string Generate(DbGeometry defaultValue)
 {
     return("DbGeometry.FromText(\"" + defaultValue.AsText() + "\", " + defaultValue.CoordinateSystemId + ")");
 }
コード例 #4
0
        private static void extractPolygon(JObject feature, Dictionary <string, Point3D> labeledPoints, ApplicationDbContext context
                                           , List <Point3D> badPolygonsPoints, List <POI> poisToSave)
        {
            POI poi = new POI();

            poi.Type = null;
            Polygone toReturn = new Polygone();

            toReturn.Points = new List <Point3D>();
            int level = int.Parse(feature["properties"]["level"].ToString());

            //bool isAccessible = Boolean.Parse(feature["properties"]["accessible"].ToString());
            toReturn.Level = level;
            StringBuilder  wktsb = new StringBuilder("POLYGON ((");
            List <Point3D> labeledPointsFound = new List <Point3D>();

            foreach (JArray j in feature["geometry"]["coordinates"][0])
            {
                StringBuilder pointWkt = new StringBuilder("POINT (");
                string        lon      = Regex.Match(j.ToString(), "34\\.\\d+").Value;
                string        lat      = Regex.Match(j.ToString(), "32\\.\\d+").Value;
                wktsb.Append(lon + " " + lat + ",");
                pointWkt.Append(lon + " " + lat + ")");
                if (!toReturn.Points.Exists(Point3D => Point3D.Wkt == pointWkt.ToString()))
                {
                    if (labeledPoints.ContainsKey(pointWkt.ToString()))
                    {
                        labeledPointsFound.Add(labeledPoints[pointWkt.ToString()]);
                        toReturn.Points.Add(labeledPoints[pointWkt.ToString()]);
                        //break;
                    }
                    else
                    {
                        DbGeometry pointG = DbGeometry.PointFromText(pointWkt.ToString(), 4326);
                        Point3D    point  = new Point3D {
                            Longitude = Decimal.Parse(lon), Latitude = Decimal.Parse(lat), Wkt = pointWkt.ToString(), LocationG = pointG, Level = level
                        };
                        toReturn.Points.Add(point);
                    }
                }
            }
            wktsb.Remove(wktsb.Length - 1, 1);
            wktsb.Append("))");
            toReturn.Wkt = wktsb.ToString();
            try
            {
                DbGeometry polygone = DbGeometry.PolygonFromText(wktsb.ToString(), 4326);
                if (!polygone.IsValid)
                {
                    polygone = DbGeometry.FromText(SqlGeometry.STGeomFromText(new SqlChars(polygone.AsText()), 4326).MakeValid().STAsText().ToSqlString().ToString(), 4326);
                }

                foreach (Point3D point in badPolygonsPoints)
                {
                    if (polygone.Contains(point.LocationG))
                    {
                        return;
                    }
                }
                toReturn.LocationG = polygone;
            }
            catch (Exception ex)
            {
                ex = ex;
            }

            // polygon with no info
            if (labeledPointsFound.Count == 0)
            {
                return;
            }

            // polygon with more than one anchor point - check if it is 2 entrances
            if (labeledPointsFound.Count > 1)
            {
                if (labeledPointsFound[0].Areas.Count != labeledPointsFound[1].Areas.Count)
                {
                    return;
                }
                else
                {
                    for (int i = 0; i < labeledPointsFound[0].Areas.Count; i++)
                    {
                        if (!labeledPointsFound[0].Areas[i].AreaID.Equals(labeledPointsFound[1].Areas[i].AreaID))
                        {
                            return;
                        }
                    }
                }
            }
            Point3D labeledPoint = labeledPointsFound[0];

            if (labeledPoint != null)
            {
                toReturn.Areas = labeledPoint.Areas;
                if (labeledPoint.Areas != null && labeledPoint.Areas.Count > 0 && !labeledPoint.Areas[0].AreaID.StartsWith("9"))
                {
                    poi.Type = POI.POIType.STORE;
                }
                if (labeledPoint.Name.ToLower().Contains("atm"))
                {
                    poi.Type = POI.POIType.ATM;
                }
                if (labeledPoint.Name.ToLower().Contains("entrance"))
                {
                    poi.Type = POI.POIType.ENTRANCE;
                }
                if (labeledPoint.Name.ToLower().Contains("toilet") | labeledPoint.Name.ToLower().Contains("wc"))
                {
                    poi.Type = POI.POIType.WC;
                }
                if (labeledPoint.Name.ToLower().Contains("zone"))
                {
                    poi.Type = POI.POIType.ZONE;
                }
            }
            if (poi.Type != null)
            {
                switch (poi.Type)
                {
                case POI.POIType.STORE:
                {
                    poi = new Store {
                        Type         = poi.Type, Anchor = labeledPoint, Enabled = true
                        , Floor      = level,
                        IsAccessible = labeledPoint.IsAccessible,
                        Name         = labeledPoint.Name,
                        Name2        = labeledPoint.Name2,
                        Location     = toReturn,
                        Entrances    = new List <Point3D>()
                    };
                    foreach (Point3D entrancePoint in labeledPointsFound)
                    {
                        ((Store)poi).Entrances.Add(entrancePoint);
                    }
                    //context.Stores.AddOrUpdate(new Store[] { (Store)poi });
                    break;
                }

                default:
                {
                    poi = new POI
                    {
                        Type     = poi.Type,
                        Anchor   = labeledPoint,
                        Enabled  = true,
                        Name     = labeledPoint.Name,
                        Location = toReturn
                    };
                    //poisToSave.Add(poi);
                    break;
                }
                }
                poisToSave.Add(poi);
            }
            //return poi;
        }
コード例 #5
0
        public override void Visit(DbConstantExpression e)
        {
            Check.NotNull <DbConstantExpression>(e, nameof(e));
            switch (((PrimitiveType)TypeHelpers.GetPrimitiveTypeUsageForScalar(e.ResultType).EdmType).PrimitiveTypeKind)
            {
            case PrimitiveTypeKind.Binary:
                byte[] numArray = e.Value as byte[];
                if (numArray == null)
                {
                    throw new NotSupportedException();
                }
                this._key.Append("'");
                foreach (int num in numArray)
                {
                    this._key.AppendFormat("{0:X2}", (object)(byte)num);
                }
                this._key.Append("'");
                break;

            case PrimitiveTypeKind.Boolean:
            case PrimitiveTypeKind.Byte:
            case PrimitiveTypeKind.Decimal:
            case PrimitiveTypeKind.Double:
            case PrimitiveTypeKind.Guid:
            case PrimitiveTypeKind.Single:
            case PrimitiveTypeKind.SByte:
            case PrimitiveTypeKind.Int16:
            case PrimitiveTypeKind.Int32:
            case PrimitiveTypeKind.Int64:
            case PrimitiveTypeKind.Time:
                this._key.AppendFormat((IFormatProvider)CultureInfo.InvariantCulture, "{0}", e.Value);
                break;

            case PrimitiveTypeKind.DateTime:
                this._key.Append(((DateTime)e.Value).ToString("o", (IFormatProvider)CultureInfo.InvariantCulture));
                break;

            case PrimitiveTypeKind.String:
                string str = e.Value as string;
                if (str == null)
                {
                    throw new NotSupportedException();
                }
                this._key.Append("'");
                this._key.Append(str.Replace("'", "''"));
                this._key.Append("'");
                break;

            case PrimitiveTypeKind.DateTimeOffset:
                this._key.Append(((DateTimeOffset)e.Value).ToString("o", (IFormatProvider)CultureInfo.InvariantCulture));
                break;

            case PrimitiveTypeKind.Geometry:
            case PrimitiveTypeKind.GeometryPoint:
            case PrimitiveTypeKind.GeometryLineString:
            case PrimitiveTypeKind.GeometryPolygon:
            case PrimitiveTypeKind.GeometryMultiPoint:
            case PrimitiveTypeKind.GeometryMultiLineString:
            case PrimitiveTypeKind.GeometryMultiPolygon:
            case PrimitiveTypeKind.GeometryCollection:
                DbGeometry dbGeometry = e.Value as DbGeometry;
                if (dbGeometry == null)
                {
                    throw new NotSupportedException();
                }
                this._key.Append(dbGeometry.AsText());
                break;

            case PrimitiveTypeKind.Geography:
            case PrimitiveTypeKind.GeographyPoint:
            case PrimitiveTypeKind.GeographyLineString:
            case PrimitiveTypeKind.GeographyPolygon:
            case PrimitiveTypeKind.GeographyMultiPoint:
            case PrimitiveTypeKind.GeographyMultiLineString:
            case PrimitiveTypeKind.GeographyMultiPolygon:
            case PrimitiveTypeKind.GeographyCollection:
                DbGeography dbGeography = e.Value as DbGeography;
                if (dbGeography == null)
                {
                    throw new NotSupportedException();
                }
                this._key.Append(dbGeography.AsText());
                break;

            default:
                throw new NotSupportedException();
            }
            this._key.Append(":");
            this._key.Append(e.ResultType.Identity);
        }
コード例 #6
0
 public static string ToWkt(DbGeometry geom)
 {
     return(geom.AsText());
 }