叠加分析算法对比研究(vector map overlay algorithm)
--- by wangsh
1. 介绍:
叠加分析是 GIS中的一项非常重要的空间分析功能。是指在统一空间参考系统下,通过对两个数据进行的一系列集合运算,产生新数据的过程。这里提到的数据可以是图层对应的数据集,也可以是地物对象。叠加分析的目的就是通过对空间数据的加工或分析,提取用户需要的新的空间几何信息。在叠加分析中至少涉及到三个数据,其中一个数据的类型可以是点、线、面等,被称作输入数据(Demo中称作被操作图层/地物);另一个数据是面数据被称作叠加数据(Demo中称作操作图层/地物);还有一个数据就是叠加结果数据,包含叠加后数据的几何信息和属性信息。
叠加分析类型包括:
(参见http://i.supermap.com.cn:7080/demo/help/OverlayAnalystHelp_GL.htm介绍)
2. 说明:本文介绍了叠加分析的主要算法进展,没有做过对比试验,仅仅列出开源项目的代码位置和相关的项目信息。
3. 开源项目介绍
参考资料1给出了拥有overlay开源项目总结,但是我不同意Blog主的想法,从代码风格来看CGAL固然好,但是GEOS和GRASS的代码也是各有千秋,值得大家学习的。
JTS(见参考资料2)是一个成熟的开源GIS项目,Java语言实现的拓扑分析的开发套件。(源码位置参见com.vividsolutions.jts.operation.overlay)
GEOS(见参考资料3)是一个成熟的开源GIS项目,是JTS的C++版本,现在已经到了3.1版本,为QGIS等开源GIS平台使用(代码位置geos31/source/geom/Geometry.cpp),参见:
代码参见:
Geometry*Geometry::intersection(constGeometry *other)const
{
return OverlayOp::overlayOp(this,other, OverlayOp::opINTERSECTION);
}
Geometry*Geometry::Union(constGeometry *other)const
//throw(TopologyException *, IllegalArgumentException *)
{
Geometry *out =NULL;
#ifdefSHORTCIRCUIT_PREDICATES
// if envelopes are disjoint return a MULTI geom or
// a geometrycollection
if ( ! getEnvelopeInternal()->intersects(other->getEnvelopeInternal()) )
{
//cerr<<"SHORTCIRCUITED-UNION engaged"<
const GeometryCollection *coll;
size_t ngeoms, i;
vector<Geometry *> *v =new vector<Geometry *>();
if ( NULL != (coll = dynamic_cast<const GeometryCollection *>(this)) )
{
ngeoms = coll->getNumGeometries();
for (i=0;i<ngeoms;i++)
v->push_back(coll->getGeometryN(i)->clone());
} else {
v->push_back(this->clone());
}
if ( NULL != (coll = dynamic_cast<const GeometryCollection *>(other)) )
{
ngeoms = coll->getNumGeometries();
for (i=0;i<ngeoms;i++)
v->push_back(coll->getGeometryN(i)->clone());
} else {
v->push_back(other->clone());
}
out = factory->buildGeometry(v);
return out;
}
#endif
return OverlayOp::overlayOp(this,other, OverlayOp::opUNION);
}
Geometry*Geometry::difference(constGeometry *other)const
//throw(IllegalArgumentException *)
{
return OverlayOp::overlayOp(this,other, OverlayOp::opDIFFERENCE);
}
Geometry*Geometry::symDifference(constGeometry *other)const
{
return OverlayOp::overlayOp(this,other, OverlayOp::opSYMDIFFERENCE);
}
CGAL(见参考资料4)是一个经典的计算几何开源库,重在计算精度,效率一般,模板设计比较好,代码风格一致,是一个计算几何库的经典之作。
代码
#include
template |
|||
void |
|
GRASS(见参考资料5)是一个开源的GIS平台项目,是用c语言实现的项目,C实现,具有图层间overlay的能力,代码很复杂,代码位置:grass-6.4.0RC6/lib/vector/Vlib/overlay.c
代码:
/*!
/brief Overlay 2 vector maps and create new one
/param AMap vector map A
/param AList unused ?
/param AAList unused ?
/param BMap vector map B
/param BList unused ?
/param BAList unused ?
/param operator operator code
/param OMap output vector map
/return 0 on success
*/
intVect_overlay(structMap_info *AMap,int atype, struct ilist *AList, struct ilist *AAList,/* map A */
struct Map_info *BMap, int btype, struct ilist *BList,struct ilist *BAList, /* map B */
int operator, struct Map_info *OMap)
{ /* output map */
switch (operator) {
case GV_O_AND:
Vect_overlay_and(AMap,atype, AList, AAList, BMap, btype, BList,
BAList,OMap);
break;
default:
G_fatal_error("Vect_overlay(): %s",_("unknown operator"));
}
return 0;
}
LEDA 是优秀的计算几何库(参考资料6),可惜现在已经不开源了,我这仅有3.3版本,这里不贴代码,只是强调这是一个高效的计算几何源码库。
Wykobi是一个简单的计算几何开源版本,对于计算小数据量计算几何算子演示非常出色,参见参考资料7.
众多与叠加分析算法相关计算几何的优秀源码参考资料8.
4. 参考资料
a) 拥有overlay开源项目http://www.scrumo.com/ricepig/?p=93
b) JTS http://www.vividsolutions.com/JTS/javadoc/overview-summary.html
c) GEOS http://download.osgeo.org/geos/doxygen/classgeos_1_1operation_1_1overlay_1_1OverlayOp.html
d) CGAL http://www.cgal.org/Manual/3.3/doc_html/cgal_manual/Arrangement_2_ref/Function_overlay.html
e) GRASS http://grass.itc.it/grass57/tutorial/vectoroverlay.html
f) LEDA http://www.algorithmic-solutions.com/index.htm
g) Wykobihttp://www.wykobi.com/
http://www.codeproject.com/KB/recipes/Wykobi.aspx
h) 计算几何源码http://compgeom.cs.uiuc.edu/~jeffe/compgeom/code.html
(转载注明来源:http://blog.csdn.net/wsh6759)