Tabellen nach Standort verknüpfen<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hallo zusammen
Kann JMP Tabellen nach Standort hinzufügen (aktualisieren)?
Ich habe einen Datensatz mit Koordinaten und ein Shapefile aus Polygonen. Ich möchte die Punktetabelle mit Informationen aus dem Shapefile basierend auf dem Standort aktualisieren. Wenn sich also ein Punkt in einem bestimmten Polygon befindet, wird die Tabelle mit den Attributen des Polygons aktualisiert.
Vielen Dank!
Ron
Re: Join-Tabellen nach StandortUm das Skript weiter zu beschleunigen, können Sie zunächst prüfen, ob der Punkt im Quadrat "Amerika" ist. An Ians Skript anhängen
inAmericaRect =
Funktion ({pMat, x, y}, {Default Local},
maxX = Maximum (pMat [0, 3]);
minX = Minimum (pMat [0, 3]);
maxY = Maximum (pMat [0, 4]);
minY = Minimum (pMat [0, 4]);
if ((x <= maxX) & (x> = minX) & (y <= maxY) & (y> = minY), 1, 0);
);
...
// Ist der Punkt innerhalb des Square of America?
if (inAmericaRect (pMat, x, y)
In Puerto Rico könnte das Skript natürlich durch Hinzufügen einer zusätzlichen if-Anweisung verlangsamt werden. Ich habe immer noch das Gefühl, dass genug Daten vorhanden sind, um dies zu garantieren. Um dies zu korrigieren, können Sie Puerto Rico oder andere Inseln einfach aufteilen und eine zusätzliche Funktion in Puerto RicoRect hinzufügen. Sie können zusätzliche Filter für andere Länder mithilfe von world-name.jmp und world-xy.jmp durchführen. Oder Sie können mit coastline-Name.jmp und coastline-xy.jmp zuerst feststellen, ob es sich an Land befindet. Ich bin mir jedoch sicher, dass Ihr Skript zu diesem Zeitpunkt den Rahmen des Projekts verlässt.
Re: Join-Tabellen nach StandortDanke dir Ian @ JMP .
das ist viel besser als mein Ansatz und viel schneller.
Bei der Erstellung der Loops in meinem Skript ist mir aufgefallen, dass der XY-Tisch nicht perfekt sauber ist und auch Ihr Ansatz robust ist (Form ID 10 hat Teil-ID 1,3,4,5 - Überspringen 2).
ron
Re: Join-Tabellen nach StandortAchteinhalb Stunden später wurde die gesamte Hurrikan-Akte aufgenommen. Da sich die meisten Punkte im Meer befinden, brauchte das Skript einige Zeit, um sich zu vergewissern, dass sich keiner von ihnen in einem der 52 Staaten befand (84 Polygone).

Re: Join-Tabellen nach StandortZufälligerweise habe ich gerade Zeit gefunden, einen kurzen Blick darauf zu werfen. Ich erhebe keinen Anspruch auf verbesserte Effizienz, sondern biete sie nur zu Vergleichszwecken an. Ich habe weder geprüft noch getestet. Für das von Ihnen verwendete Subset wird es fast sofort ausgeführt. Hinweis das OS / X-Pfade.
NamesDefaultToHere ( 1 ) ;
Protokoll löschen () ;
// Open dots file - dies beinhaltet die Beobachtung, die wir aktualisieren möchten
Punkte = Öffnen ( "$ SAMPLE_DATA / Hurricanes.jmp" ) ;
Punkte << Zeilen löschen ( Punkte << reihen wo ( : Name ( "Name und ID" ) ! = "NOTNAMED_675" ) ) ;
// Polygonquelle öffnen
Polygone = Öffnen ( "/ Bibliothek / Anwendungssupport / JMP / 12 / Maps / US-State-XY.jmp" ) ;
// Open data source - diese enthält die zu aktualisierenden Informationen
Namen = Öffnen ( "/ Library / Anwendungssupport / JMP / 12 / Maps / US-State-Name.jmp" ) ;
// Wenn eine "Polygonmatrix", pMat und darin eine ShapeID und PartID angegeben ist, wird bestimmt, ob der Punkt (x, y) in dem durch diese Form und diesen Teil definierten Polygon liegt
inShapePart =
Funktion ({ pMat . ShapeID . partID . x . y } . { Default Local } .
r = Loc ( pMat [ 0 . 1 ] == ShapeID & pMat [ 0 . 2 ] == partID ) ;
InPolygon ( x . y . pMat [ r . 3 ] . pMat [ r . 4 ]) ;
) ;
// Mit einer Polygonmatrix pMat und einer ShapeID und PartID darin bestimmt, ob der Punkt (x, y) in dem von dieser Form und diesem Teil eingeschriebenen Rechteck liegt
inShapePartRect =
Funktion ({ pMat . ShapeID . partID . x . y } . { Default Local } .
r = Loc ( pMat [ 0 . 1 ] == ShapeID & pMat [ 0 . 2 ] == partID ) ;
maxX = Maximal ( pMat [ r . 3 ]) ;
minX = Minimum ( pMat [ r . 3 ]) ;
maxY = Maximal ( pMat [ r . 4 ]) ;
minY = Minimum ( pMat [ r . 4 ]) ;
ob ( ( x <= maxX ) & ( x > = minX ) & ( y <= maxY ) & ( y > = minY ) . 1 . 0 ) ;
) ;
pMat = Polygone << getAsMatrix ; // 'Polygonmatrix'
x = Säule ( Punkte . "Längengrad" ) << getValues ; // x Werte
y = Säule ( Punkte . "Breite" ) << getValues ; // y Werte
loopLimits = Polygone << Zusammenfassung ( Gruppe ( : Form-ID . : Teil Nr ) . Unsichtbar ) ;
ns = Maximal ( Säule ( loopLimits . "Shape ID" ) << getValues ) ; // Anzahl der Formen
np = Säule ( loopLimits . "Teil Nr" ) << getValues ; // Anzahl der Teile in jeder Form
Schließen ( loopLimits . NoSave ) ;
Zum ( s = 1 . s <= ns . s ++ // Schleife über Formen
Zum ( p = 1 . p <= np [ s ] . p ++ // Teile überlaufen
Zum ( d = NRow ( x ) . d > = 1 . d -, // Schleife über Punkte
// Befindet sich der Punkt innerhalb des Quadrats, das das Polygon beschreibt? (Relativ günstig!)
ob ( inShapePartRect ( pMat . s . p . x [ d ] . y [ d ]) .
// Wenn ja, dann nachsehen, ob es tatsächlich im Polygon liegt (relativ teuer!)
ob ( inShapePart ( pMat . s . p . x [ d ] . y [ d ]) .
ShapeName = Säule ( Namen . "Name" ) [ s ] ;
Drucken ( "Punkt (" || Verkohlen ( x [ d ]) || "," || Verkohlen ( y [ d ]) || ") gefunden in Shape || Verkohlen ( s ) || ", Teil" || Verkohlen ( p ) || ", mit Name" || ShapeName || "." ) ;
// NB: Wenn jeder Punkt gefunden ist, löschen Sie die entsprechenden Einträge in 'x' und 'y', um zu versuchen, die Dinge zu beschleunigen
x [ d ] = [] ; y [ d ] = []
) ;
) ;
) ;
) ;
) ;
Schließen ( Punkte . NoSave ) ;
Schließen ( Polygone . NoSave ) ;
Schließen ( Namen . NoSave ) ;
Re: Join-Tabellen nach StandortHallo zusammen,
Ich habe es geschafft, das Skript zum Laufen zu bringen. Es nimmt jeden Punkt und vergleicht ihn mit dem Polygon, mit dem er umgeben ist, um die Tabellen zu verbinden. In diesem Fall wird jedem Punkt der Name des Bundesstaates hinzugefügt.
Das Skript erledigt seine Arbeit, aber möglicherweise nicht auf die effizienteste Weise. Anny Ideen für mehr Effizienz sind willkommen.
Wenn Sie es nutzen können, teilen Sie bitte Ihre Erfahrungen.
Globale löschen () ;
Namensvorgabe bis hier ( 1 ) ;
// open dots file - dies beinhaltet die Beobachtung, die wir aktualisieren möchten
Punkte = Öffnen ( "C: \ Programme (x86) \ SAS \ JMPSW \ 11 \ Samples \ Data \ Hurricanes.jmp" ) ;
// Verkleinern Sie die Daten für die Abbildung
Punkte << Zeilen löschen ( Punkte << reihen wo ( : Name ( "Name und ID" ) ! = "NOTNAMED_675" ) ) ;
// Polygonquelle öffnen
Polygone = Öffnen ( "C: \ Programme (x86) \ SAS \ JMPSW \ 11 \ Maps \ US-State-XY.jmp" . Privatgelände ) ;
// offene Datenquelle - diese enthält die zu aktualisierenden Informationen
Daten = Öffnen ( "C: \ Programme (x86) \ SAS \ JMPSW \ 11 \ Maps \ US-State-Name.jmp" . Privatgelände ) ;
// führe die Spalte mit den Attributen ein, die in der Punktetabelle aktualisiert werden sollen
Punkte << Neue Spalte ( "Zustand" . Charakter . Nominal ) ;
Punkte << Beschriftungsspalten festlegen ( : Zustand ) ;
Warten ( 1 ) ;
// Extraktion der Polygone in Matrizen zur Verbesserung der Effizienz
XMATRIX = Polygone : X << als Matrix erhalten ; // x Werte von Polygonen
YMATRIX = Polygone : Y << als Matrix erhalten ; // y-Wert von Polygonen
Start = Tick Sekunden () ;
// durch die Punkte durch die Polygone laufen und nach Übereinstimmungen suchen.
Zum ( ich = 1 . ich <= N Reihen ( Punkte ) . ich ++ // für jeden Punkt
Zum ( ii = 1 . ii <= Col max ( Polygone : Form-ID ) . ii ++ // für jede Form-ID
ROWLISTII = Polygone << reihen wo ( Polygone : Form-ID == ii ) ; // Holen Sie sich die Zeilen für jede Shape-ID
Zum ( iii = 1 . iii <= Max ( Polygone : Teil Nr [ ROWLISTII ] ) . iii ++ // für jede Bauteil-ID entsprechend der Anzahl der Bauteil-IDs für jede Shape-ID
// Holen Sie sich die Zeilen für jedes Polygon
Rowsii = Polygone << reihen wo ( Und ( Polygone : Form-ID == ii . Polygone : Teil Nr == iii ) ) ;
// Holen Sie sich die X-Werte für jedes Polygon
XMATRIXROWSII = XMATRIX [ Rowsii ] ;
// Die Y-Werte für jedes Polygon abrufen
YMATRIXROWSII = YMATRIX [ Rowsii ] ;
// vergleiche die Position des Punktes mit dem Polygon
Ergebnis = In Polygon ( Punkte : Längengrad [ ich ] . Punkte : Breite [ ich ] . XMATRIXROWSII . YMATRIXROWSII ) ;
Ob ( Ergebnis == 1 . Show ( ich . ii . Daten : Name [ ii ] ) ) ; // Dadurch wird die Liste der übereinstimmenden Paare an das Protokoll gesendet
Ob ( Ergebnis == 1 .
Punkte : Zustand [ ich ] = Daten : Name [ ii ] ; // Dadurch wird das Attribut von den Polygoninformationen (Daten) auf den Punkt (Punkte) aktualisiert.
Brechen () ; // Dadurch wird die dritte Schleife (iii) gestoppt, um mehr Polygone mit derselben Shape-ID zu überprüfen.
) ;
) ;
Ob ( Ergebnis == 1 . Brechen () ) ; // Dadurch wird die zweite Schleife (ii) angehalten, nach mehr Shape-IDs für denselben Punkt zu suchen, und zum nächsten Punkt überzugehen In der Liste.
)
) ;
Ende = Tick Sekunden () ;
Laufzeit = Ende - Start ;
Show ( Laufzeit ) ;
// Warten (1);
Punkte << Bivariate (
Y ( : Breite ) .
X ( : Längengrad ) .
SendToReport (
Versand ( {} . "1" . ScaleBox . { Rahmen ( "Geodätisch" ) . Mindest ( - 94.0515072337543 ) . Max ( - 60.9484927662457 ) . Inc ( 5 ) . Kleinere Zecken ( 1 )} ) .
Versand ( {} . "2" . ScaleBox . { Rahmen ( "Geodätisch" ) . Mindest ( 7.96034811422145 ) . Max ( 49.6893151267156 ) . Inc ( 5 ) . Kleinere Zecken ( 1 )} ) .
Versand (
{} .
"Bivar-Plot" .
FrameBox .
{ Rahmengröße ( 449 . 566 ) . Hintergrundkarte ( Grenzen ( "US-Staaten" ) ) . Rasterlinienreihenfolge ( 3 ) . Referenzzeile bestellen ( 4 ) .
Row Legend (
Zustand .
Farbe ( 1 ) .
Farbthema ( "JMP-Standard" ) .
Marker ( 0 ) .
Marker-Thema ( "" ) .
Kontinuierliche Skala ( 0 ) .
Maßstab umkehren ( 0 ) .
Ausgeschlossene Zeilen ( 0 )
)}
)
)
) ;
Re: Join-Tabellen nach StandortIch würde gerne einen Beispielcode sehen, wenn Sie ihn zum Laufen bringen.
Re: Join-Tabellen nach StandortVielen Dank Ian @ JMP
Das sieht vielversprechend aus. werde durch das gehen, was ich brauche, um zu sehen, ob es funktioniert.
ron
Re: Join-Tabellen nach StandortIch denke, du wirst Scripting brauchen. Die JSL-Funktion 'InPolygon ()' sollte nützlich sein.