Mehr

Wie legt man Feature-Scheitelpunkt Z aus dem Z eines sich schneidenden Features fest?


Wie kann ich in ArcGIS die Z-Werte des Abschnitts einer Linie, der eine andere Linie schneidet, auf die Z-Werte der anderen Linie festlegen? Ein Batch-Verfahren wird bevorzugt.

Ich habe FeatureToLine ausprobiert, aber die Nullwerte von Zeile A (blau) bleiben null.

[aktualisieren] Die rote Linie ist Quelle und hat ein konstantes Z, obwohl es letztendlich keinen Grund gibt, dass es konstant sein muss. Die blaue Linie ist die Variable Z, das Ziel, dasjenige mit den Scheitelpunkten, die wir ändern möchten, während die rote Linie schreibgeschützt und durch die Operation unverändert sein sollte.

(Die Rauten sollen nur zeigen, wo die Scheitelpunkte sind.)


Sie können das Integrieren-Werkzeug verwenden, um einen Scheitelpunkt am Schnittpunkt der beiden Linien einzufügen. Stellen Sie nur sicher, dass Ihr Kontur-Dataset einen niedrigeren Rang hat und Ihre blauen Linien-Datasets Z-bewusst sind. Das Integrieren-Werkzeug berücksichtigt den Z-Wert nicht (ich habe dies an einigen Beispieldaten überprüft), sodass Sie dann die Z-Eigenschaft des eingefügten Scheitelpunkts aktualisieren müssen. Zu diesem Zeitpunkt ist mir kein vorhandenes Geoverarbeitungswerkzeug bekannt, das einen Höhenwert annehmen kann in einem Feld und verwenden Sie das, um die Z-Eigenschaft eines Scheitelpunkts zu aktualisieren ...

Ich vermute, dass Sie einige ArcObjects verwenden müssen, um diesen nächsten Schritt zu erreichen. Einige Codes werden hier besprochen.


Z-Scheitelpunkt-Übertragung aus der Attributtabelle in ArcGIS In diesem Video haben Sie gezeigt, dass der Z-Scheitelpunktwert in zwei Richtungen vom Attributwert übertragen wird


Bearbeiten von Features mit Z-Werten

Ein Z-Wert stellt normalerweise Höhen oder Höhen dar und kann verwendet werden, um Features in drei Dimensionen anzuzeigen. Jeder Stützpunkt eines Features kann einen Z-Wert zusammen mit seinen XY-Positionsinformationen speichern. ArcMap und seine Bearbeitungsumgebung sind zwar zweidimensional, bieten jedoch die Möglichkeit, Z-Werte einzugeben, zu bearbeiten und zu verwalten.

Die Zuweisung von Z-Werten beim Bearbeiten in ArcMap wird durch die allgemeine Funktion bestimmt, die das Bearbeitungswerkzeug oder der Befehl ausführt: ob ein neues Feature erstellt oder ein vorhandenes Feature bearbeitet wird. Die meisten Operationen, die zur Erstellung eines neuen Features führen, weisen allen Stützpunkten denselben Standard-Z-Wert zu. Wenn ein vorhandenes Feature geändert wird, werden neue Z-Werte interpoliert und den bearbeiteten Stützpunkten werden aktualisierte Werte zugewiesen. Bei einigen Bearbeitungsvorgängen werden jedoch lediglich vorhandene Z-Werte beibehalten.

Sie können die Z-Werte eines Features im Fenster Skizzeneigenschaften bearbeiten anzeigen oder ändern. Die Z-Werte sind in der Spalte Z aufgelistet. Um die Z-Werte für mehrere Scheitelpunkte zu ändern, aktivieren Sie die Kontrollkästchen links neben den Scheitelpunkten, die Sie aktualisieren möchten, klicken Sie dann auf die Schaltfläche Z und geben Sie die neuen Werte ein.

