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#)的更多相关文章
- 弹出层layer的使用
弹出层layer的使用 Intro layer是一款web弹层组件,致力于服务各个水平段的开发人员.layer官网:http://layer.layui.com/ layer侧重于用户灵活的自定义,为 ...
- layer弹出信息框API
首先向大家推荐layer,在这里也非常感谢贤心的贡献,非常不错的信息框及弹出层解决方案,为一些项目的前端开发提高了很大的效率,希望layer 越办越好! 下面是API,呵呵,官方抄袭过来的,为了自己看 ...
- Caffe源码解析3:Layer
转载请注明出处,楼燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ layer这个类可以说是里面最终的一个基本类了,深度网络呢就是 ...
- jQuery layer[页面弹出框]
常见接口如下: 方法名 描述 $.layer({}) 核心接口,参数是一个对象,对象属性参见上述列表.诸如layer.alert()之类的为$.layer()的包装方法. layer.v 获取版本号. ...
- boost库之geometry<二>
#include <boost/assign.hpp> #include <boost/geometry/core/point_type.hpp> #include <b ...
- Layer弹层组件 二次扩展,项目中直接使用。
/************************ Layer扩展 ****************************/ /* * Layer弹出Alert提示框 * @param messag ...
- layer.open
1.type-基本层类型 类型:Number,默认:0 layer提供了5种层类型.可传入的值有:0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层). 若你采用layer. ...
- Caffe中Layer注册机制
Caffe内部维护一个注册表用于查找特定Layer对应的工厂函数(Layer Factory的设计用到了设计模式里的工厂模式).Caffe的Layer注册表是一组键值对(key, value)( La ...
- jquery 弹窗插件 layer 常见接口
源自:https://www.cnblogs.com/teamobaby/p/3556584.html 常见接口如下: 方法名 描述 $.layer({}) 核心接口,参数是一个对象,对象属性参见上述 ...
随机推荐
- oracle DBA笔试题
Unix/Linux题目: 1.如何查看主机CPU.内存.IP和磁盘空间? cat /proc/cpuinfo cat /proc/meminfo ifconfig –a fdisk –l 2.你 ...
- java io性能分析
摘要: 本文大多技术围绕调整磁盘文件 I/O,但是有些内容也同样适合网络 I/O 和窗口输出. 第一部分技术讨论底层的I/O问题,然后讨论诸如压缩,格式化和串行化等高级I/O问题.然而这个讨论没有包含 ...
- GridSearchCV 与 RandomizedSearchCV 调参
GridSearchCV GridSearchCV的名字其实可以拆分为两部分,GridSearch和CV,即网格搜索和交叉验证. 这两个概念都比较好理解,网格搜索,搜索的是参数,即在指定的参数范 ...
- $("[lay-id='"+this.id+"']")
$("[lay-id='"+this.id+"']") $("[lay-id='"+this.id+"'] .layui-tabl ...
- WNDCLASS和WNDCLASSEX
typedef struct { UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINST ...
- gym100825G. Tray Bien(轮廓线DP)
题意:3 * N的格子 有一些点是坏的 用1X1和1X2的砖铺有多少种方法 题解:重新学了下轮廓线 写的很舒服 #include <bits/stdc++.h> using namespa ...
- [css或js控制图片自适应]
[css或js控制图片自适应]图片自动适应大小是一个非常常用的功能,在进行制作的时候为了防止图片撑开容器而对图片的尺寸进行必要的控制,我们可不可以用CSS控制图片使它自适应大小呢?此个人博客想到了一个 ...
- python 3 廖雪峰博客笔记(三) 命令行模式与交互模式
python 的代码一般保存为 .py结尾的文本文件格式 比如 add.py 里写下如下内容 100 + 200 执行 add.py有两种方式: 1. 命令行方式:将python代码写入脚本中执行 p ...
- 梦回----32位CPU和64位CPU的通用寄存器
1 32位Intel的CPU通用寄存器 32位CPU所含有的寄存器有:4个数据寄存器(EAX.EBX.ECX和EDX):2个变址和指针寄存器(ESI和EDI):2个指针寄存器(ESP和EBP):6个段 ...
- Spring中操作日志记录web请求的body报文
在spring中,通常可以使用切面编程方式对web请求记录操作日志.但是这种方式存在一个问题,那就是只能记录url中的请求参数,无法记录POST或者PUT请求的报文体,因为报文体是放在request对 ...