unire le tabelle in base alla posizione<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ciao a tutti
È possibile unire tabelle di aggiornamento (aggiornamento) in base alla posizione?
Ho un set di dati di punti con coordinate e uno shapefile di poligoni. Vorrei aggiornare la tabella dei dati dei punti con le informazioni dello shapefile in base alla posizione. Quindi se un punto si trova in un particolare poligono aggiornerebbe la tabella con gli attributi del poligono.
Grazie!
Ron
Ri: join tabelle in base alla posizionePer accelerare ulteriormente lo script, è possibile verificare se il punto si trova prima in "America". Aggiungendo la sceneggiatura di Ian
inAmericaRect =
Funzione ({pMat, x, y}, {Default Local},
maxX = Massimo (pMat [0, 3]);
minX = Minimum (pMat [0, 3]);
maxY = Maximum (pMat [0, 4]);
minY = Minimum (pMat [0, 4]);
se ((x <= maxX) & (x> = minX) & (y <= maxY) & (y> = minY), 1, 0);
);
...
// Il punto è all'interno di Square of America?
if (inAmericaRect (pMat, x, y),
Ovviamente, dato Puerto Rico, questo potrebbe potenzialmente rallentare lo script aggiungendo un'istruzione extra if. Sento ancora che ci sono dati sufficienti per giustificarlo. Ma per risolvere il problema, potresti semplicemente scindere Puerto Rico o altre isole e aggiungere un'aggiunta alla funzione PicoRicoRect. Si potrebbe fare un ulteriore filtraggio per gli altri paesi usando world-name.jmp e world-xy.jmp. Oppure puoi usare coastline-Name.jmp e coastline-xy.jmp per determinare prima se si trova sulla terraferma. Ma sono sicuro che a quel punto il tuo script andrà oltre lo scopo del progetto.
Ri: join tabelle in base alla posizionegrazie Ian @ JMP ,
questo è molto meglio del mio approccio e molto più veloce.
mentre producevo i loop nella mia sceneggiatura ho notato che il tavolo XY non è perfettamente pulito e il tuo approccio è anche robusto contro questo (l'ID di figura 10 ha l'ID di parte 1,3,4,5 - saltando 2).
ron
Ri: join tabelle in base alla posizione8 ore e mezza dopo si è unito l'intero file di uragani. poiché la maggior parte dei punti sono in mare, la sceneggiatura ha richiesto un po 'di tempo per verificare che ognuno di essi non si trovasse in nessuno dei 52 stati (84 poligoni).

Ri: join tabelle in base alla posizionePer coincidenza, ho appena trovato il tempo di dare una rapida occhiata. Non faccio affermazioni per migliorare l'efficienza, ma la offro solo a scopo di confronto. Non ho fatto controlli o test. Per il sottoinsieme che stai utilizzando, viene eseguito quasi istantaneamente. Nota il Percorsi OS / X.
NamesDefaultToHere ( 1 ) ;
Pulisci il registro () ;
// Open dots file - questo include l'osservazione che vogliamo aggiornare
puntini = Aperto ( "$ SAMPLE_DATA / Hurricanes.jmp" ) ;
puntini << cancella le righe ( puntini << ottenere righe dove ( : Nome ( "Nome e ID" ) ! = "NOTNAMED_675" ) ) ;
// Apri poligono sorgente
poligoni = Aperto ( "/ Libreria / Application Support / JMP / 12 / Maps / US-State-XY.jmp" ) ;
// Apri origine dati: questa include le informazioni da aggiornare
nomi = Aperto ( "/ Libreria / Application Support / JMP / 12 / Maps / US-State-Name.jmp" ) ;
// Data una 'matrice poligonale' pMat, e un shapeID e PartID al suo interno, determina se il punto (x, y) si trova nel poligono definito da questa forma e parte
inShapePart =
Funzione ({ PMAT , shapeID , partID , X , y } , { Locale predefinito } ,
r = Loc ( PMAT [ 0 , 1 ] == shapeID & PMAT [ 0 , 2 ] == partID ) ;
InPolygon ( X , y , PMAT [ r , 3 ] , PMAT [ r , 4 ]) ;
) ;
// Dato un 'matrice poligonale' pMat, e un shapeID e PartID al suo interno, determina se il punto (x, y) si trova nel rettangolo inscritto da questa forma e parte
inShapePartRect =
Funzione ({ PMAT , shapeID , partID , X , y } , { Locale predefinito } ,
r = Loc ( PMAT [ 0 , 1 ] == shapeID & PMAT [ 0 , 2 ] == partID ) ;
maxX = Massimo ( PMAT [ r , 3 ]) ;
minX = Minimo ( PMAT [ r , 3 ]) ;
maxy = Massimo ( PMAT [ r , 4 ]) ;
Miny = Minimo ( PMAT [ r , 4 ]) ;
Se ( ( X <= maxX ) & ( X > = minX ) & ( y <= maxy ) & ( y > = Miny ) , 1 , 0 ) ;
) ;
PMAT = poligoni << getAsMatrix ; // "matrice poligonale"
X = Colonna ( puntini , "Longitudine" ) << getValues ; // x valori
y = Colonna ( puntini , "Latitudine" ) << getValues ; // y valori
loopLimits = poligoni << Sommario ( Gruppo ( : Shape ID , : ID parte ) , Invisibile ) ;
ns = Massimo ( Colonna ( loopLimits , "ID forma" ) << getValues ) ; // Numero di forme
np = Colonna ( loopLimits , "ID parte" ) << getValues ; // Numero di parti in ogni forma
Vicino ( loopLimits , NOSAVE ) ;
Per ( S = 1 , S <= ns , S ++, // Loop over shapes
Per ( p = 1 , p <= np [ S ] , p ++, // Loop over parts
Per ( d = nRow ( X ) , d > = 1 , d -, // Loop over punti
// Il punto all'interno del quadrato che inscrive il poligono è il punto? (Relativamente economico!)
Se ( inShapePartRect ( PMAT , S , p , X [ d ] , y [ d ]) ,
// Se è così, vedi se è effettivamente nel poligono (Relativamente costoso!)
Se ( inShapePart ( PMAT , S , p , X [ d ] , y [ d ]) ,
shapename = Colonna ( nomi , "Nome" ) [ S ] ;
Stampare ( "Punto (" || carbonizzare ( X [ d ]) || "," || carbonizzare ( y [ d ]) || ") trovato in forma" || carbonizzare ( S ) || ", Parte " || carbonizzare ( p ) || ", con nome" || shapename || "" ) ;
// NB: Man mano che ogni punto viene trovato, elimina le voci corrispondenti in "x" e "y" per cercare di accelerare le cose
X [ d ] = [] ; y [ d ] = []
) ;
) ;
) ;
) ;
) ;
Vicino ( puntini , NOSAVE ) ;
Vicino ( poligoni , NOSAVE ) ;
Vicino ( nomi , NOSAVE ) ;
Ri: join tabelle in base alla posizioneCiao a tutti,
Sono riuscito a far funzionare la sceneggiatura. Prende ogni punto e lo abbina al poligono con il quale è circondato per unire le tabelle. In questo caso, aggiunge il nome dello stato a ciascun punto.
Lo script fa il suo lavoro ma forse non nel modo più efficiente. Le idee di Anny per una migliore efficienza sono benvenute.
Se la usi, per favore condividi la tua esperienza.
Chiari Globali () ;
Nomi predefiniti qui ( 1 ) ;
// file open dots: include l'osservazione che vogliamo aggiornare
puntini = Aperto ( "C: \ Programmi (x86) \ SAS \ JMPSW \ 11 \ Samples \ Data \ Hurricanes.jmp" ) ;
// riduce la dimensione dei dati per l'illustrazione
puntini << cancella le righe ( puntini << ottenere righe dove ( : Nome ( "Nome e ID" ) ! = "NOTNAMED_675" ) ) ;
// apre il poligono sorgente
poligoni = Aperto ( "C: \ Programmi (x86) \ SAS \ JMPSW \ 11 \ Maps \ US-State-XY.jmp" , Privato ) ;
// apri origine dati: questa include le informazioni da aggiornare
dati = Aperto ( "C: \ Programmi (x86) \ SAS \ JMPSW \ 11 \ Maps \ US-State-Name.jmp" , Privato ) ;
// introduce la colonna con gli attributi da aggiornare nella tabella dei punti
puntini << Nuova colonna ( "Stato" , Personaggio , Nominale ) ;
puntini << Imposta colonne di etichette ( : Stato ) ;
Aspettare ( 1 ) ;
// estrae i poligoni in matrici per migliorare l'efficienza
XMATRIX = poligoni : X << ottenere come matrice ; // x valori di poligoni
YMATRIX = poligoni : Y << ottenere come matrice ; // y valore di poligoni
Inizio = Tick Seconds () ;
// scorre attraverso i punti attraverso i poligoni e controlla le corrispondenze.
Per ( io = 1 , io <= N righe ( puntini ) , io ++, // per ogni punto
Per ( ii = 1 , ii <= Col Max ( poligoni : Shape ID ) , ii ++, // per ogni ID forma
ROWLISTII = poligoni << ottenere righe dove ( poligoni : Shape ID == ii ) ; // ottiene le righe per ogni Shape ID
Per ( iii = 1 , iii <= Max ( poligoni : ID parte [ ROWLISTII ] ) , iii ++, // per ogni ID parte in base al numero di ID parte per ogni ID forma
// ottiene le righe per ogni poligono
rowsii = poligoni << ottenere righe dove ( E ( poligoni : Shape ID == ii , poligoni : ID parte == iii ) ) ;
// ottiene i valori X per ogni poligono
XMATRIXROWSII = XMATRIX [ rowsii ] ;
// ottiene i valori Y per ogni poligono
YMATRIXROWSII = YMATRIX [ rowsii ] ;
// confronta la posizione del punto con il poligono
risultato = In poligono ( puntini : longitudine [ io ] , puntini : Latitudine [ io ] , XMATRIXROWSII , YMATRIXROWSII ) ;
Se ( risultato == 1 , Mostrare ( io , ii , dati : Nome [ ii ] ) ) ; // questo invierà l'elenco delle coppie corrispondenti al log
Se ( risultato == 1 ,
puntini : Stato [ io ] = dati : Nome [ ii ] ; // questo renderà l'aggiornamento dell'attributo dalle informazioni del poligono (dati) al punto (punti)
Rompere () ; // questo farà sì che il terzo ciclo (iii) smetta di controllare più poligoni dello stesso ID di forma.
) ;
) ;
Se ( risultato == 1 , Rompere () ) ; // questo farà sì che il secondo ciclo (ii) interrompa il controllo di altri ID di forma per lo stesso punto e si sposti al punto successivo nella lista.
)
) ;
Fine = Tick Seconds () ;
Runtime = Fine - Inizio ;
Mostrare ( runtime ) ;
// Wait (1);
puntini << bivariate (
Y ( : Latitudine ) ,
X ( : Longitudine ) ,
SendToReport (
Spedizione ( {} , "1" , scalebox , { Scala ( "Geodetica" ) , min ( - 94,0515072337543 ) , Max ( - 60,9484927662457 ) , Inc ( 5 ) , Zecche minori ( 1 )} ) ,
Spedizione ( {} , "2" , scalebox , { Scala ( "Geodetica" ) , min ( 7,96034811422145 ) , Max ( 49,6893151267156 ) , Inc ( 5 ) , Zecche minori ( 1 )} ) ,
Spedizione (
{} ,
"Bivar Plot" ,
framebox ,
{ Dimensione della cornice ( 449 , 566 ) , Mappa di sfondo ( confini ( "Stati USA" ) ) , Grid Line Order ( 3 ) , Ordine della linea di riferimento ( 4 ) ,
Row Legend (
Stato ,
Colore ( 1 ) ,
Tema del colore ( "JMP predefinito" ) ,
marcatore ( 0 ) ,
Tema degli indicatori ( "" ) ,
Scala continua ( 0 ) ,
Scala inversa ( 0 ) ,
Righe escluse ( 0 )
)}
)
)
) ;
Ri: join tabelle in base alla posizioneMi piacerebbe vedere un codice di esempio se lo fai funzionare.
Ri: join tabelle in base alla posizioneGrazie Ian @ JMP
Questo sembra promettente. passerà attraverso quello che ho bisogno di fare e vedere se funziona.
ron
Ri: join tabelle in base alla posizionePenso che avrai bisogno di script. La funzione JSL "InPolygon ()" dovrebbe essere utile.