GNServer(几何网络分析)扩展ArcGIS Rest—服务器端实现

10 篇文章 0 订阅

创建schema


private RestResource CreateRestSchema()
        {
            RestResource rootRes = new RestResource(soe_name, false, RootResHandler, capabilityGetInfo);
            RestOperation traceOper = new RestOperation("Trace",
                                                      new string[] { "JunctionFlags", "EdgeFlags", "JunctionBarriers", "EdgeBarriers", "TraceType", "DisableLayers", "EdgeOutFields", "JunctionOutFields" },
                                                      new string[] { "json" },
                                                      TraceOperHandler);
            rootRes.operations.Add(traceOper);
            return rootRes;
        }

处理函数

处理函数声明

private byte[] TraceOperHandler(NameValueCollection boundVariables,
                                                  JsonObject operationInput,
                                                      string outputFormat,
                                                      string requestProperties,
                                                  out string responseProperties)

获取处理函数

if (gnJunctionFlags == null && gnEdgeFlags == null) return null;
            object[] gnJunctionFlagsArray;
            if (gnJunctionFlags != null)
                gnJunctionFlags.TryGetArray("features", out gnJunctionFlagsArray);
            else
                gnJunctionFlagsArray = null;
            object[] gnEdgeFlagsArray;
            if (gnEdgeFlags != null)
                gnEdgeFlags.TryGetArray("features", out gnEdgeFlagsArray);
            else
                gnEdgeFlagsArray = null;

            JsonObject gnJunctionBarriers;
            operationInput.TryGetJsonObject("JunctionBarriers", out gnJunctionBarriers);
            object[] gnJunctionBarriersArray;
            if (gnJunctionBarriers != null)
                gnJunctionBarriers.TryGetArray("features", out gnJunctionBarriersArray);
            else
                gnJunctionBarriersArray = null;

            JsonObject gnEdgeBarriers;
            operationInput.TryGetJsonObject("EdgeBarriers", out gnEdgeBarriers);
            object[] gnEdgeBarriersArray;
            if (gnEdgeBarriers != null)
                gnEdgeBarriers.TryGetArray("features", out gnEdgeBarriersArray);
            else
                gnEdgeBarriersArray = null;

            string traceType;
            operationInput.TryGetString("TraceType", out traceType);

            string strgnDisableLayers;
            operationInput.TryGetString("DisableLayers", out strgnDisableLayers);

            string strgnEdgeOutFields;
            operationInput.TryGetString("EdgeOutFields", out strgnEdgeOutFields);

            string strgnJunctionOutFields;
            operationInput.TryGetString("JunctionOutFields", out strgnJunctionOutFields);

业务实现

switch (traceType)
            {
                case "Find Common Ancestors":
                    traceFlowSolver.FindCommonAncestors(esriFlowElements.esriFEJunctionsAndEdges, out junctionEIDs, out edgeEIDs);
                    break;
                case "Find Connected":
                    traceFlowSolver.FindFlowElements(esriFlowMethod.esriFMConnected, esriFlowElements.esriFEEdges, out junctionEIDs, out edgeEIDs);
                    break;
                case "Find Loops":
                    traceFlowSolver.FindCircuits(esriFlowElements.esriFEEdges, out junctionEIDs, out edgeEIDs);
                    break;
                case "Find Disconnected":
                    traceFlowSolver.FindFlowUnreachedElements(esriFlowMethod.esriFMConnected, esriFlowElements.esriFEEdges, out junctionEIDs, out edgeEIDs);
                    break;
                case "Find Path Upstream":
                    traceFlowSolver.FindPath(esriFlowMethod.esriFMUpstream, esriShortestPathObjFn.esriSPObjFnMinSum, out junctionEIDs, out edgeEIDs, count, ref segmentsCosts);
                    break;
                case "Find Path":
                    traceFlowSolver.FindPath(esriFlowMethod.esriFMConnected, esriShortestPathObjFn.esriSPObjFnMinSum, out junctionEIDs, out edgeEIDs, count, ref segmentsCosts);
                    break;
                case "Trace Downstream":
                    traceFlowSolver.FindFlowElements(esriFlowMethod.esriFMDownstream, esriFlowElements.esriFEJunctionsAndEdges, out junctionEIDs, out edgeEIDs);
                    break;
                case "Find Upstream Accumulation":
                    traceFlowSolver.FindAccumulation(esriFlowMethod.esriFMUpstream, esriFlowElements.esriFEJunctionsAndEdges, out junctionEIDs, out edgeEIDs, out totalCosts);
                    break;
                case "Trace Upstream":
                    traceFlowSolver.FindFlowElements(esriFlowMethod.esriFMUpstream, esriFlowElements.esriFEJunctionsAndEdges, out junctionEIDs, out edgeEIDs);
                    break;
                default:
                    break;
            }

