Ich würde erwarten, dass ISpatialFilter.SpatialRelDescription sich konsistent mit IRelationalOperator.Relation verhält . Wenn ich jedoch den folgenden Code ausführe, erhalte ich:
Total features : 44368
Count1: 9 T********
Count2: 9 T********
Count1: 21 F********
Count2: 44359 F********
Count1: 1 ******F**
Count2: 1 ******F**
Ist das ein Fehler in der F********
Beziehung?
private void TestSpatialFilter()
{
IMxDocument mxdoc = ((IApplication)m_application).Document as IMxDocument;
IFeatureLayer fLayer = mxdoc.FocusMap.get_Layer(0) as IFeatureLayer;
IEnvelope env = ((IActiveView)mxdoc.FocusMap).Extent;
env.Expand(0.5, 0.5, true);
env.Project(((IGeoDataset)fLayer.FeatureClass).SpatialReference);
Debug.Print("Total features : {0}", fLayer.FeatureClass.FeatureCount(null));
IFeatureClass fc = fLayer.FeatureClass;
string[] rels = { "T********", "F********", "******F**" };
foreach (string rel in rels)
{
Debug.Print("Count1: {0} {1}", Count1(fc, env, rel), rel);
Debug.Print("Count2: {0} {1}", Count2(fc, env, rel), rel);
}
}
public static int Count1(IFeatureClass fc, IGeometry geom, string relDescription)
{
ISpatialFilter sf = new SpatialFilterClass();
sf.SpatialRel = esriSpatialRelEnum.esriSpatialRelRelation;
sf.SpatialRelDescription = relDescription;
sf.Geometry = geom;
int i = fc.FeatureCount(sf);
Marshal.FinalReleaseComObject(sf);
return i;
}
public static int Count2(IFeatureClass fc, IGeometry geom, string relDescription)
{
int i = 0;
string relation = String.Format("RELATE(G1,G2,'{0}')", relDescription);
IRelationalOperator relOp = geom as IRelationalOperator;
IFeatureCursor fCur = fc.Search(null, false);
IFeature feat;
while ((feat = fCur.NextFeature()) != null)
{
if(relOp.Relation(feat.Shape,relation))
i++;
}
Marshal.FinalReleaseComObject(fCur);
return i;
}
arcobjects
arcgis-10.0
Kirk Kuykendall
quelle
quelle
Antworten:
Das scheint ein bisschen seltsam. Vielleicht wurde es nur mit wenigen spezifischen Operationen getestet, z. B .: Überschneidet sich, Disjunkt, usw.? Was macht
FF*FF****
(umgekehrtT********
) für Sie? Ich scheine mich zu erinnern, dass Within vor einigen Versionen nicht funktioniert hat, daher wundert es mich nicht.quelle