Beispiel #1
0
        private static IMultiPoint ParseWkbMultiPoint(byte[] blob, ref int offset, IGeometryFactory factory, ReadCoordinatesFunction readCoordinates, GaiaImport gaiaImport)
        {
            var getInt32  = gaiaImport.GetInt32;
            var getDouble = gaiaImport.GetDouble;

            var number = getInt32(blob, ref offset);
            var coords = new Coordinate[number];

            for (var i = 0; i < number; i++)
            {
                if (blob[offset++] != (byte)GaiaGeoBlobMark.GAIA_MARK_ENTITY)
                {
                    throw new Exception();
                }

                var gt = getInt32(blob, ref offset);
                if (ToBaseGeometryType((GaiaGeoGeometry)gt) != GaiaGeoGeometry.GAIA_POINT)
                {
                    throw new Exception();
                }

                coords[i] = new Coordinate(getDouble(blob, ref offset),
                                           getDouble(blob, ref offset));
                if (gaiaImport.HasZ)
                {
                    coords[i].Z = getDouble(blob, ref offset);
                }
                if (gaiaImport.HasM)
                {
                    /*coords[i].M =*/
                    getDouble(blob, ref offset);
                }
            }
            return(factory.CreateMultiPointFromCoords(coords));
        }
        private IMultiPoint CreateMultiPoint(int dim, int lrs, Decimal[] elemInfo, int elemIndex, List <Coordinate> coords)
        {
            int      sOffset        = StartingOffset(elemInfo, elemIndex);
            SdoEType etype          = EType(elemInfo, elemIndex);
            int      interpretation = Interpretation(elemInfo, elemIndex);

            if (!(sOffset >= 1) || !(sOffset <= coords.Count))
            {
                throw new ArgumentException("ELEM_INFO STARTING_OFFSET " + sOffset +
                                            " inconsistent with ORDINATES length " + coords.Count);
            }
            if (etype != SdoEType.Coordinate)
            {
                throw new ArgumentException("ETYPE " + etype + " inconsistent with expected POINT");
            }
            if (!(interpretation > 1))
            {
                return(null);
            }

            int len = dim + lrs;

            int start = (sOffset - 1) / len;
            int end   = start + interpretation;

            var points = _factory.CreateMultiPointFromCoords(SubArray(coords, start, end));

            return(points);
        }
Beispiel #3
0
        /// <summary>
        /// Creates a Point using the next token in the stream.
        /// </summary>
        /// <param name="tokenizer">Tokenizer over a stream of text in Well-known Text
        /// format. The next tokens must form a &lt;Point Text&gt;.</param>
        /// <param name="factory">The factory to create the result geometry</param>
        /// <returns>Returns a Point specified by the next token in
        /// the stream.</returns>
        /// <remarks>
        /// ParseException is thrown if an unexpected token is encountered.
        /// </remarks>
        private static IMultiPoint ReadMultiPointText(WktStreamTokenizer tokenizer, IGeometryFactory factory)
        {
            string nextToken = GetNextEmptyOrOpener(tokenizer);

            if (nextToken == "EMPTY")
            {
                return(factory.CreateMultiPointFromCoords((Coordinate[])null));
            }

            var points = new List <Coordinate>();

            points.Add(new Coordinate(GetNextNumber(tokenizer), GetNextNumber(tokenizer)));
            nextToken = GetNextCloserOrComma(tokenizer);
            while (nextToken == ",")
            {
                points.Add(new Coordinate(GetNextNumber(tokenizer), GetNextNumber(tokenizer)));
                nextToken = GetNextCloserOrComma(tokenizer);
            }
            return(factory.CreateMultiPointFromCoords(points.ToArray()));
        }
        /// <summary>
        /// Reads an array of <see cref="IGeometry"/>s from JSON
        /// </summary>
        /// <param name="reader">The reader</param>
        /// <param name="objectType">The object type</param>
        /// <param name="existingValue">The existing value</param>
        /// <param name="serializer">The serializer</param>
        /// <returns>The geometry array read</returns>
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            reader.Read();
            if (!(reader.TokenType == JsonToken.PropertyName && (string)reader.Value == "geometries"))
            {
                throw new Exception();
            }
            reader.Read();
            if (reader.TokenType != JsonToken.StartArray)
            {
                throw new Exception();
            }

            reader.Read();
            List <IGeometry> geoms = new List <IGeometry>();

            while (reader.TokenType != JsonToken.EndArray)
            {
                JObject           obj          = (JObject)serializer.Deserialize(reader);
                GeoJsonObjectType geometryType = (GeoJsonObjectType)Enum.Parse(typeof(GeoJsonObjectType), obj.Value <string>("type"), true);

                switch (geometryType)
                {
                case GeoJsonObjectType.Point:
                    geoms.Add(_factory.CreatePoint(ToCoordinate(obj.Value <JArray>("coordinates"))));
                    break;

                case GeoJsonObjectType.LineString:
                    geoms.Add(_factory.CreateLineString(ToCoordinates(obj.Value <JArray>("coordinates"))));
                    break;

                case GeoJsonObjectType.Polygon:
                    geoms.Add(CreatePolygon(ToListOfCoordinates(obj.Value <JArray>("coordinates"))));
                    break;

                case GeoJsonObjectType.MultiPoint:
                    geoms.Add(_factory.CreateMultiPointFromCoords(ToCoordinates(obj.Value <JArray>("coordinates"))));
                    break;

                case GeoJsonObjectType.MultiLineString:
                    geoms.Add(CreateMultiLineString(ToListOfCoordinates(obj.Value <JArray>("coordinates"))));
                    break;

                case GeoJsonObjectType.MultiPolygon:
                    geoms.Add(CreateMultiPolygon(ToListOfListOfCoordinates(obj.Value <JArray>("coordinates"))));
                    break;

                case GeoJsonObjectType.GeometryCollection:
                    throw new NotSupportedException();
                }
                reader.Read();
            }
            return(geoms);
        }