Um Z-Werte in einem Feature zu speichern, müssen Sie beim Erstellen angeben, dass die Feature-Class über Z-Werte verfügt. Dadurch wird die Feature-Class z-fähig. Um festzustellen, ob eine Feature-Class Z-fähig ist, öffnen Sie ihre Eigenschaften in ArcCatalog oder im Katalogfenster, klicken Sie auf die Registerkarte Allgemein und suchen Sie dann unter Geometrieeigenschaften nach einem Kontrollkästchen neben Koordinaten enthalten Z-Werte. Es gibt auch ein Z im Feld Shape in der Attributtabelle in ArcMap, wie in Polyline Z.

Das Häkchen neben Koordinaten enthalten Z-Werte gibt an, dass die Feature-Class Z-fähig ist und Z-Werte speichern kann.

Wenn Ihre vorhandene Feature-Class nicht Z-fähig ist, müssen Sie eine neue Feature-Class erstellen, die Z-Werte speichern kann, dann Features aus der vorhandenen Feature-Class laden oder kopieren und in die neue einfügen und die Z-Werte bearbeiten. Sie benötigen keine ArcGIS 3D Analyst-Erweiterungslizenz, um Z-fähige Feature-Classes zu erstellen oder Z-Werte in ArcMap zu bearbeiten. Wenn Sie jedoch über 3D Analyst verfügen, können Sie Features auch in ArcGlobe oder ArcScene bearbeiten.

In den folgenden Abschnitten wird das Verhalten beim Bearbeiten von Features in ArcMap beschrieben.


Syntax

Die 3D-Point-, Multipoint-, Polyline- oder Polygon-Feature-Class, die in eine ASCII-Datei exportiert wird.

Der Ordner, in den die Ausgabedateien geschrieben werden.

Der Name der resultierenden ASCII-Datei.

Wenn eine Line- oder Polygon-Feature-Class in das XYZ-Format exportiert wird, wird der Dateiname als Basisname verwendet. Jedes Feature hat eine eindeutige Dateiausgabe, da das XYZ-Format nur eine Linie oder ein Polygon pro Datei unterstützt. Bei Multipart-Features wird außerdem jedes Teil in eine separate Datei geschrieben. An den Dateinamen wird die OID jeder Funktion sowie alle zusätzlichen Zeichen angehängt, die erforderlich sind, um jeden Dateinamen eindeutig zu machen.

Das Format der zu erstellenden ASCII-Datei.

  • GENERATE —Schreibt die Ausgabe im GENERATE-Format. Dies ist die Standardeinstellung.
  • XYZ —Schreibt XYZ-Informationen von Eingabe-Features. Für jede Linie oder jedes Polygon im Eingabe-Feature wird eine Datei erstellt.
  • PROFILE —Schreibt Profilinformationen für Linien-Features, die in externen Grafikanwendungen verwendet werden können.

Das Trennzeichen, das verwendet wird, um die Trennung von Einträgen in den Spalten der Textdateitabelle anzuzeigen.

  • SPACE —Ein Leerzeichen wird verwendet, um Feldwerte abzugrenzen. Dies ist die Standardeinstellung.
  • COMMA —Ein Komma wird verwendet, um Feldwerte abzugrenzen. Diese Option ist nicht anwendbar, wenn das Dezimaltrennzeichen auch ein Komma ist.

Die Methode, die verwendet wird, um die Anzahl der signifikanten Stellen zu bestimmen, die in den Ausgabedateien gespeichert sind.

  • AUTOMATIC —Die Anzahl der signifikanten Stellen, die erforderlich ist, um die verfügbare Genauigkeit beizubehalten, während unnötige abschließende Nullen entfernt werden, wird automatisch bestimmt. Dies ist die Standardeinstellung.
  • FIXED —Die Anzahl der signifikanten Stellen wird im Parameter Digits after Decimal definiert.

Wird verwendet, wenn die Dezimalschreibweise auf FEST eingestellt ist. Dies bestimmt, wie viele Stellen nach dem Komma für Gleitkommawerte geschrieben werden, die in die Ausgabedateien geschrieben werden.

Das Dezimalzeichen, das verwendet wird, um die ganze Zahl einer Zahl von ihrem Bruchteil zu unterscheiden.

  • DECIMAL_POINT —Ein Punkt wird als Dezimalzeichen verwendet. Dies ist die Standardeinstellung.
  • DECIMAL_COMMA —Ein Komma wird als Dezimalzeichen verwendet.

