public JsonFeature Map(Feature feature)
        {
            if (feature == null)
            {
                return(null);
            }

            var result = new JsonFeature
            {
                Name        = feature.Name,
                Description = feature.Description,
                Result      = this.resultMapper.Map(feature.Result),
                Tags        = feature.Tags.ToArray().ToList(),
            };

            result.FeatureElements.AddRange(feature.FeatureElements.Select(this.MapFeatureElement).ToList());
            result.Background = this.scenarioMapper.Map(feature.Background);

            if (result.Background != null)
            {
                result.Background.Feature = result;
            }

            foreach (var featureElement in result.FeatureElements)
            {
                featureElement.Feature = result;
            }

            return(result);
        }
예제 #2
0
        public JsonFeature Map(Feature feature)
        {
            if (feature == null)
            {
                return null;
            }

            var result = new JsonFeature
            {
                Name = feature.Name,
                Description = feature.Description,
                Result = this.resultMapper.Map(feature.Result),
                Tags = feature.Tags.ToArray().ToList(),
            };

            result.FeatureElements.AddRange(feature.FeatureElements.Select(this.MapFeatureElement).ToList());
            result.Background = this.scenarioMapper.Map(feature.Background);

            if (result.Background != null)
            {
                result.Background.Feature = result;
            }

            foreach (var featureElement in result.FeatureElements)
            {
                featureElement.Feature = result;
            }

            return result;
        }
예제 #3
0
        public void Map_NullFeature_ReturnsNullJsonFeature()
        {
            var mapper = CreateMapper();

            JsonFeature actual = mapper.Map(null);

            Check.That(actual).IsNull();
        }