Beispiel #5
0
        public void ParseMultiPoint()
        {
            string multipoint = "MULTIPOINT ((20.564 346.3493254), (45 32), (23 54))";
            var    geom       = GeomFromText(multipoint) as IMultiPoint;

            Assert.IsNotNull(geom);
            Assert.AreEqual(20.564, ((IPoint)geom[0]).X);
            Assert.AreEqual(54, ((IPoint)geom[2]).Y);
            Assert.AreEqual(multipoint, geom.AsText());
            Assert.IsTrue(GeomFromText("MULTIPOINT EMPTY").IsEmpty);
            Assert.AreEqual("MULTIPOINT EMPTY", Factory.CreateMultiPointFromCoords((Coordinate[])null).AsText());
        }
Beispiel #6
0
        private IGeometry BoundaryMultiLineString(IMultiLineString mLine)
        {
            if (_geom.IsEmpty)
            {
                return(GetEmptyMultiPoint());
            }

            var bdyPts = ComputeBoundaryCoordinates(mLine);

            // return Point or MultiPoint
            if (bdyPts.Length == 1)
            {
                return(_geomFact.CreatePoint(bdyPts[0]));
            }
            // this handles 0 points case as well
            return(_geomFact.CreateMultiPointFromCoords(bdyPts));
        }
        private IGeometry ParseGeometry(JsonReader reader, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null)
            {
                return(null);
            }

            if (reader.TokenType != JsonToken.StartObject)
            {
                throw new JsonReaderException("Expected Start object '{' Token");
            }

            // advance
            bool read = reader.Read();

            Utility.SkipComments(reader);

            GeoJsonObjectType?geometryType = null;
            List <object>     coords       = null;

            while (reader.TokenType == JsonToken.PropertyName)
            {
                //read the tokens, type may come before coordinates or geometries as pr spec
                if (reader.TokenType == JsonToken.PropertyName)
                {
                    string prop = (string)reader.Value;
                    switch (prop)
                    {
                    case "type":
                        if (geometryType == null)
                        {
                            reader.Read();
                            geometryType = GetType(reader);
                        }
                        break;

                    case "geometries":
                        //only geom collection has "geometries"
                        reader.Read();      //read past start array tag
                        coords = ParseGeomCollection(reader, serializer);
                        break;

                    case "coordinates":
                        reader.Read();     //read past start array tag
                        coords = ReadCoordinates(reader);
                        break;

                    case "bbox":
                        // Read, but can't do anything with it, assigning Envelopes is impossible without reflection
                        /*var bbox = */
                        serializer.Deserialize <Envelope>(reader);
                        break;

                    default:
                        reader.Read();
                        /*var item = */
                        serializer.Deserialize(reader);
                        reader.Read();
                        break;
                    }
                }
                Utility.SkipComments(reader);
            }

            if (read && reader.TokenType != JsonToken.EndObject)
            {
                throw new ArgumentException("Expected token '}' not found.");
            }

            if (coords == null || geometryType == null)
            {
                return(null);
            }

            switch (geometryType)
            {
            case GeoJsonObjectType.Point:
                return(_factory.CreatePoint(GetPointCoordinate(coords)));

            case GeoJsonObjectType.LineString:
                return(_factory.CreateLineString(GetLineStringCoordinates(coords)));

            case GeoJsonObjectType.Polygon:
                return(CreatePolygon(GetPolygonCoordinates(coords)));

            case GeoJsonObjectType.MultiPoint:
                return(_factory.CreateMultiPointFromCoords(GetLineStringCoordinates(coords)));

            case GeoJsonObjectType.MultiLineString:
                var strings = new List <ILineString>();
                foreach (var multiLineStringCoordinate in GetPolygonCoordinates(coords))
                {
                    strings.Add(_factory.CreateLineString(multiLineStringCoordinate));
                }
                return(_factory.CreateMultiLineString(strings.ToArray()));

            case GeoJsonObjectType.MultiPolygon:
                var polygons = new List <IPolygon>();
                foreach (var multiPolygonCoordinate in GetMultiPolygonCoordinates(coords))
                {
                    polygons.Add(CreatePolygon(multiPolygonCoordinate));
                }
                return(_factory.CreateMultiPolygon(polygons.ToArray()));

            case GeoJsonObjectType.GeometryCollection:
                return(_factory.CreateGeometryCollection(GetGeometries(coords)));
            }
            return(null);
        }
Beispiel #8
0
 /// <summary>
 /// Transforms a <see cref="GeoAPI.Geometries.IMultiPoint"/>.
 /// </summary>
 /// <param name="points">MultiPoint to transform</param>
 /// <param name="transform">MathTransform</param>
 /// <param name="targetFactory">The factory to create the target geometry</param>
 /// <returns>Transformed MultiPoint</returns>
 public static IMultiPoint TransformMultiPoint(IMultiPoint points, IMathTransform transform, IGeometryFactory targetFactory)
 {
     return(targetFactory.CreateMultiPointFromCoords(TransformCoordinates(points.Coordinates, transform)));
 }