构造返回结果

if (edgeEIDs != null)
            {
                IEnumEIDInfo enumEdgeInfo = eidHelper.CreateEnumEIDInfo(edgeEIDs);
                IEIDInfo edgeInfo = enumEdgeInfo.Next();
                while (edgeInfo != null)
                {
                    JsonObject featureJson = new JsonObject();
                    JsonObject geoJson = new JsonObject();
                    JsonObject attrJson = new JsonObject();
                    IFeature feature = edgeInfo.Feature;
                    IFields fields = feature.Fields;
                    geoJson = Conversion.ToJsonObject(edgeInfo.Geometry);
                    featureJson.AddJsonObject("geometry", geoJson);
                    if (gnEdgeOutFields != null)
                    {
                        for (int egfieldIndex = 0; egfieldIndex < fields.FieldCount; egfieldIndex++)
                        {
                            IField field = fields.get_Field(egfieldIndex);
                            if (gnEdgeOutFields.Contains(field.Name))
                            {
                                string value = "";
                                if (feature.get_Value(egfieldIndex) != null) value = feature.get_Value(egfieldIndex).ToString();
                                attrJson.AddString(field.Name, value);
                            }
                        }
                        featureJson.AddJsonObject("attributes", attrJson);
                    }
                    tracedEdges[tracedEdgesIndex] = featureJson;
                    tracedEdgesIndex++;
                    edgeInfo = enumEdgeInfo.Next();
                }
            }
            if (junctionEIDs != null)
            {
                IEnumEIDInfo enumJuncInfo = eidHelper.CreateEnumEIDInfo(junctionEIDs);
                IEIDInfo juncInfo = enumJuncInfo.Next();
                while (juncInfo != null)
                {
                    JsonObject featureJson = new JsonObject();
                    JsonObject geoJson = new JsonObject();
                    JsonObject attrJson = new JsonObject();
                    IFeature feature = juncInfo.Feature;
                    IFields fields = feature.Fields;
                    geoJson = Conversion.ToJsonObject(juncInfo.Geometry);
                    featureJson.AddJsonObject("geometry", geoJson);
                    if (gnJunctionOutFields != null)
                    {
                        for (int juncfieldIndex = 0; juncfieldIndex < fields.FieldCount; juncfieldIndex++)
                        {
                            IField field = fields.get_Field(juncfieldIndex);
                            if (gnJunctionOutFields.Contains(field.Name))
                            {
                                string value = "";
                                if (feature.get_Value(juncfieldIndex) != null) value = feature.get_Value(juncfieldIndex).ToString();
                                attrJson.AddString(field.Name, value);
                            }
                        }
                        featureJson.AddJsonObject("attributes", attrJson);
                    }                    
                    tracedJuncs[tracedJuncsIndex] = featureJson;
                    tracedJuncsIndex++;
                    juncInfo = enumJuncInfo.Next();
                }
            }
            JsonObject result = new JsonObject();
            result.AddArray("Edges", tracedEdges);
            result.AddArray("Junctions", tracedJuncs);

            return Encoding.UTF8.GetBytes(result.ToJson());


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值