Daha çox

Müəyyən edilmiş Tampon daxilində polyline xüsusiyyətləri və nöqtə xüsusiyyətləri arasında məkan sorğusu

Müəyyən edilmiş Tampon daxilində polyline xüsusiyyətləri və nöqtə xüsusiyyətləri arasında məkan sorğusu


GIS -də yeniyəm (buna görə də bu mövzuda itirilmişəm) və 2 növ məkan sorğusu etməyimə kömək etmək üçün C# kod nümunəsi axtarıram. Yalnız 2 qatım var. Birinci qat çox xətti formalı olan boru kəmərləridir, buna görə də bütün boru kəmərini yaratmaq üçün bir neçə boru seqmentini seçə bilərəm. İkinci qat, nöqtə şəkli olan qurğulardır.

Sorğu 1: Boru Hattı Qatında (Polylines) Boru Kəməri Segmentlərini seçin və seçilmiş Boru Kəməri Segmentlərindən müəyyən bir məsafədə olan imkanları (Tesis Layerində) tapın.

Sorğu 2: Mexanizm Layerində (Nöqtədə) tək bir Təsis seçin və Tesis Noktasından müəyyən bir məsafədə olan Boru Kəməri Segmentlərini (Polylines) tapın.

Bu sorğuları ArcMap interfeysi vasitəsilə edə bilərəm. Xüsusiyyətlər Cədvəlindəki Mənbə Xüsusiyyətlərini seçirəm, sonra Seçim Menyu, Yerlə Seçim, Hədəf Layer olaraq "digər" Qatlamanı seçin və Məkan Seçim Metodu üçün "Hədəf təbəqə (lər) inin xüsusiyyətləri Mənbə qatının aralığındadır xüsusiyyət". Ancaq indi bunu ArcMap AddIn üçün C# kodunda etməliyəm.


Sorgu xüsusiyyətlərinizin və seçilmiş xüsusiyyətinizin bir qoluna sahib olduğunuzu güman edərək, aşağıdakı kod parçasını istifadə edə bilərsiniz:

ikiqat axtarışDistance = 10; // bu sizin tampon məsafənizdir IFeatureClass fc =…; // Sorgu1: bu, tesis xüsusiyyətlər sinifinizdir IFeature feat =…; // Sorgu1: bu seçdiyiniz boru kəməri xüsusiyyətidir ISpatialFilter spatialFilter = yeni SpatialFilterClass (); if (searchDistance == 0) spatialFilter.Geometry = feat.Shape; // başqa IGeometry ola bilər {ITopologicalOperator topoOperator = (ITopologicalOperator) feat.ShapeCopy; spatialFilter.Geometry = topoOperator.Buffer (searchDistance); } spatialFilter.GeometryField = fc.ShapeFieldName; spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; IFeatureCursor featureCursor = fc.Search (spatialFilter, true); // imlecin xüsusiyyətlərindən keçin

Problemi həll etmək üçün etdiyim budur. Bəzilərini izah etmək lazım ola bilər, amma düşünürəm ki, çox aydındır. Brentə təşəkkürlər. /istifadəçilər/19213/brenth

Bu çox kömək etdi! ArcObjects istifadə edərək seçilmiş xüsusiyyətə əsaslanaraq yerlərə görə xüsusiyyətlərin seçilməsi?