2 Antworten 2

Ja, es ist mit OpenGL möglich. Ich mache eine ähnliche Technik zum Berechnen des Begrenzungsrahmens des Objekts auf der GPU. Hier sind die Schritte:

  1. Ordnen Sie einen Renderpuffer der Größe 1x1 vom Typ RGBA_32F in einem eigenen FBO an. Als Renderziel festlegen (keine Tiefe/Schablone, nur eine einzelne Farbebene). Es kann ein Pixel mit einer größeren Textur sein. In diesem Fall müssen Sie das Ansichtsfenster richtig einrichten.
  2. Klar mit Grundwert. Für 'min' wird es eine riesige Zahl sein, für 'max' ist es negativ riesig.
  3. Stellen Sie die Mischfunktion 'min' oder 'max' entsprechend mit Koeffizienten (1,1) ein.
  4. Zeichnen Sie Ihr Mesh mit einem Shader, der einen Punkt mit einer (0,0,0,1)-Koordinate erzeugt. Geben Sie die Farbe aus, die Ihre ursprüngliche Vertex-Weltposition enthält.

Von hier aus können Sie weiter optimieren. Sie können beispielsweise sowohl 'min' als auch 'max' in einem Zeichenaufruf erhalten, indem Sie den Geometrie-Shader verwenden und die Position für eines der Ausgabepixel negieren.


Dual Contouring - Finden des Merkmalspunktes, Normalen aus

Meine Datenquelle ist ein Raster 16x16x16 Ich durchquere dieses Raster von unten nach oben, von links nach rechts, von nah bis weit.

Für jeden Index meines Rasters erstelle ich eine Würfelstruktur:

Aufgrund der Art und Weise, wie ich das Gitter durchquere, muss ich nur 4 Scheitelpunkte und 3 Kanten betrachten. In diesem Bild entsprechen die Ecken 2, 5, 6, 7 meinen Ecken 0, 1, 2, 3 und die Kanten 5, 6, 10 entsprechen meinen Kanten 0, 1, 2.

Ich überprüfe dann alle Kanten auf einen Vorzeichenwechsel, wenn es einen gibt, finde ich die umgebenden Würfel und erhalte den Merkmalspunkt dieser Würfel.

Das funktioniert jetzt, wenn ich den Feature-Punkt auf die Würfelmitte setze, dann bekomme ich den blockigen Minecraft-Look. Aber das ist nicht das, was ich will.

Um den Feature Point zu finden, wollte ich es wie in diesem Beitrag machen: https://gamedev.stackexchange.com/a/83757/49583

Grundsätzlich beginnen Sie den Scheitelpunkt in der Mitte der Zelle. Dann mitteln Sie alle Vektoren, die vom Scheitelpunkt zu jeder Ebene genommen werden, und bewegen den Scheitelpunkt entlang dieser Resultierenden und wiederholen diesen Schritt eine feste Anzahl von Malen. Ich habe gefunden, es zu bewegen

70% entlang des Ergebnisses würden sich in der geringsten Anzahl von Iterationen stabilisieren.

und eine Funktion, um den Feature-Punkt zu erhalten, bei dem ich 3 Ebenen erstelle, eine für jede Kante und den Abstand zum Mittelpunkt durchschnittlich:

Aber es funktioniert nicht, die Scheitelpunkte sind überall. Wo liegt der Fehler? Kann ich die Kantennormale tatsächlich berechnen, indem ich die Normale der Kantenscheitelpunkte mittele? Ich kann die Dichte am Kantenmittelpunkt nicht abrufen, da ich nur ein ganzzahliges Gitter als Datenquelle habe.

Bearbeiten: Ich habe auch hier http://www.mathsisfun.com/algebra/systems-linear-equations-matrices.html gefunden, dass ich Matrizen verwenden kann, um den Schnittpunkt der 3 Ebenen zu berechnen, zumindest habe ich es so verstanden, also Ich habe diese Methode erstellt

berechnet einen Schnittpunkt bei (2.0, 2.0, 2.0), daher gehe ich davon aus, dass es richtig funktioniert. Trotzdem nicht die richtigen Eckpunkte. Ich denke wirklich, es ist meine Normalität.