예제 #4
0
        private Feature ToFeature(IFeatureClass fc, JsonFeature jsonFeature)
        {
            var feature = new Feature();

            feature.Shape = jsonFeature.Geometry.ToGeometry();
            var attributes = (IDictionary <string, object>)jsonFeature.Attributes;

            if (attributes == null)
            {
                throw new ArgumentException("No features attributes!");
            }

            for (int f = 0, fieldCount = fc.Fields.Count; f < fieldCount; f++)
            {
                var field = fc.Fields[f];

                if (attributes.ContainsKey(field.name))
                {
                    switch (field.type)
                    {
                    case FieldType.ID:
                        feature.Fields.Add(new FieldValue(field.name, attributes[field.name]));
                        feature.OID = Convert.ToInt32(attributes[field.name]);
                        break;

                    case FieldType.Date:
                        object val = attributes[field.name];
                        if (val is string)
                        {
                            if (val.ToString().Contains(" "))
                            {
                                val = DateTime.ParseExact(val.ToString(), "dd.MM.yyyy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
                            }
                            else
                            {
                                val = DateTime.ParseExact(val.ToString(), "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture);
                            }
                        }
                        else if (val is long || val is int)
                        {
                            long esriDate = Convert.ToInt64(val);
                            val = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(esriDate);
                        }
                        feature.Fields.Add(new FieldValue(field.name, val));
                        break;

                    default:
                        feature.Fields.Add(new FieldValue(field.name, attributes[field.name]));
                        break;
                    }
                }
            }

            return(feature);
        }
예제 #5
0
        public JsonResult EditFences(Map map, GeoCollection <object> args)
        {
            Collection <JsonFeature> jsonFeatures = new Collection <JsonFeature>();

            LayerOverlay         spatialFenceOverlay = (LayerOverlay)map.CustomOverlays["SpatialFenceOverlay"];
            InMemoryFeatureLayer spatialFenceLayer   = (InMemoryFeatureLayer)spatialFenceOverlay.Layers["SpatialFenceLayer"];

            foreach (Feature feature in spatialFenceLayer.InternalFeatures)
            {
                // Add feature into editOverlay on server side to make sure it's synchronous on client and server side
                map.EditOverlay.Features.Add(feature);
                // Create feature on client side
                JsonFeature jsonFeature = new JsonFeature(feature.Id, feature.GetWellKnownText());
                jsonFeatures.Add(jsonFeature);
            }
            return(Json(jsonFeatures));
        }
예제 #6
0
        private void Query(IServiceRequestContext context, bool isFeatureServer = false)
        {
            try
            {
                var query = JsonConvert.DeserializeObject <JsonQueryLayer>(context.ServiceRequest.Request);

                List <JsonFeature> jsonFeatures             = new List <JsonFeature>();
                List <JsonFeatureResponse.Field> jsonFields = new List <JsonFeatureResponse.Field>();
                string               objectIdFieldName      = String.Empty;
                EsriGeometryType     esriGeometryType       = EsriGeometryType.esriGeometryAny;
                JsonSpatialReference featureSref            = null;

                using (var serviceMap = context.CreateServiceMapInstance())
                {
                    string filterQuery;

                    var tableClasses = FindTableClass(serviceMap, query.LayerId.ToString(), out filterQuery);
                    if (isFeatureServer == true && tableClasses.Count > 1)
                    {
                        throw new Exception("FeatureService can't be used with aggregated feature classes");
                    }

                    foreach (var tableClass in tableClasses)
                    {
                        objectIdFieldName = tableClass.IDFieldName;
                        if (tableClass is IFeatureClass)
                        {
                            esriGeometryType = JsonLayer.ToGeometryType(((IFeatureClass)tableClass).GeometryType);
                        }

                        QueryFilter filter;
                        if (!String.IsNullOrWhiteSpace(query.Geometry))
                        {
                            filter = new SpatialFilter();
                            var jsonGeometry = JsonConvert.DeserializeObject <Rest.Json.Features.Geometry.JsonGeometry>(query.Geometry);
                            ((SpatialFilter)filter).Geometry = jsonGeometry.ToGeometry();
                            ((SpatialFilter)filter).FilterSpatialReference = SRef(query.InSRef);
                        }
                        else
                        {
                            filter = new QueryFilter();
                        }
                        if (query.ReturnCountOnly == true)
                        {
                            filter.SubFields = !String.IsNullOrWhiteSpace(tableClass.IDFieldName) ? tableClass.IDFieldName : "*";
                        }
                        else
                        {
                            filter.SubFields = query.OutFields;
                        }
                        filter.WhereClause = query.Where;

                        if (!String.IsNullOrWhiteSpace(query.OutSRef))
                        {
                            filter.FeatureSpatialReference = SRef(query.OutSRef);
                        }
                        else if (tableClass is IFeatureClass)
                        {
                            filter.FeatureSpatialReference = ((IFeatureClass)tableClass).SpatialReference;
                        }
                        if (filter.FeatureSpatialReference != null)
                        {
                            try
                            {
                                featureSref = new JsonSpatialReference()
                                {
                                    Wkid = int.Parse(filter.FeatureSpatialReference.Name.Split(':')[1])
                                };
                            }
                            catch { }
                        }

                        if (filterQuery != String.Empty)
                        {
                            filter.WhereClause = (filter.WhereClause != String.Empty) ?
                                                 "(" + filter.WhereClause + ") AND " + filterQuery :
                                                 filterQuery;
                        }

                        #region Feature Spatial Reference

                        if (query.OutSRef != null)
                        {
                            filter.FeatureSpatialReference = SRef(query.OutSRef);
                        }

                        #endregion

                        var cursor = tableClass.Search(filter);

                        bool firstFeature = true;
                        if (cursor is IFeatureCursor)
                        {
                            IFeature       feature;
                            IFeatureCursor featureCursor = (IFeatureCursor)cursor;
                            while ((feature = featureCursor.NextFeature) != null)
                            {
                                var jsonFeature    = new JsonFeature();
                                var attributesDict = (IDictionary <string, object>)jsonFeature.Attributes;

                                if (feature.Fields != null)
                                {
                                    foreach (var field in feature.Fields)
                                    {
                                        object val = field.Value;
                                        if (val is DateTime)
                                        {
                                            val = Convert.ToInt64(((DateTime)val - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds);
                                        }
                                        attributesDict[field.Name] = val;

                                        if (firstFeature)
                                        {
                                            var tableField = tableClass.FindField(field.Name);
                                            if (tableField != null)
                                            {
                                                jsonFields.Add(new JsonFeatureResponse.Field()
                                                {
                                                    Name   = tableField.name,
                                                    Alias  = tableField.aliasname,
                                                    Length = tableField.size,
                                                    Type   = JsonField.ToType(tableField.type).ToString()
                                                });
                                            }
                                        }
                                    }
                                }

                                jsonFeature.Geometry = feature.Shape?.ToJsonGeometry();

                                jsonFeatures.Add(jsonFeature);
                                firstFeature = false;
                            }
                        }
                    }
                }

                context.ServiceRequest.Succeeded = true;

                if (isFeatureServer)
                {
                    context.ServiceRequest.Response = JsonConvert.SerializeObject(new JsonFeatureServiceQueryResponse()
                    {
                        ObjectIdFieldName = objectIdFieldName,
                        GeometryType      = esriGeometryType.ToString(),
                        SpatialReference  = featureSref,
                        Fields            = jsonFields.ToArray(),
                        Features          = jsonFeatures.ToArray()
                    });
                }
                else if (query.ReturnCountOnly == true)
                {
                    context.ServiceRequest.Response = JsonConvert.SerializeObject(new JsonFeatureCountResponse()
                    {
                        Count = jsonFeatures.Count()
                    });
                }
                else
                {
                    context.ServiceRequest.Response = JsonConvert.SerializeObject(new JsonFeatureResponse()
                    {
                        GeometryType     = esriGeometryType.ToString(),
                        SpatialReference = featureSref,
                        Fields           = jsonFields.ToArray(),
                        Features         = jsonFeatures.ToArray()
                    });
                }
            }
            catch (Exception ex)
            {
                context.ServiceRequest.Succeeded = false;
                context.ServiceRequest.Response  = JsonConvert.SerializeObject(new JsonError()
                {
                    error = new JsonError.Error()
                    {
                        code    = -1,
                        message = ex.Message
                    }
                });
            }
        }