unir tablas en función de la ubicación<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola a todos
¿Pueden JMP unir (actualizar) las tablas según la ubicación?
Tengo un conjunto de datos de puntos con coordenadas y un shapefile de polígonos. Me gustaría actualizar la tabla de datos de puntos con información del shapefile basado en la ubicación. Entonces, si un punto está en un polígono en particular, actualizaría la tabla con los atributos del polígono.
¡Gracias!
Ron
Re: unir tablas basadas en ubicaciónPara acelerar aún más la secuencia de comandos, puede verificar si el punto está en la casilla "América" primero. Anexando al guión de Ian
inAmericaRect =
Función ({pMat, x, y}, {Local Default},
maxX = Máximo (pMat [0, 3]);
minX = Mínimo (pMat [0, 3]);
maxY = Máximo (pMat [0, 4]);
minY = Mínimo (pMat [0, 4]);
if ((x <= maxX) & (x> = minX) & (y <= maxY) & (y> = minY), 1, 0);
);
...
// ¿Está el punto dentro de la Plaza de América?
if (inAmericaRect (pMat, x, y)
Por supuesto, dado a Puerto Rico, esto podría ralentizar la secuencia de comandos al agregar una instrucción if extra. Todavía siento que hay suficientes datos fuera para justificarlo. Pero para solucionarlo, simplemente puede dividir Puerto Rico u otras islas y agregar una función adicional en PuertoRicoRect. Podría hacer un filtrado adicional para otros países usando world-name.jmp y world-xy.jmp. O puede usar la línea costera-Nombre.jmp y la línea costera-xy.jmp para determinar primero si está en tierra firme. Pero, estoy seguro de que en ese momento su guión no estará dentro del alcance del proyecto.
Re: unir tablas basadas en ubicacióngracias Ian @ JMP ,
Esto es mucho mejor que mi enfoque y mucho más rápido.
Al producir los bucles en mi script, noté que la tabla XY no está perfectamente limpia y su enfoque también es sólido en contra de eso (la identificación de la forma 10 tiene la identificación de la pieza 1,3,4,5 - omitiendo 2).
ron
Re: unir tablas basadas en ubicación8 horas y media después se unió todo el archivo de huracanes. Como la mayoría de los puntos están en el mar, el script tardó un tiempo en verificar que cada uno de ellos no estaba en ninguno de los 52 estados (84 polígonos).

Re: unir tablas basadas en ubicaciónCasualmente, acabo de encontrar tiempo para echar un vistazo rápido. No hago reclamos para mejorar la eficiencia, pero solo lo ofrezco para fines de comparación. No hice comprobaciones ni pruebas. Para el subconjunto que está utilizando, se ejecuta casi instantáneamente. Nota la OS / X caminos.
NombresDefaultToHere ( 1 ) ;
Borrar registro () ;
// Abrir archivo de puntos - esto incluye la observación que queremos actualizar
puntos = Abierto ( "$ SAMPLE_DATA / Hurricanes.jmp" ) ;
puntos << eliminar filas ( puntos << obtener filas donde ( : Nombre ( "Nombre e ID" ) ! = "NOTNAMED_675" ) ) ;
// Abrir fuente de polígono
polígonos = Abierto ( "/ Library / Application Support / JMP / 12 / Maps / US-State-XY.jmp" ) ;
// Fuente de datos abierta - esta incluye la información para actualizar
nombres = Abierto ( "/ Library / Application Support / JMP / 12 / Maps / US-State-Name.jmp" ) ;
// Dada una pMat de 'matriz de polígono' y un ID de forma y PartID en su interior, determina si el punto (x, y) se encuentra en el polígono definido por esta forma y parte
inShapePart =
Función ({ pMat , shapeID , partID , X , y } , { Predeterminado local } ,
r = Loc ( pMat El 0 , 1 ] == shapeID Y pMat El 0 , 2 ] == partID ) ;
En poligono ( X , y , pMat El r , 3 ] , pMat El r , 4 ]) ;
) ;
// Dado un pMat de 'matriz de polígono' y un ID de forma y un ID de parte, determina si el punto (x, y) se encuentra en el rectángulo inscrito por esta forma y parte
inShapePartRect =
Función ({ pMat , shapeID , partID , X , y } , { Predeterminado local } ,
r = Loc ( pMat El 0 , 1 ] == shapeID Y pMat El 0 , 2 ] == partID ) ;
maxX = Máximo ( pMat El r , 3 ]) ;
marta = Mínimo ( pMat El r , 3 ]) ;
máximo = Máximo ( pMat El r , 4 ]) ;
MINY = Mínimo ( pMat El r , 4 ]) ;
Si ( ( X <= maxX ) Y ( X > = marta ) Y ( y <= máximo ) Y ( y > = MINY ) , 1 , 0 ) ;
) ;
pMat = polígonos << getAsMatrix ; // 'Matriz poligonal'
X = Columna ( puntos , "Longitud" ) << getValues ; // x valores
y = Columna ( puntos , "Latitud" ) << getValues ; // valores de y
límites de bucle = polígonos << Resumen ( Grupo ( : ID de forma , : ID de pieza ) , Invisible ) ;
ns = Máximo ( Columna ( límites de bucle , "ID de forma" ) << getValues ) ; // Número de formas
notario público = Columna ( límites de bucle , "ID de pieza" ) << getValues ; // Número de piezas en cada forma
Cerrar ( límites de bucle , NoSave ) ;
por ( s = 1 , s <= ns , s ++, // Bucle sobre formas
por ( pag = 1 , pag <= notario público El s ] , pag ++, // Bucle sobre partes
por ( re = NRow ( X ) , re > = 1 , re -, // Bucle sobre puntos
// ¿Está el punto dentro del cuadrado que inscribe el polígono? (¡Relativamente barato!)
Si ( inShapePartRect ( pMat , s , pag , X El re ] , y El re ]) ,
// Si es así, mira si está realmente en el polígono (¡relativamente caro!)
Si ( inShapePart ( pMat , s , pag , X El re ] , y El re ]) ,
shapeName = Columna ( nombres , "Nombre" ) [ s ] ;
Impresión ( "Punto (" || Carbonizarse ( X El re ]) || " || Carbonizarse ( y El re ]) || ") encontrado en forma" || Carbonizarse ( s ) || ", Parte" || Carbonizarse ( pag ) || ", con nombre" || shapeName || "." ) ;
// NB: Como cada punto se 'encuentra', borre las entradas correspondientes en 'x' y 'y' para intentar acelerar el proceso.
X El re ] = [] ; y El re ] = []
) ;
) ;
) ;
) ;
) ;
Cerrar ( puntos , NoSave ) ;
Cerrar ( polígonos , NoSave ) ;
Cerrar ( nombres , NoSave ) ;
Re: unir tablas basadas en ubicaciónHola a todos,
Me las arreglé para hacer funcionar el script. Toma cada punto y lo combina con el polígono con el que está rodeado para unir las tablas. En este caso agrega el nombre del estado a cada punto.
El script hace su trabajo pero quizás no de la manera más eficiente. Ideas de Anny para mejorar la eficiencia son bienvenidas.
Si puedes usarlo por favor comparte tu experiencia.
Globos claros () ;
Nombres predeterminados aquí ( 1 ) ;
// archivo de puntos abiertos - esto incluye la observación que queremos actualizar
puntos = Abierto ( "C: \ Archivos de programa (x86) \ SAS \ JMPSW \ 11 \ Samples \ Data \ Hurricanes.jmp" ) ;
// reducir el tamaño de los datos para la ilustración
puntos << eliminar filas ( puntos << obtener filas donde ( : Nombre ( "Nombre e ID" ) ! = "NOTNAMED_675" ) ) ;
// fuente poligonal abierta
polígonos = Abierto ( "C: \ Archivos de programa (x86) \ SAS \ JMPSW \ 11 \ Maps \ US-State-XY.jmp" , Privado ) ;
// fuente de datos abierta - esta incluye la información para actualizar
datos = Abierto ( "C: \ Archivos de programa (x86) \ SAS \ JMPSW \ 11 \ Maps \ US-State-Name.jmp" , Privado ) ;
// introducir la columna con los atributos que se actualizarán en la tabla de puntos
puntos << Nueva Columna ( "Estado" , Personaje , Nominal ) ;
puntos << Establecer columnas de etiquetas ( : Estado ) ;
Espere ( 1 ) ;
// extraer los polígonos en matrices para mejorar la eficiencia
XMATRIX = polígonos : X << obtener como matriz ; // x valores de polígonos
YMATRIX = polígonos : Y << obtener como matriz ; // y valor de los polígonos
comienzo = Segundos de la garrapata () ;
// corre a través de los puntos a través de los polígonos y busca coincidencias.
por ( yo = 1 , yo <= N filas ( puntos ) , yo ++, // para cada punto
por ( ii = 1 , ii <= Col Max ( polígonos : ID de forma ) , ii ++, // para cada ID de forma
ROWLISTII = polígonos << obtener filas donde ( polígonos : ID de forma == ii ) ; // obtener las filas para cada ID de forma
por ( iii = 1 , iii <= Max ( Poligonos : ID de pieza El ROWLISTII ] ) , iii ++, // para cada ID de pieza según el número de ID de piezas para cada ID de forma
// obtener las filas para cada polígono
rowsii = polígonos << obtener filas donde ( Y ( polígonos : ID de forma == ii , polígonos : ID de pieza == iii ) ) ;
// obtener los valores de X para cada polígono
XMATRIXROWSII = XMATRIX El rowsii ] ;
// obtener los valores de Y para cada polígono
YMATRIXROWSII = YMATRIX El rowsii ] ;
// compara la ubicación del punto con el polígono
resultado = En polígono ( puntos : longitud El yo ] , puntos : Latitud El yo ] , XMATRIXROWSII , YMATRIXROWSII ) ;
Si ( resultado == 1 , Show ( yo , ii , datos : Nombre El ii ] ) ) ; // esto enviará la lista de pares coincidentes al registro
Si ( resultado == 1 ,
puntos : Estado El yo ] = datos : Nombre El ii ] ; // esto hará que la actualización del atributo de la información del polígono (datos) al punto (puntos)
Descanso () ; // esto hará que el tercer bucle (iii) deje de verificar más polígonos de la misma ID de forma.
) ;
) ;
Si ( resultado == 1 , Descanso () ) ; // esto hará que el segundo bucle (ii) deje de buscar más ID de forma para el mismo punto y se mueva al siguiente punto en la lista.
)
) ;
Fin = Segundos de la garrapata () ;
Tiempo de ejecución = Fin - comienzo ;
Show ( tiempo de ejecución ) ;
// Espera (1);
puntos << Bivariable (
Y ( : Latitud ) ,
X ( : Longitud ) ,
SendToReport (
Envío ( {} , "1" , ScaleBox , { Escala ( "Geodésico" ) , Min ( - 94.0515072337543 ) , Max ( - 60.9484927662457 ) , Cía ( 5 ) , Garrapatas menores ( 1 )} ) ,
Envío ( {} , "2" , ScaleBox , { Escala ( "Geodésico" ) , Min ( 7.96034811422145 ) , Max ( 49.6893151267156 ) , Cía ( 5 ) , Garrapatas menores ( 1 )} ) ,
Envío (
{} ,
"Bivar Plot" ,
FrameBox ,
{ Tamaño del marco ( 449 , 566 ) , Mapa de fondo ( Límites ( "Estados Unidos" ) ) , Orden de línea de cuadrícula ( 3 ) , Orden de línea de referencia ( 4 ) ,
Leyenda de la fila (
Estado ,
Color ( 1 ) ,
Tema de color ( "JMP Default" ) ,
Marcador ( 0 ) ,
Tema del marcador ( "" ) ,
Escala continua ( 0 ) ,
Escala inversa ( 0 ) ,
Filas Excluidas ( 0 )
)}
)
)
) ;
Re: unir tablas basadas en ubicaciónMe encantaría ver un código de muestra si lo haces funcionar.
Re: unir tablas basadas en ubicaciónGracias Ian @ JMP
Esto parece prometedor. Pasará por lo que necesito que haga y ver si funciona.
ron
Re: unir tablas basadas en ubicaciónCreo que necesitarás scripting. La función JSL 'InPolygon ()' debería ser útil.