2009年3月16日星期一
2009年3月15日星期日
【原】ArcGIS中最短路径的实现(一)
几何网络是一种特殊的特征要素类,由一系列不同类别的点要素和线要素(可以度量并能图形表达)组成的,可在FeatureDataset下面创建,可进行图形与属性的编辑。包括流向分析和追踪分析两大功能。主要接口是ITraceFlowSolver。我们先在一幅地图上做出一个几何网络才能进行最短路径分析。下面是主要的一些步骤(ArcMap帮助中琐碎的说明有三四十项,被我省略很多):
- 打开ArcCatalog,连接到包含地图的文件夹。
- 在空白处,右键新建一个“Personal GeoDatabase”。
- 在生成的Personal GeoDatabase上右键新建一个feature dataset。
- 双击Personal GeoDatabase进去,找到刚才new出的feature dataset,右键Import导入Feature Class(Single),选择要建立几何网络的图层或者shape文件。
- 然后再右键新建一个Geometric Network,选择从已存在的图元中建立几何网络。
- 打开ArcMap,把刚才建立的“Personal GeoDatabase Feature Class”添加到地图中,这样几何网络就建立好了。
这样我们就建立好一个几何网络了。我们现在要通过编程来实现最短路径,用到的接口主要有INetworkCollection,IGeometricNetwork,IPointToEID,ITraceFlowSolverGEN(它实现了ITraceFlowSolver的接口),INetSchema,IEIDHelper等。主要步骤如下:
- 获取几何网络工作空间
- 定义一个边线旗数组,把离点串最近的网络元素添加进数组
- 设置开始和结束边线的权重
- 进行路径分析
- 得到路径分析的结果
具体的程序太过繁琐、冗长了,这里不便贴出,可以打开这个链接查看源程序。http://www.cnblogs.com/3echo/archive/2008/01/24/865527.html
相关链接:ArcGIS中最短路径的实现(二)
【原】Boost库之tuple、any和variant的使用
tuple支持一次直接声明和使用n个不同数据类型的变量。对于有多个返回值的函数,我们再也不用定义一个结构体作为函数的返回值类型了,也不用通过对参数进行引用来传出返回值(这样返回值的概念不太明确),而是可以直接使用tuple。
◆ 声明一个tuple类型的对象:tuple<int,double,string> triple(42, 3.14, "hello world");
◆ 获得tuple中某个变量的值:string s = get<2>(triple);
◆ 获得tuple中所有变量的值:tie(nAdd, dbSub, strText) = triple;
◆ 通过几个变量构造一个tuple类型的变量:tuple<int,int> temp = make_tuple(3, 5);
any支持存储任意类型的变量,但它只允许你在知道类型的前提下访问它的值。如果类型不符合,则any会抛出一个bad_any_cast的异常。如果访问的是指针,则类型符合时返回的指针是一个有效值,否则返回的指针为空(此时不会抛出异常)。
◆ 给any赋任意类型的值:any a; a = 42; a= string("hello world"); a=3.14;
◆ 获得any中存储的值:double dbTemp = any_cast<double>(a);
◆ 获得any中存储值的指针:string *pString = any_cast<string *>(a);
variant支持存储和操作来自于多个不同类型的变量。获得variant中当前存储的值时,如果给定的类型与实际存储值的类型不符合,会抛出一个bad_get的异常。如果要获得的是指针,则类型符合时返回的指针是一个有效值,否则返回的指针为空(此时不会抛出异常)。这里需要着重谈一下variant与tuple和any的区别:tuple可以保存n个变量的值,而variant只能保存一个变量的值; any可以保存任意类型的变量,而variant只能保存指定数据类型的变量。
◆ 声明一个variant类型的对象:variant<int,double,string> va("hello world");
◆ 给variant赋值: va=3.14; va=42;
◆ 获得variant中当前存储的值:int nTemp = get<int>(va);
◆ 获得指向variant中存储的值的指针:string *pString = get<string *>(&va);
2009年3月9日星期一
[原] 涂鸦SD
【原】设计3+2
比如网站方面,基本上图片加文字,好一些的加入了FLASH动效果,而现在高档的网站则更多的结合了3D效果,可以让人真实的更加身临其境的,全方位体会它的产品和想表达的境界!最近一直在接触宣传册的设计,下面聊些关于用3D做宣传册效果的尝试,以前做印刷品的效果图,我通常还 是会用平面工具,这样也可以很好表达出想要展示的效果,但如果上,下,左,右效果都要的话,我就要出N张不同的图(同时还要注意透视关系),那叫一个烦琐,,如果利用3D对作品进行表现就可以大大加快制作速度,同时在不失创意的情下,可以更有效地把握自己要表达的意图。

