Untuk 1.200 poin (atau bahkan hingga 12 juta poin?) Saya baru saja memasukkannya ke dalam memori sebagai Koleksi Generik - dalam hal ini adalah SortedList dari daftar . Ini bisa disederhanakan dengan hanya melewatkan titik ketika Anda mengalami situasi dengan beberapa titik yang jaraknya sama dari titik asal. Selain itu, untuk kinerja, pertimbangkan untuk menggunakan hashtable alih-alih SortedList, dan menyortir sekali setelah memasukkan semua jarak. Itu akan membutuhkan beberapa baris kode lagi (?).
Saya tidak punya waktu untuk menguji ini, tetapi c # ini dapat membantu Anda memulai:
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();
}