Бештар

Дархости фазоӣ байни хусусиятҳои полилинӣ ва хусусиятҳои нуқта дар дохили буферии муайяншуда

Дархости фазоӣ байни хусусиятҳои полилинӣ ва хусусиятҳои нуқта дар дохили буферии муайяншуда


Ман дар GIS нав ҳастам (аз ин рӯ ман дар ин бора гум шудаам) ва дар ҷустуҷӯи намунаи рамзи C# ҳастам, ки ба ман дар иҷрои 2 намуди дархостҳои фазоӣ кумак мекунад. Ман танҳо 2 қабат дорам. Қабати аввал қубурҳоест, ки шаклҳои полинилӣ мебошанд, бинобар ин ман метавонам сегменти сершумори қубурро интихоб кунам, то тамоми қубурро ташкил диҳам. Қабати дуввум иншоотест, ки шакли нуқта мебошанд.

Пурсиши 1: Дар Қабати қубур сегментҳои қубурро интихоб кунед (Polylines) ва иншоотҳоро (дар қабати иншоот) дар масофаи муайяни сегментҳои интихобшудаи қубур ҷойгир кунед.

Пурсиши 2: Дар қабати иншоот (Нуқта) як иншоотро интихоб кунед ва сегментҳои қубурро (полилайнҳо), ки дар масофаи муайяни Нуқтаи Фаъолият ҷойгиранд, пайдо кунед.

Ман метавонам ин дархостҳоро тавассути интерфейси ArcMap иҷро кунам. Ман Хусусиятҳои манбаъро дар ҷадвали атрибутҳо интихоб мекунам, пас Менюи Интихоб, Интихоб аз рӯи макон, қабати "дигар" -ро ҳамчун Қабати Ҳадаф интихоб кунед ва барои Усули Интихоби Фазоӣ "Хосиятҳои ҳадаф (ҳо) -и ҳадаф дар масофаи қабати Манбаъ ҷойгиранд хусусият ". Аммо ҳоло ман бояд инро дар коди C# барои ArcMap AddIn -и худ иҷро кунам.


Фарз кардем, ки шумо дорои дастаи синфи сифатии дархости худ ва хусусияти интихобшуда ҳастед, шумо метавонед порчаи рамзи зеринро истифода баред:

Ҷустуҷӯи дукаратаDistance = 10; // ин масофаи буферии шумо аст IFeatureClass fc =…; // Query1: ин синфи хусусиятҳои иншооти шумо IFeature feat =…; // Query1: ин хусусияти қубури интихобкардаи шумо ISpatialFilter spatialFilter = нав SpatialFilterClass (); агар (searchDistance == 0) spatialFilter.Geometry = feat.Shape; // метавонад IGeometry бошад {ITopologicalOperator topoOperator = (ITopologicalOperator) feat.ShapeCopy; spatialFilter.Geometry = topoOperator.Buffer (searchDistance); } spatialFilter.GeometryField = fc.ShapeFieldName; spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; IFeatureCursor featureCursor = fc.Search (spatialFilter, true); // тавассути хусусиятҳо дар курсор давр занед

Ин буд он чизе ки ман барои ҳалли мушкилот кардам. Шояд баъзеи онро шарҳ додан лозим бошад, аммо ман фикр мекунам ин хеле возеҳ аст. Ташаккур ба Брент. /истифодабарандагон/19213/brenth

Ин бисёр кӯмак кард! Интихоби хусусиятҳо аз рӯи макон дар асоси хусусияти интихобшуда бо истифодаи ArcObjects?

