1200 จุด (หรือแม้กระทั่งถึงจุดพูด 12M?) ฉันต้องการเพียงแค่ใส่ไว้ในหน่วยความจำที่เป็นคอลเลกชันทั่วไป - ในกรณีนี้SortedListของรายการ สิ่งนี้สามารถลดความซับซ้อนได้โดยเพียงแค่ข้ามจุดเมื่อคุณพบกับสถานการณ์ที่มีหลายจุดที่อยู่ห่างจากจุดกำเนิดเดียวกัน นอกจากนี้สำหรับประสิทธิภาพการทำงานให้พิจารณาใช้hashtableแทน SortedList และการเรียงครั้งเดียวหลังจากแทรกระยะทางทั้งหมด ซึ่งอาจต้องใช้โค้ดอีกสองสามบรรทัด (?)
ฉันไม่มีเวลาที่จะทดสอบสิ่งนี้ แต่สิ่งนี้ c # อาจช่วยให้คุณเริ่มต้น:
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();
}