Posted on 2006-06-08 09:59
Kevin Meng 阅读(184)
评论(0) 编辑 收藏
内容摘要 |
在基于ArcIMS的Web GIS的应用开发中,无论是通过HTML Viewer,还是ActiveX Connector 或者 Java Connector,我们经常需要提供圆形选择的工具,在地图上任意选择圆心和半径,进而查找位于该圆形区域内的某个图层内的要素。在这种情况下,由于这个圆的圆心并不是来自某个点状图层的要素,而这个圆也不是由图层中的点要素通过缓冲区生成,所以ArcIMS所提供的Buffer缓冲区功能无法直接调用,在这种情况下,我们可以采取其他的变通方式。 |
过程描述 |
在本文中,我们通过圆的内接多边形法来实现。原理就是根据提供的圆心位置和半径,生成一个接近圆形的内接48边形,然后利用这个多边形对象再结合Filter进行空间查询。当然,内接多边形的边数越多就越接近圆,查询结果就越精确。示例代码如下:
//Java public Polygon createCirlePolygon(Point pnt,double dRadius){ double sineTheta, cosineTheta, twoPi; int numPoints = 48; //内接多边形的边数 Polygon poly=new Polygon(); Points pnts=new Points(); twoPi = 3.1415 * 2.0; //构造多边形 for(int i=0;i<numPoints;i++){ Point cpt = new Point(); sineTheta = Math.sin(twoPi * (i*1.0/ numPoints)); cosineTheta = Math.cos(twoPi * (i*1.0 / numPoints)); cpt.setX(pnt.getX() + dRadius * cosineTheta); cpt.setY(pnt.getY() + dRadius * sineTheta); pnts.addPointObject(cpt); } pnts.addPointObject(pnts.getPointObject(0)); Ring ring=new Ring(); ring.setPoints(pnts); poly.addRing(ring); return poly; }
//ASP.NET public IMSPolygon createCirlePolygon(IMSPoint pnt,double dRadius) { IMSPolygon poly=new IMSPolygon(); double sineTheta, cosineTheta, twoPi; int numPoints = 48; //内接多边形的边数
IMSPoints pnts=new IMSPoints(); twoPi = 3.1415 * 2.0;
//构造多边形 for(int i=0;i<numPoints;i++) { IMSPoint cpt = new IMSPoint(); sineTheta = Math.Sin(twoPi * (i*1.0/ numPoints)); cosineTheta = Math.Cos(twoPi * (i*1.0 / numPoints)); cpt.X=(pnt.X + dRadius * cosineTheta); cpt.Y=(pnt.Y + dRadius * sineTheta); pnts.Add(cpt); } pnts.Add(pnts[0]); IMSParts parts=new IMSParts(); parts.Add(pnts); poly.Parts=parts; return poly; } |