http://forums.arcgis.com/threads/11481-how-to-get-geometry-type-of-layer-using-IMapServer3-and-IMapLayerInfo-(C-)

I need to create a REST extension that will return JSON looking like that:

"layers" : [ { "MaxScale" : 0,
"MinScale" : 0,
"defaultVisibility" : true,
"geometryType" : null,
"id" : 0,
"name" : "Name",
"parentLayerId" : -1,
"subLayerIds" : [ 1, 2 ]
},
{ "MaxScale" : 0,
"MinScale" : 0,
"defaultVisibility" : false,
"geometryType" : "esriGeometryPoint",
"id" : 1,
"name" : "NAME Offices",
"parentLayerId" : 0,
"subLayerIds" : null
}
... As I'm able to get almost all informations that I want, I have only issue getting geometryType anddefaultVisibility. I was trying to find a way by looking into DOCS, I'm sure If I will be able to get IGeometry interface I should be able to get geometry type, but how to get IGeometry interface starting from IMapServer3? Or there is other way to do it? Here is a code that is creating list of layers in JSON format:
private XxxLayerInfo[] GetLayerInfos()
{
IMapServer3 mapServer = _serverObjectHelper.ServerObject as IMapServer3;
if (mapServer == null)
throw new Exception("Unable to access XXX map server."); IMapServerInfo msInfo = mapServer.GetServerInfo(mapServer.DefaultMapName);
IMapLayerInfos layerInfos = msInfo.MapLayerInfos;
int length = layerInfos.Count; XxxLayerInfo[] xxxLayerInfos = new XxxLayerInfo[c][/c]; for(int i = 0; i < length; i++)
{
IMapLayerInfo layerInfo = layerInfos.get_Element(i);
xxxLayerInfos[i] = XxxLayerInfo.CreateXxxLayerInfo(layerInfo);
} return xxxLayerInfos;
} public static XxxLayerInfo CreateXxxLayerInfo(IMapLayerInfo mapLayerInfo)
{
var layer = new XxxLayerInfo();
layer.Id = mapLayerInfo.ID;
layer.Name = mapLayerInfo.Name;
layer.GeometryType = null; //mapLayerInfo.GeometryType - HOW TO GET this?;
layer.DefaultVisibility = false; //mapLayerInfo.DefaultVisibility - HOW TO GET this?;
layer.MinScale = mapLayerInfo.MinScale;
layer.MaxScale = mapLayerInfo.MaxScale;
layer.ParentLayerId = mapLayerInfo.ParentLayerID;
layer.SubLayers = mapLayerInfo.SubLayers; return layer;
} Ok, there is a way to do it with multiply casts and few extra loops (esri why?) As what surprising is that after 2 (?) months question staid without answer - the only place for Q reg ESRI. The full desc how to do it can be found here - text in PL. If you are interested only in code, here it is: // get map info
public static MapInfo ConstructFrom(IMapServer3 mapServer3)
{
// IMapServerInfo3 contains CopyrightText prop, 1 & 2 does not
var mapServerInfo = (IMapServerInfo3)mapServer3.GetServerInfo(mapServer3.DefaultMapName); var mapInfo = new MapInfo
{
Description = mapServerInfo.Description,
MapName = mapServerInfo.Name,
CopyrightText = mapServerInfo.CopyrightText
}; IMapLayerInfos layerInfos = mapServerInfo.MapLayerInfos;
for (int i = 0; i < layerInfos.Count; i++)
{
var layerInfo = layerInfos.Element[i]; mapInfo.Layers.Add(
LayerInfo.ConstructFrom(
layerInfo,
LayerInfo.IsLayerVisible(mapServerInfo, layerInfo.ID)
));
} return mapInfo;
} // get layer info
private static readonly int[] AvaliableReports = new[] {17,18,19,20};
public static LayerInfo ConstructFrom(IMapLayerInfo mapLayerInfo, bool visible)
{
var layerInfo = new LayerInfo
{
Id = mapLayerInfo.ID,
DisplayField = mapLayerInfo.DisplayField,
ScaleUpper = (int)mapLayerInfo.MaxScale,
ScaleLower = (int)mapLayerInfo.MinScale,
Name = mapLayerInfo.Name,
Description = mapLayerInfo.Description,
DefaultVisibility = visible,
ParentLayerId = mapLayerInfo.ParentLayerID,
}; IFields fields = mapLayerInfo.Fields;
bool addFields = false;
if (fields != null)
{
for (int j = 0; j < fields.FieldCount; j++)
{
IField field = fields.Field[j]; if (field.Type == esriFieldType.esriFieldTypeString)
{
layerInfo.DictFields[field.Name] = field.AliasName;
continue;
} if(field.Type != esriFieldType.esriFieldTypeGeometry)
{
continue;
} IGeometryDef geometryDef = field.GeometryDef; layerInfo.GeometryType = Enum.GetName(typeof(esriGeometryType), geometryDef.GeometryType); switch (geometryDef.GeometryType)
{
case esriGeometryType.esriGeometryNull:
layerInfo.GeometryType = null;
break;
case esriGeometryType.esriGeometryPoint:
addFields = true;
break;
}
}
} // hack: this should be done in a proper way... but for now is enough
layerInfo.ContainsReport = AvaliableReports.Contains(layerInfo.Id); if(!addFields)
{
layerInfo.DictFields = new Dictionary<string, string>();
} if (mapLayerInfo.SubLayers == null)
{
return layerInfo;
} for (int i = 0; i < mapLayerInfo.SubLayers.Count; i++)
{
layerInfo.SubLayerIds.Add(mapLayerInfo.SubLayers.Element[i]);
} return layerInfo;
} // get default visibility
public static bool IsLayerVisible(IMapServerInfo3 mapServerInfo, int layerId)
{
ILayerDescriptions layerDescs = mapServerInfo.DefaultMapDescription.LayerDescriptions;
long c = layerDescs.Count; for (long i = 0; i < c; i++)
{
var layerDesc = (ILayerDescription3)layerDescs.Element[i]; if (layerDesc.ID == layerId)
{
return layerDesc.Visible;
}
} return false;
}

how to get geometry type of layer using IMapServer3 and IMapLayerInfo? (C#)的更多相关文章

  1. 弹出层layer的使用

    弹出层layer的使用 Intro layer是一款web弹层组件,致力于服务各个水平段的开发人员.layer官网:http://layer.layui.com/ layer侧重于用户灵活的自定义,为 ...

  2. layer弹出信息框API

    首先向大家推荐layer,在这里也非常感谢贤心的贡献,非常不错的信息框及弹出层解决方案,为一些项目的前端开发提高了很大的效率,希望layer 越办越好! 下面是API,呵呵,官方抄袭过来的,为了自己看 ...

  3. Caffe源码解析3:Layer

    转载请注明出处,楼燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ layer这个类可以说是里面最终的一个基本类了,深度网络呢就是 ...

  4. jQuery layer[页面弹出框]

    常见接口如下: 方法名 描述 $.layer({}) 核心接口,参数是一个对象,对象属性参见上述列表.诸如layer.alert()之类的为$.layer()的包装方法. layer.v 获取版本号. ...

  5. boost库之geometry<二>

    #include <boost/assign.hpp> #include <boost/geometry/core/point_type.hpp> #include <b ...

  6. Layer弹层组件 二次扩展,项目中直接使用。

    /************************ Layer扩展 ****************************/ /* * Layer弹出Alert提示框 * @param messag ...

  7. layer.open

    1.type-基本层类型 类型:Number,默认:0 layer提供了5种层类型.可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层). 若你采用layer. ...

  8. Caffe中Layer注册机制

    Caffe内部维护一个注册表用于查找特定Layer对应的工厂函数(Layer Factory的设计用到了设计模式里的工厂模式).Caffe的Layer注册表是一组键值对(key, value)( La ...

  9. jquery 弹窗插件 layer 常见接口

    源自:https://www.cnblogs.com/teamobaby/p/3556584.html 常见接口如下: 方法名 描述 $.layer({}) 核心接口,参数是一个对象,对象属性参见上述 ...

随机推荐

  1. iOS-UI控件之UITableView(一)

    UITableView 介绍 UITableView 是用来用列表的形式显示数据的UI控件 举例 QQ好友列表 通讯录 iPhone设置列表 tableView 常见属性 // 设置每一行cell的高 ...

  2. 【C++】模板简述(六):总结

    1.模板技术是泛型编程的基础.([C++]模板简述(一):模板的引入) 2.模板被编译两次,因而给分离编译造成一些麻烦.([C++]模板简述(二):函数模板.[C++]模板简述(四):模板为什么不支持 ...

  3. 设计模式之一:strategy pattern

    定义算法族,彼此之间可以替换.变化的方法抽出封装,不变的父类定义继承.多用组合少用继承. 代码示例先不贴了.

  4. xamarin 学习笔记01-环境配置

    1.安装AndroidSDK 参考 2.安装NDK NDK下载地址:http://dl.google.com/android/ndk/android-ndk-r10e-windows-x86_64.e ...

  5. 强大的云存储与应用管理工具DzzOffice1.0 Beta(大桌子办公)发布下载

    之前在9月份我们发布了一份内测版,得到了1000多位朋友参与下载测试.经过2个月,结合测试后朋友们反馈的问题,和开发建议.终于完成了这次Beta版的开发.感谢这两个月中参与测试,和帮助我们完善程序的朋 ...

  6. Swift Intermediate Language (SIL)

    Swift Intermediate Language (SIL) https://github.com/apple/swift/blob/master/docs/SIL.rst#witness-me ...

  7. Spring Cloud练习1

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  8. MySql索引笔记

    MySQL 索引是什么 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和 ...

  9. Go:工厂模式

    Go的结构体没有构造函数,通常可以使用工厂模式来解决这个问题. 一个结构体的声明是这样的: package model type Student struct { Name string } 因为 S ...

  10. 《深入浅出深度学习:原理剖析与python实践》第八章前馈神经网络(笔记)

    8.1 生物神经元(BN)结构 1.人脑中有100亿-1000亿个神经元,每个神经元大约会和其他1万个神经元相连 2.细胞体:神经元的主体,细胞体=细胞核+细胞质+细胞膜,存在膜电位 3.树突:从细胞 ...