Vertikale Konnektivität des Höhenfelds ändern

Führen Sie die folgenden Schritte aus, um die Höhenfelder des Netzwerks zu ändern:

Die Seite Vertikale Konnektivität wird angezeigt. Wenn Ihre Richtlinie für vertikale Konnektivität Richtlinie: Höhenfelder lautet, sehen Sie ein Raster mit zwei Zeilen für jede Kantenquelle, eine für die Längsrichtung und eine für die Gegenrichtung. Sie können dieses Raster verwenden, um das Höhenfeld für jede Richtung jeder Kantenquelle festzulegen.

Die einzigen Felder, die in der Dropdown-Liste verfügbar sind, sind diejenigen mit einem Integer-Datentyp, da Höhenstufen durch Integer angegeben werden. Jeder ganzzahlige Wert ist gültig, d. h. das von Ihnen ausgewählte Feld kann positive, negative und Nullwerte haben.

Wenn das von Ihnen verwendete Netzwerk-Dataset zum Zeitpunkt seiner Erstellung nicht für die Verwendung der vertikalen Konnektivitätsrichtlinie Höhenfelder konfiguriert war, können Sie Höhenfelder auf dieser Seite nicht bearbeiten. Sie können die Richtlinie für vertikale Konnektivität nicht ändern, nachdem Sie Ihr Netzwerk erstellt haben.

Das Höhenänderungsfeld wird im Netzwerk-Dataset gespeichert.

Wenn Sie Netzwerkattribute ändern, müssen Sie das Netzwerk-Dataset erstellen, um die Konnektivität wiederherzustellen, betroffene Attribute neu zu berechnen und die Netzwerkelemente zu aktualisieren.


Ausgehend von der Antwort von @unutbu und einem Schnittalgorithmus, der direkt aus numpy-and-line-intersections gezupft wurde, habe ich mir das ausgedacht. Es ist langsam aufgrund der Art der Brute-Force-Methode, die Schnittpunkte und die Schleifen innerhalb von Schleifen innerhalb von Schleifen zu finden. Es könnte eine Möglichkeit geben, die Schleifen schneller zu machen, aber ich bin mir beim Schnittalgorithmus nicht sicher.

Bearbeiten: find_intersections oben behandelt weder vertikale und horizontale Linien noch überlappende Liniensegmente. Die Funktion linelineintersect unten behandelt diese Fälle, aber der gesamte Prozess ist immer noch langsam. Ich habe eine Zählung hinzugefügt, damit Sie eine Vorstellung davon haben, wie lange es noch dauern wird. Ich habe auch Kontur1 = plt.contour(Z1,colors='k') in Kontur1 = plt.contour(X,Y,Z1,colors='k') geändert, sodass die Achsen und Ihre Schnittpunkte in den tatsächlichen X und Y . liegen Koordinaten Ihres Gitters statt einer Zählung Ihrer Gitterpunkte.

Ich denke, das Problem ist, dass Sie nur eine Menge Daten haben. In einem Kontursatz befinden sich 24 Linien mit insgesamt 12818 Liniensegmenten, der andere Kontursatz hat 29 Linien mit 11411 Liniensegmenten. Das sind viele Liniensegmentkombinationen, die überprüft werden müssen (696 Aufrufe von linelineintersect ). Sie können schneller ein Ergebnis erhalten, indem Sie ein gröberes Raster verwenden, um Ihre Funktionen zu berechnen (100 x 100 war viel schneller als Ihre ursprünglichen 500 x 500). Sie können möglicherweise eine Art Zeilen-Sweep-Algorithmus ausführen, aber ich weiß nicht, wie man solche Dinge implementiert. Das Linienschnittproblem hat viele Anwendungen in Computerspielen und ist als Kollisionserkennung bekannt - es muss eine Grafikbibliothek geben, die alle Schnittpunkte schnell bestimmen kann.

Dieses Diagramm ist für ein 50x50-Raster mit den tatsächlichen X- und Y-Achsen:


3 Antworten 3

