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;
        }