利用舍取法在多边基底内产生若干个随机点

本文介绍了一种基于舍取法在多边形内生成随机点的方法,并提供了完整的C#实现代码。通过此方法,可以在指定的地理多边形范围内高效地生成所需的随机样本点。

基本原理:舍取法

代码:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Carto; namespace 舍取法在多边形内随机产生若干点 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.axMapControl1.LoadMxFile(@"F:/连续型随机变量的舍取法抽样/舍取法.mxd"); } private void Sample(IPolygon pPolygon, int num, IFeatureClass pFeatureClass) { IRelationalOperator pOprator = pPolygon as IRelationalOperator; int i = 0; IEnvelope pEnv = pPolygon.Envelope;//pPolygon的最小包络多边形 Random r = new Random(); double xMin = pEnv.XMin; double xMax = pEnv.XMax; double yMin = pEnv.YMin; double yMax = pEnv.YMax; IFeatureBuffer pFeatureBuffer = pFeatureClass.CreateFeatureBuffer(); IFeatureCursor pFeatureCursor = pFeatureClass.Insert(true); object featureOID; while (i < num) { IPoint pPoint = new PointClass(); pPoint.PutCoords(xMin + r.NextDouble() * (xMax - xMin), yMin + r.NextDouble() * (yMax - yMin)); if (pOprator.Contains(pPoint))//若在pPolygon内,则为有效随机点 { i++; pFeatureBuffer.Shape = pPoint as IPoint; pFeatureBuffer.set_Value(2, 0); featureOID = pFeatureCursor.InsertFeature(pFeatureBuffer); } else { pFeatureBuffer.Shape = pPoint as IPoint; pFeatureBuffer.set_Value(2, 1); featureOID = pFeatureCursor.InsertFeature(pFeatureBuffer); } } pFeatureCursor.Flush(); System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);//释放Cursor this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); } private void button1_Click(object sender, EventArgs e) { IFeatureLayer pFeatureLayer1 = this.axMapControl1.get_Layer(1) as IFeatureLayer; IFeatureLayer pFeatureLayer0 = this.axMapControl1.get_Layer(0) as IFeatureLayer; IFeatureClass pFeatureClass1 = pFeatureLayer1.FeatureClass; IFeatureClass pFeatureClass0 = pFeatureLayer0.FeatureClass; IFeature pFeature = pFeatureClass1.GetFeature(0); IRelationalOperator pOprator = pFeature.Shape as IRelationalOperator; int num = int.Parse(this.textBox1.Text); this.Sample((IPolygon)pFeature.Shape, num, pFeatureClass0); } private void button2_Click(object sender, EventArgs e) { IFeatureLayer pFeatureLayer0 = this.axMapControl1.get_Layer(0) as IFeatureLayer; IFeatureClass pFeatureClass = pFeatureLayer0.FeatureClass; //while (pFeatureClass.FeatureCount(null) > 0) //{ // pFeatureClass.GetFeature(0).Delete(); //} //this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); IFeatureCursor pFC = pFeatureClass.Search(null, false); IFeature pFeature = pFC.NextFeature(); while (pFeature != null) { pFeature.Delete(); pFeature = pFC.NextFeature(); } this.axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, null, null); } } }

结果:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值