Verwenden Sie shapely, um den Schnittpunkt zu finden, und verwenden Sie dann den Punkt als Init-Schätzwert für fsolve(), um die echte Lösung zu finden:

Betrachten Sie Ihre Höhenlinien als Polylinien und setzen Sie die Scheitelpunktkoordinaten in die implizite Liniengleichung ein (F(P) = a.X + b.Y + c = 0). Jeder Vorzeichenwechsel ist ein Schnittpunkt, der durch das Lösen von 2x2 linearen Gleichungen berechnet wird. Sie benötigen keinen ausgeklügelten Solver.

Wenn Sie die Höhenlinien gleichzeitig erfassen müssen, ist es nicht viel komplizierter: Betrachten Sie den Abschnitt des Geländes durch eine vertikale Ebene durch die Linie. Höhen erhalten Sie durch lineare Interpolation entlang der Kanten der gekreuzten Gitterkacheln. Das Finden der Schnittpunkte mit dem Gitter hängt eng mit dem Bresenham-Linienzeichnungsalgorithmus zusammen.


Schneiden einer dreieckigen Pyramide an genauen z-Koordinaten

Ich versuche, eine dreieckige Pyramide genau in zwei Teile zu schneiden, ein unteres Basisteil und die obere Spitze, wie die blauen Linien im Bild zeigen.

Scheitelpunkte A B C müssen die gleiche exakte Z-Koordinate haben. Wenn die Spitze also weggeschnitten wird, hinterlässt sie eine vollkommen ebene (nicht eckige) Oberfläche.

Ich habe versucht, Scheitelpunkte zu unterteilen und zu verschieben (Shift V) und versucht, an einem Scheitelpunkt in einem anderen Netz (mit der erforderlichen Z-Koordinate) zu fangen, aber es scheint, dass es für Schiebeoperationen kein Scheitelpunktfang gibt.

Ich habe auch versucht, den oberen Scheitelpunkt auf 0,0001 abzuschrägen, was die Verwendung von Kantenschleife und -rutsche ermöglicht, aber dann tritt das gleiche Problem auf, dh kein Scheitelpunktschnappen.

Ich könnte einfach den Scheitelpunkt an jeder Kante hinzufügen und dann manuell an seinen Platz schieben, bis ich die genaue Z-Koordinate sehe, aber ich muss dies viele Male tun und es ist relativ langsam und fehleranfällig.

Gibt es eine eingebaute Methode (oder ein Add-On), mit der wir ein Objekt einfach präzise in zwei Teile schneiden können?


Ein zuverlässiger dreieckiger Netzschnittalgorithmus und seine Anwendung in der geologischen Modellierung

Wir stellen einen zuverlässigen Schnittalgorithmus für Mannigfaltigkeitsflächennetze vor. Der vorgeschlagene Algorithmus erstellt konforme Oberflächennetze aus einem Satz sich schneidender triangulierter Oberflächen. Dieser Algorithmus behandelt effektiv alle Fälle von entarteten Dreieck-Dreieck-Schnittpunkten. Die Kernidee des Algorithmus basiert auf einem umfangreichen Satz von Dreieck-Kanten-Schnittfällen, kombiniert mit einem Schnittkurvenverfolgungsverfahren. Die Schnittoperationen beruhen nicht auf globalen räumlichen Suchoperationen und es sind keine Neuvernetzungsschritte erforderlich. Die Schnittkurven werden unter Verwendung eines einzigartigen Kurveneindruckalgorithmus in jedes Oberflächennetz eingefügt. Der Imprinting-Algorithmus handhabt natürlich degenerierte Schnittfälle vieler Oberflächen an einer Kante oder an einem Punkt. Der Algorithmus erzeugt eine konsistente Netzdatenstruktur für nachfolgende Netzoptimierungsoperationen. Der Gitterschnittalgorithmus wird in einem allgemeinen Rahmen zur Modellierung und Vernetzung von geologischen Formationen verwendet, die für eine zuverlässige mathematische Modellierung von Öllagerstätten unerlässlich sind.

Dies ist eine Vorschau der Abonnementinhalte, auf die Sie über Ihre Institution zugreifen können.