1200 điểm (hoặc thậm chí lên đến nói điểm 12M?) Tôi chỉ muốn đặt chúng vào bộ nhớ như một Bộ sưu tập Generic - trong trường hợp này một SortedList của danh sách . Điều này có thể được đơn giản hóa bằng cách chỉ bỏ qua các điểm khi bạn gặp tình huống có nhiều điểm có cùng khoảng cách với điểm gốc. Ngoài ra, để thực hiện, hãy cân nhắc sử dụng hàm băm thay vì Sắp xếp danh sách và sắp xếp một lần sau khi chèn tất cả các khoảng cách. Điều đó sẽ mất thêm một vài dòng mã mặc dù (?).
Tôi không có thời gian để kiểm tra điều này, nhưng c # này có thể giúp bạn bắt đầu:
private void SelectNTile(string layer1, string layer2, double nTile)
{
var fLayer1 = FindLayer(ArcMap.Document.FocusMap, "LayerWithLotsofPoints");
var fLayer2 = FindLayer(ArcMap.Document.FocusMap, "LayerWithOneSelectedPoint");
IFeature feat = GetSingleFeature(fLayer2);
var distList = MakeDistList(fLayer1.FeatureClass,(IPoint)feat.ShapeCopy);
// assume not many points exactly same distance
var nRecs = (int)(distList.Count * nTile); // nTile would be 0.75 for 75%
var Oids = new List<int>();
foreach (KeyValuePair<double, List<int>> kvp in distList)
{
Oids.AddRange(kvp.Value);
if (Oids.Count > nRecs)
break;
}
var fSel = fLayer1 as IFeatureSelection;
var OidArray = Oids.ToArray();
fSel.SelectionSet.AddList(Oids.Count, ref OidArray[0]);
}
private SortedList<double, List<int>> MakeDistList(IFeatureClass fc, IPoint pnt)
{
var outList = new SortedList<double, List<int>>();
var proxOp = pnt as IProximityOperator;
IFeatureCursor fCur = null;
try
{
fCur = fc.Search(null, true); // recycling is faster, we just need OIDs
IFeature feat;
while ((feat = fCur.NextFeature()) != null)
{
double dist = proxOp.ReturnDistance(feat.Shape);
if (!outList.ContainsKey(dist))
outList.Add(dist, new List<int> { feat.OID });
else
outList[dist].Add(feat.OID); // this should rarely happen
}
}
catch
{
throw;
}
finally
{
if (fCur != null)
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(fCur);
}
return outList;
}
private IFeature GetSingleFeature(IFeatureLayer fLayer)
{
var fSel = fLayer as IFeatureSelection;
if (fSel.SelectionSet.Count != 1)
throw new Exception("select one feature in " + fLayer.Name + " first");
var enumIDs = fSel.SelectionSet.IDs;
enumIDs.Reset();
IFeature feat = fLayer.FeatureClass.GetFeature(enumIDs.Next());
return feat;
}
private IFeatureLayer FindLayer(IMap map, string name)
{
throw new NotImplementedException();
}