Bir çizgiyi eşit uzaklıktaki noktalara bölme


11

Bunun için XTools'a güveniyordum, ancak mevcut ortamımda buna erişimim yok.

Bunu ArcMap10'da yapmaya çalışıyorum.

Amaç, bir gradyanın belirlenebilmesi için bu noktalardaki z değerlerini en sonunda belirlemek amacıyla bir akımın bir çizgi temsilini eşit aralıklı noktalara bölmektir.


Hedeflediğim iş akışı böyle.

  1. akışı noktalara böl
  2. GME kullanarak DEM ile noktaları kesişir
  3. Noktalar arasındaki mesafeyi belirleyerek degradenin olduğunu belirleyebilmeliyim.
  4. Nokta verilerini orijinal akış çizgilerine geri entegre etmek mantıklı görünmektedir. Bu adımdan emin değilim.

Yöntemin herhangi bir eleştirisini takdir ediyorum, ancak bu noktada önceliğim bu akışları noktalara dönüştürmek.

Teşekkür ederim!


1
Mesafenin planimetrik x / y mesafesine göre (m) ölçüsüne göre mi yoksa basit mi olmasını istiyorsunuz?
Kirk Kuykendall

Bir önlemle ilgili Kirk.
Jacques Tardie

Yanıtlar:


6

Henüz ArcGIS 10 kullanmıyorum, ancak 9.3.1'de satır katmanınızda bir düzenleme oturumu başlatabilir, bölmek istediğiniz özelliği vurgulayabilir ve ardından Düzenleyici Araç Çubuğu açılır menüsünden Böl seçeneğini belirleyebilirsiniz. Burada, seçilen özelliğin bölüneceği mesafeyi belirleyebilirsiniz. Daha sonra her bölünmüş çizgi parçası için bir nokta katmanı almak üzere ET GeoWizard'daki (ücretsiz araç) Düğümleri Dışa Aktar aracını kullanabilirsiniz .

Nokta veri bilgilerini tekrar satır katmanına yerleştirmek için uzamsal birleştirme kullanabilirsiniz. ArcMap TOC'de satır katmanınızı sağ tıklayın ve Katıl ve İlişkiler> Katıl'ı seçin. İlk açılır menüde "Uzamsal konuma göre başka bir katmandaki verilere katıl" seçeneğini belirleyin.


Teşekkürler sanat eseri, bunu daha sonra bugün deneyeceğim. Bana çok mantıklı geliyor! Teşekkür ederim :)
Jacques Tardie

4

Kullanıcı arayüzünde bunu yapan bir aracın farkında değilim, ancak IMSegmentation3 arabirimi aracılığıyla programlı olarak yapılabilir .

protected override void OnClick()
{
    try
    {
        var fSel = ArcMap.Document.FocusMap.get_Layer(1) as IFeatureSelection;
        if (fSel.SelectionSet.Count == 0)
        {
            MessageBox.Show("choose a line feature first");
            return;
        }
        var gc = ArcMap.Document.FocusMap as IGraphicsContainer;
        IFeature feat = ((IFeatureLayer)fSel).FeatureClass.GetFeature(fSel.SelectionSet.IDs.Next());
        var pnts = GetPoints((IPolyline)feat.ShapeCopy, 2.0);
        foreach (IPoint pnt in pnts)
        {
            var elem = new MarkerElementClass() as IElement;
            elem.Geometry = pnt;
            ((IMarkerElement)elem).Symbol = new SimpleMarkerSymbolClass();
            gc.AddElement(elem, 0);
        }
        ((IActiveView)ArcMap.Document.FocusMap).PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

/// <summary>
/// Get points at evenly spaced measures along a polyline
/// </summary>
/// <param name="polyline"></param>
/// <param name="count"></param>
/// <returns></returns>
private List<IPoint> GetPoints(IPolyline polyline, double mspacing)
{
    var outList = new List<IPoint>();

    var mseg = polyline as IMSegmentation3;
    if (mseg.MMonotonic == esriMMonotonicEnum.esriMNotMonotonic)
        throw new Exception("polyline not monotonic");
    for (double m = mseg.MMin; m <= mseg.MMax; m += mspacing)
    {
        var geomcoll = mseg.GetPointsAtM(m, 0.0);
        if (geomcoll != null && geomcoll.GeometryCount > 0)
        {
            var pnt = geomcoll.get_Geometry(0) as IPoint;
            outList.Add(pnt);
        }
    }
    return outList;
}

0

Akışın bir ucunda bir arabellek oluşturabilir ve ardından ara belleğinizin akışla kesiştiği noktayı tanımlayabilirsiniz. Sonra bu adımı tekrarlamaya devam edebilirsiniz. Akışın tam mesafesini vermeyecektir (akış uzunluğu yerine düz çizgi olduğu için), ancak daha sonra çizgiyi bu noktalara göre bölümlere ayırabiliyorsanız ve bu çizgilerin uzunluğunu kullanarak degradeyi tahmin edin.

Eğer layık bir yaklaşım olsaydı bu python içinde yazılabilirdi!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.