创建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());