void public GetClosestFeatures (IEnumerable selectedFeatures) {кӯшиш кунед {var mxDocument = ArcMap.Application.Document ҳамчун IMxDocument; агар (mxDocument! = null) {var map = mxDocument.FocusMap; var searchDistance = 1000.0; if (UI.LayerSelection.Equals ("Pipeline")) {if (UI.txtRadiusToFacilities.Text! = "") {searchDistance = Convert.ToDouble (UI.txtRadiusToFacilities.Text); } дигар {UI.txtRadiusToFacilities.Text = searchDistance.ToString (CultureInfo.InvariantCulture); } // Ин на 100% дақиқ аз сабаби тағирёбии Lattitude ҳангоми ҳаракат ба шимол/ҷануб, бинобар ин, агар мо латтитро донем, ки мо метавонем // функсияи MetersToDecimalDegrees -ро истифода барем, аммо ин кор хоҳад кард! searchDistance = Convert.ToDouble ((UI.txtRadiusToFacilities.Text)) / (111.32 * 1000); } дигар {агар (UI.txtRadiusToPipelines.Text! = "") {searchDistance = Convert.ToDouble (UI.txtRadiusToPipelines.Text); } дигар {UI.txtRadiusToPipelines.Text = searchDistance.ToString (CultureInfo.InvariantCulture); } // Ин на 100% дақиқ аз сабаби тағирёбии Lattitude ҳангоми ҳаракат ба шимол/ҷануб, бинобар ин, агар мо латтитро донем, ки мо метавонем // функсияи MetersToDecimalDegrees -ро истифода барем, аммо ин кор хоҳад кард! searchDistance = Convert.ToDouble ((UI.txtRadiusToPipelines.Text)) / (111.32 * 1000); } var cursor = GetSelectedFeatures (CurrentLayer); // Буфери пешфарзӣ дараҷаи даҳум аст var polygon = UnionShapes (курсор, searchDistance); // Шояд номро ба ҷои CurrentLayer.Name истифода баред, зеро ин барои дарёфти иншоот барои қубурҳои интихобшуда var featureLayer = Utilities.GetOppositeFeatureLayerByFeatureClassName (харита, CurrentLayer.Name); var filter = CreateSpatialFilter (featureLayer.FeatureClass, бисёркунҷа); var cursor2 = GetSelectedItemsByShape (featureLayer.FeatureClass, филтр); // Такрор кардани хусусиятҳо, дидан (ба мисли ин ҳолат) ё таҳрир кардани онҳо. IFeatureClass fc = Utilities.GetOppositeFeatureLayerByFeatureClassName (харита, CurrentLayer.Name) .FeatureClass; IFeature хусусият = null; агар (UI.LayerSelection.Equals ("Қубур")) {var nameFacilityNameIndex = fc.Fields.FindField (GeodatabaseFieldNames.FacilityNameFieldName); var nameFacilityTypeIndex = fc.Fields.FindField (GeodatabaseFieldNames.FacilityTypeFieldFieldName); var counter = 0; UI.lvwFacilitiesSpatialResult.Items.Clear (); кӯшиш кунед, ки {while ((feature = cursor2.NextFeature ())! = null) {//Console.WriteLine("Facility Found: {0} ", feature.get_Value (nameFieldIndex)); ҳисобкунак ++; сатр [] rowData = {(counter) .ToString (CultureInfo.InvariantCulture), feature.get_Value (nameFacilityNameIndex) .ToString (), feature.get_Value (nameFacilityTypeIndex) .ToString ()}; var lvItem = ListViewItem нав (rowData); UI.lvwFacilitiesSpatialResult.Items.Add (lvItem); }} catch (Exception ex) {// Ҳама гуна хатогиҳоеро, ки метавонанд дар NextFeature () рух диҳанд, идора кунед. MessageBox.Show (мис. Хабар, @"Хато", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }} дигар // Восита {var namePipelinenameIndex = fc.Fields.FindField (GeodatabaseFieldNames.PipelineNameFieldName); var companyNameFieldIndex = fc.Fields.FindField (GeodatabaseFieldNames.OperatorNameFieldName); var counter = 0; UI.lvwPipelinesSpatialResult.Items.Clear (); кӯшиш кунед, ки {while ((feature = cursor2.NextFeature ())! = null) {//Console.WriteLine("Facility Found: {0} ", feature.get_Value (nameFieldIndex)); ҳисобкунак ++; сатр [] rowData = {(counter) .ToString (CultureInfo.InvariantCulture), feature.get_Value (namePipelinenameIndex) .ToString (), feature.get_Value (companyNameFieldIndex) .ToString ()}; var lvItem = ListViewItem нав (rowData); UI.lvwPipelinesSpatialResult.Items.Add (lvItem); }} catch (Exception ex) {// Ҳама гуна хатогиҳоеро, ки метавонанд дар NextFeature () рух диҳанд, идора кунед. MessageBox.Show (мис. Хабар, @"Хато", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }}}} сайд (Истиснои мисол) {MessageBox.Show (мис. Хабар, @"Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }}
static public IFeatureCursor GetSelectedFeatures (IFeatureLayer featureLayer) {if (featureLayer == null) баргардонидани null; IFeatureSelection fSel = (IFeatureSelection) featureLayer; ISelectionSet selSet = (ISelectionSet) fSel.SelectionSet; Курсори курсор = null; selSet.Search (курсори бекор, бардурӯғ, берун); IFeatureCursor fCursor = курсор ҳамчун IFeatureCursor; Бозгашти fCursor; }
public static IPolygon UnionShapes (курсори IFeatureCursor, bufferDist double) {if (cursor == null) return null; IFeature pFeat = cursor.NextFeature (); if (pFeat! = null) {if (pFeat.Shape is IPoint || pFeat.Shape is IPolyline) {ITopologicalOperator ptopBuffer = (ITopologicalOperator) pFeat.Shape; IPolygon pTempPoly = (IPolygon) ptopBuffer.Buffer (bufferDist); ITopologicalOperator ptopUnion = (ITopologicalOperator) pTempPoly; pFeat = cursor.NextFeature (); while (pFeat! = null) {ptopBuffer = (ITopologicalOperator) pFeat.Shape; pTempPoly = (IPolygon) ptopBuffer.Buffer (bufferDist); ptopUnion = (ITopologicalOperator) ptopUnion.Union (pTempPoly); pFeat = cursor.NextFeature (); } бозгашт (IPolygon) ptopUnion; } баргардонидани null; } баргардонидани null; }
public static ISpatialFilter CreateSpatialFilter (IFeatureClass fc, шакли IGeometry) {if (fc == null) баргардонидани null; ISpatialFilter sf = нав SpatialFilterClass (); sf.GeometryField = fc.ShapeFieldName; sf.Geometry = шакл; sf.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; бозгашт sf; }
static public IFeatureCursor GetSelectedItemsByShape (IFeatureClass fc, ISpatialFilter filter) {try {if (filter == null) return null; агар (fc == null) баргардонидани null; IFeatureCursor fcursor = fc.Search (филтр, ҳақиқӣ); нишондиҳандаи бозгашт; } сайд кардан {return null; }}
қабати омории ISelectionSet CursorToSelectionSet (қабати IFeatureLayer, IFeatureCursor курсор) {IFeatureSelection fSel = (IFeatureSelection) қабати; if (cursor! = null) {IFeature feat = cursor.NextFeature (); while (feat! = null) {fSel.Add (feat); feat = cursor.NextFeature (); }} баргардонидани fSel.SelectionSet; }

Азбаски ман танҳо 2 қабат дорам, ман ин корро карда метавонам.

статикии оммавии IFeatureLayer GetOppositeFeatureLayerByFeatureClassName (харитаи IMap, string featureClassName) {IFeatureLayer натиҷаи = null; барои (var i = 0; i