private bool TryParseCoordinate(JArray coordinates, out CoordinateInfo result)
 {
     if (coordinates != null && coordinates.Count > 1 && coordinates.All(x => x is JValue))
     {
         var vals = coordinates.Cast<JValue>().ToList();
         if (vals.All(x => x.Type == JTokenType.Float || x.Type == JTokenType.Integer))
         {
             result = new CoordinateInfo
             {
                 X = Convert.ToDouble(vals[0].Value),
                 Y = Convert.ToDouble(vals[1].Value),
                 Z = vals.Count > 2 ? Convert.ToDouble(vals[2].Value) : (double?)null,
                 M = vals.Count > 3 ? Convert.ToDouble(vals[3].Value) : (double?)null
             };
             return true;
         }
     }
     result = null;
     return false;
 }
        private bool TryParseCoordinateArray(JArray coordinates, out CoordinateInfo[] result)
        {
            result = null;
            if (coordinates == null)
                return false;

            var valid = coordinates.All(x => x is JArray);
            if (!valid)
                return false;

            var tempResult = new CoordinateInfo[coordinates.Count];
            for (var index = 0; index < coordinates.Count; index++)
            {
                if (!TryParseCoordinate((JArray)coordinates[index], out tempResult[index]))
                    return false;
            }
            result = tempResult;
            return true;
        }
 public object ToPolygon(CoordinateInfo[][] coordinates)
 {
     if (coordinates.Length == 0)
         return Polygon.Empty;
     return _geometryFactory.CreatePolygon(
         _geometryFactory.CreateLinearRing(coordinates.First().Select(MakeCoordinate).ToArray()),
         coordinates.Skip(1).Select(x => _geometryFactory.CreateLinearRing(x.Select(MakeCoordinate).ToArray())).ToArray()
         );
 }
 private Coordinate MakeCoordinate(CoordinateInfo coordinate)
 {
     if (coordinate.Z.HasValue)
         return new Coordinate(coordinate.X, coordinate.Y, coordinate.Z.Value);
     return new Coordinate(coordinate.X, coordinate.Y);
 }
 public object ToMultiPolygon(CoordinateInfo[][][] coordinates)
 {
     if (coordinates.Length == 0)
         return MultiPolygon.Empty;
     return _geometryFactory.CreateMultiPolygon(coordinates.Select(ToPolygon).Cast<IPolygon>().ToArray());
 }
 public object ToPoint(CoordinateInfo coordinates)
 {
     if (coordinates == null)
         return Point.Empty;
     return _geometryFactory.CreatePoint(MakeCoordinate(coordinates));
 }
 public object ToMultiLineString(CoordinateInfo[][] coordinates)
 {
     if (coordinates.Length == 0)
         return MultiLineString.Empty;
     return _geometryFactory.CreateMultiLineString(coordinates.Select(ToLineString).Cast<IBasicLineString>().ToArray());
 }
 public object ToLineString(CoordinateInfo[] coordinates)
 {
     if (coordinates.Length == 0)
         return LineString.Empty;
     return _geometryFactory.CreateLineString(coordinates.Select(MakeCoordinate).ToArray());
 }
        public object ToEnvelope(CoordinateInfo[] coordinates)
        {
            if (coordinates == null || coordinates.Length != 2)
                return null;

            return new Envelope(MakeCoordinate(coordinates[0]), MakeCoordinate(coordinates[1]));
        }
        private static void WriteJsonCoordinate(JsonWriter writer, CoordinateInfo coordinate)
        {
            writer.WriteStartArray();

            writer.WriteValue(coordinate.X);
            writer.WriteValue(coordinate.Y);

            if (coordinate.Z.HasValue)
                writer.WriteValue(coordinate.Z.Value);

            if (coordinate.Z.HasValue && coordinate.M.HasValue)
                writer.WriteValue(coordinate.M.Value);

            writer.WriteEndArray();
        }
 protected static void WriteJsonCoordinatesEnumerable2(JsonWriter writer, CoordinateInfo[][][] coordinates)
 {
     writer.WriteStartArray();
     foreach (var coordinate in coordinates)
         WriteJsonCoordinatesEnumerable(writer, coordinate);
     writer.WriteEndArray();
 }