public void GetClosestFeatures (IEnumerable selectedFeatures) {cəhd edin {var mxDocument = ArcMap.Application.Document kimi IMxDocument; if (mxDocument! = null) {var map = mxDocument.FocusMap; var searchDistance = 1000.0; if (UI.LayerSelection.Equals ("Boru Kəməri")) {if (UI.txtRadiusToFacilities.Text! = "") {searchDistance = Convert.ToDouble (UI.txtRadiusToFacilities.Text); } başqa {UI.txtRadiusToFacilities.Text = searchDistance.ToString (CultureInfo.InvariantCulture); } // Bu, şimala/cənuba doğru hərəkət edərkən Lattitude dəyişdiyinə görə 100% dəqiq deyil, buna görə də istifadə edə biləcəyimiz lattiti bilsək // MetersToDecimalDegrees funksiyasını yerinə yetirərik, amma bu belə olacaq! searchDistance = Convert.ToDouble ((UI.txtRadiusToFacilities.Text)) / (111.32 * 1000); } başqa {if (UI.txtRadiusToPipelines.Text! = "") {searchDistance = Convert.ToDouble (UI.txtRadiusToPipelines.Text); } başqa {UI.txtRadiusToPipelines.Text = searchDistance.ToString (CultureInfo.InvariantCulture); } // Bu, şimala/cənuba doğru hərəkət edərkən Lattitude dəyişdiyinə görə 100% dəqiq deyil, buna görə də istifadə edə biləcəyimiz lattiti bilsək // MetersToDecimalDegrees funksiyasını yerinə yetirərik, amma bu belə olacaq! searchDistance = Convert.ToDouble ((UI.txtRadiusToPipelines.Text)) / (111.32 * 1000); } var cursor = GetSelectedFeatures (CurrentLayer); // Varsayılan tampon Ondalık Dərəcələrdir var polygon = UnionShapes (cursor, searchDistance); // Bəlkə də CurrentLayer.Name yerinə bu adı seçilmiş boru kəmərləri üçün imkanları tapmaq üçün istifadə edin var featureLayer = Utilities.GetOppositeFeatureLayerByFeatureClassName (xəritə, CurrentLayer.Name); var filter = CreateSpatialFilter (featureLayer.FeatureClass, çoxbucaqlı); var cursor2 = GetSelectedItemsByShape (featureLayer.FeatureClass, filter); // Xüsusiyyətləri təkrarlayın, onları görüntüləyin (bu vəziyyətdə olduğu kimi) və ya redaktə edin. IFeatureClass fc = Utilities.GetOppositeFeatureLayerByFeatureClassName (xəritə, CurrentLayer.Name) .FeatureClass; IFeature xüsusiyyəti = null; if (UI.LayerSelection.Equals ("Boru Kəməri")) {var nameFacilityNameIndex = fc.Fields.FindField (GeodatabaseFieldNames.FacilityNameFieldName); var nameFacilityTypeIndex = fc.Fields.FindField (GeodatabaseFieldNames.FacilityTypeFieldFieldName); var sayğacı = 0; UI.lvwFacilitiesSpatialResult.Items.Clear (); cəhd edin {while ((xüsusiyyət = cursor2.NextFeature ())! = null) {//Console.WriteLine("Facility Tapıldı: {0} ", feature.get_Value (nameFieldIndex)); sayğac ++; string [] rowData = {(counter) .ToString (CultureInfo.InvariantCulture), feature.get_Value (nameFacilityNameIndex) .ToString (), feature.get_Value (nameFacilityTypeIndex) .ToString ()}; var lvItem = yeni ListViewItem (rowData); UI.lvwFacilitiesSpatialResult.Items.Add (lvItem); }} catch (Exception ex) {// NextFeature () da baş verə biləcək hər hansı bir xətanı idarə edin. MessageBox.Show (məs. Mesaj, @"Hata", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }} başqa // Mexanizm {var namePipelinenameIndex = fc.Fields.FindField (GeodatabaseFieldNames.PipelineNameFieldName); var companyNameFieldIndex = fc.Fields.FindField (GeodatabaseFieldNames.OperatorNameFieldName); var sayğacı = 0; UI.lvwPipelinesSpatialResult.Items.Clear (); cəhd edin {while ((xüsusiyyət = cursor2.NextFeature ())! = null) {//Console.WriteLine("Facility Tapıldı: {0} ", feature.get_Value (nameFieldIndex)); sayğac ++; string [] rowData = {(counter) .ToString (CultureInfo.InvariantCulture), feature.get_Value (namePipelinenameIndex) .ToString (), feature.get_Value (companyNameFieldIndex) .ToString ()}; var lvItem = yeni ListViewItem (rowData); UI.lvwPipelinesSpatialResult.Items.Add (lvItem); }} catch (Exception ex) {// NextFeature () da baş verə biləcək hər hansı bir xətanı idarə edin. MessageBox.Show (məs. Mesaj, @"Hata", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }}}} tutmaq (İstisna istisna olmaqla) {MessageBox.Show (məs. Mesaj, @"Hata", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }}
ümumi statik IFeatureCursor GetSelectedFeatures (IFeatureLayer featureLayer) {if (featureLayer == null) null qaytar; IFeatureSelection fSel = (IFeatureSelection) xüsusiyyətLayer; ISelectionSet selSet = (ISelectionSet) fSel.SelectionSet; ICursor kursoru = null; selSet.Search (sıfır, yalan, çıxan kursor); IFeatureCursor fCursor = IFeatureCursor olaraq kursor; qayıt fCursor; }
ümumi statik IPolygon UnionShapes (IFeatureCursor cursor, double bufferDist) {if (cursor == null) return null; IFeature pFeat = cursor.NextFeature (); if (pFeat! = null) {if (pFeat.Shape IPoint || pFeat.Shape 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 (); } qayıt (IPolygon) ptopUnion; } qaytar null; } null qaytar; }
ictimai statik ISpatialFilter CreateSpatialFilter (IFeatureClass fc, IGeometry şekli) {if (fc == null) null qaytar; ISpatialFilter sf = yeni SpatialFilterClass (); sf.GeometryField = fc.ShapeFieldName; sf.Geometriya = forma; sf.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; qayıt sf; }
ümumi statik IFeatureCursor GetSelectedItemsByShape (IFeatureClass fc, ISpatialFilter filter) {try {if (filter == null) return null; if (fc == null) qaytar null; IFeatureCursor fcursor = fc.Axtar (filtr, doğru); qayıt fcursor; } tut {qaytar null; }}
ümumi statik ISelectionSet CursorToSelectionSet (IFeatureLayer qat, IFeatureCursor kursoru) {IFeatureSelection fSel = (IFeatureSelection) qat; if (cursor! = null) {IFeature feat = cursor.NextFeature (); while (feat! = null) {fSel.Add (feat); feat = cursor.NextFeature (); }} fSel.SelectionSet qaytar; }

Cəmi 2 qatım olduğu üçün bunu edə bilərəm.

ümumi statik IFeatureLayer GetOppositeFeatureLayerByFeatureClassName (IMap xəritəsi, simli xüsusiyyətClassName) {IFeatureLayer nəticə = null; üçün (var i = 0; i

Videoya baxın: Tampon parlatma