同时3D制作过程中的:
1.视点(摄像机)是可以任意移动并改变角度
2.灯光(光影的变化)光源位置明暗效果
3.质感(材质渲染)
都显得非常灵活,不但能细致地表现对象,更能更易于修改画面!
本人还处在学习摸索阶段,希望以后能有更好的想法与各位分享!
:D以下是2张简单的建模贴图的应用:
【原】关于const修饰符的问题
- const int n = 10;
- const char * pszTemp = "a";
- char const * pszTemp2 = "c";
- char * const pszTemp3 = "b";
- const char * const pszTemp4 = "e";
- pszTemp = "d";
- pszTemp2 = "e";
- pszTemp3 = "f";
- pszTemp4 = "f";
- lstrcpy(pszTemp, "d");
- lstrcpy(pszTemp2, "d");
- lstrcpy(pszTemp3, "d");
- lstrcpy(pszTemp4, "f");
把这段程序拿到VC6的环境下编译,会发现编译出错。第8、9、10、11和13行都有错误。我们先从第2行开始分析。第2行定义了一个名叫pszTemp 的字符串指针,const放在char *之前,表明它是一个指向常量的指针变量,它指向的常量值不可以改变,所以第10行会编译出错,但是它保存的地址却可以改变,所以我们仍然可以通过改变它指向的地址来改变它的值。第3行同第2行。第4行定义了一个常指针,表明它本身是常量,而不是它指向的对象声明为常量。所以第8行出错,而第12行却可以通过。第5行是定义了一个指向常量的常指针,所以无论是对它指向的值的改变还是指针本身值的改变都是不允许的。因此,第9行和13行写法都是错误的。
下面再贴几行代码,有兴趣的读者可以指出其中出错的行数。
- const int *pAge = new int(1);
- int const *pAge2 = new int(2);
- int * const pAge3 = new int(3);
- const int * const pAge4 = new int(4);
- *pAge = n;
- *pAge2 = n;
- *pAge3 = n;
- *pAge4 = n;
- pAge = &n;
- pAge2 = &n;
- pAge3 = &n;
- pAge4 = &n;
【原】Boost库使用入门
Boost库当前的最新版本为V1.38.0,大家可以到Boost库的官网http://www.boost.org/去下载,下载后直接安装即可。这里需要格外注意的是,Boost的绝大部分库只需要包含头文件就可以直接使用了,而另外一些库,比如正则表达式库(regex)、线程库(thread),需要编译生成lib和dll后才能使用。
Boost库主要包含以下几个大类:
1.字符串及文本处理
2.输入/输出
3.数学和数字处理
4.泛型编程和模板元编程
5.函数对象及高级编程
6.数据结构、容器、迭代器和算法
7.杂项
大家在学习Boost库的过程中,肯定会遇到这样或那样的问题,这是很正常的。这里,我把自己在学习中总结出来的一些注意事项列出来,以供大家参考:
1.由于VC6对模板类的支持不是很好,因此,使用有些Boost库(如string_algo库)时在VC6下无法编译成功,可以使用VC7或更高的VC版本来解决这一问题。
2.由于VC6的编译器并不是完全支持C++标准,因此使用有些库时即使编译通过了,但运行的结果可能会不正确,解决方法同上。
3.安装完Boost库之后,需要将Boost库的根路径添加到VC的Include Files和Library Files中。
4.与使用STL库一样,使用Boost库时,最好使用using namespace boost来声明名字空间boost。
最后,列出学习Boost库的一些实用资源:
1.Boost库的SDK
2.《超越c++标准库——boost程序库导论》
3.Boost官方网站
4.Boost中文站
OK,Boost库的概述就讲这么多。让我们赶快进入Boost库的神秘世界吧,Let′s go!
2009年3月8日星期日
【原】AE之鹰眼的实现
鹰眼和主地图的互动,主要体现在两个方面:一是主地图的地图改变了,则鹰眼里的矩形框要移动到对应的位置,以指示当前地图在整个地图中的位置;二是鹰眼的矩形框移动了,则主地图中显示的地图要移动到相应的位置。
AE中显示地图的控件叫 ESRI MapControl,这里主要用到了它的OnAfterDraw事件。在主地图的OnAfterDraw事件中,根据当前地图的大小,改变鹰眼中矩形框的大小;在鹰眼的OnAfterDraw事件中,根据矩形框的位置,确定主地图中地图的位置。google地图的鹰眼还实现了矩形框的拖动,这个也很好实现,呵呵。在鼠标点击到鹰眼控件时,先判断是否在矩形框内,如果在的话,用一个状态量记住这个状态,此时如果鼠标移动,则矩形框跟着相应的移动;若不在矩形框内,则矩形框移动到鼠标点击的位置。
【原】谈谈网络视频监控系统软件平台的发展趋势
从当前行业的局面来看,伴随着各厂商硬件产品差距的日益缩小,视频监控在未来的竞争将是软件平台的竞争。谁家平台做的好,谁就在竞争中占有绝对优势。那么,软件平台会如何发展,向着哪个方向发展?个人看来有以下几方面趋势:
- 需要具备支持其他厂商设备接入的能力,我们称之为“吸收性”。做大系统,做运营,不能方便的接入其他厂商的设备怎么可以?吸收性强,系统才有可能做大。所以,系统在设计之初就要考虑这一点。
- 系统要有足够的扩容能力。当系统中的设备由原有的几十台突然上升为几百台甚至上千台的时候,如何才能够微笑着去面对?假设系统设计之初便考虑到这点,那么一个灵活而有效的系统结构将会使该问题迎刃而解。
- 必须具备一套功能全面、界面友好并且易于定制的客户端软件。以前我们说服务器的性能好坏很重要,但是将来客户端的性能会需要我们更多的投入,良好的用户体验不仅仅能够锦上添花,有时甚至可以起到决定性的关键作用。
- 系统要便于搭建和配置、易组网。在系统模块较多的情况下,这个问题需要尤为注意。
- 具备良好的平台兼容性,这可能已经是默认的潜规则了,不需要多说,Linux必须要支持。
- 具备良好的稳定性,这点真是易说不易做。监控这个行业要求我们服务器稳定,客户端也要稳定。做一个系统很简单,想做好就要下功夫。
目前应该还没有一个厂家敢说他的系统已经做到最好,事实上很多厂家还没有自己的系统。这让我们的竞争变得更加残酷,也让我们对未来充满信心。因为创世已经走在了前面,我们还将继续大踏步向前迈进。








