內容摘要 | |||||
在基于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; } |