在基于ArcIMSWeb 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;
}