Tengo un conjunto de datos de alrededor de 15.000 puntos que son lugares a lo largo de ROV encuesta pistas de donde se tomaron medidas. Estos puntos pueden ser menos de 5 metros de distancia y la encuesta de las pistas de frecuencia de la cruz o puede estar cerca el uno del otro (<90 metros de distancia). Nos gustaría ejecutar algunos de los análisis sobre estos puntos, pero nos gustaría para seleccionar los puntos que están a menos de 150 metros de distancia para minimizar espacial de auto-correlación. Hay una buena metodología para encontrar el máximo número de puntos que podrían ajustarse a este requisito?
Respuestas
¿Demasiados anuncios?Sé que esto es un no-ArcGIS opción, pero creo que se podría hacer esto en QGIS (si es que es de interés). En la Vector
ficha, hay dos funciones que le va a ayudar, Random Selection
y Distance Matrix
. Primera carga de sus puntos en QGIS, de elegir el número de características que de forma aleatoria se desea elegir (probablemente querría x% más de lo que necesita como algunos será eliminado a partir de los siguientes criterios).
A continuación, calcular la distancia entre los puntos seleccionados (Vector -> Analysis Tools -> Distance Matrix
).
Esto produce un .csv
archivo que usted puede unirse a sus originales puntos de uso de la MMQIS
plugin con la característica Attributes Join from CSV File
. A continuación, la consulta de los datos (clic Derecho en el archivo y seleccione consulta) para filtrar las distancias <150m
.
Gracias por las sugerencias sobre esto. Mis colegas han decidido utilizar un quitar de secuencia de comandos de MatLab la espacial autocorrelated puntos.
%script to "thin" a point set so that no points are within threshold distance of other points
%note: final thinned point set is dependent on choice of the first point and on ordering of points in the processing list;
% i.e. it is not unique
clear, clc
spts = xlsread('PresenceOnly_Random30perc_ForAccuracyAssessment.xls'); % Read in file
spts(:,33) = 0; %Placeholder for column 33 (which will be where deleted points tagged)
k = length(spts); %set total rows of data
mindis = 169; %Set minimum distance between points
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for refp = 1:k %Sets first data point in matrix as reference, iterates through all points
disp(refp);
for compt = 1:k %Starts loop to calculate distance from refp to other points
if (spts(compt,33) ~= 1) & (spts(refp,33) ~= 1) & (refp~=compt) %only looks at points that have not been flagged
distsq = sqrt(((spts(compt,9)-spts(refp,9))^2 +(spts(compt,10)-spts(refp,10))^2)); %Calculates distance between two points.
distref(compt,:)=distsq; %Save distance values in matrix distref
if distsq < mindis %If distance is less than min distance
spts(compt,33)= 1; %tag col 33 with value of 1 to delete later.
end
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
deletedrows = find(spts(:,33) == 1); %Find rows with the tag (1), output matrix of indicies
remainingpts = spts; %Created matrix that will have exra points deleted
remainingpts(deletedrows,:) = []; %Clear entire row based on previous matrix
save all_data_tagged.dat spts /ASCII -tabs %Saves all data, points to be removed = 1 in col33
save remaining_pts.dat remainingpts /ASCII -tabs
plot(spts(:,9),spts(:,10),'b.',remainingpts(:,9),remainingpts(:,10),'r.');
xlabel('Latitude, meters'), ylabel('Longitude, meters'), grid minor
ArcGIS opción:
e: se agregó la descripción
Esta secuencia de comandos se realizan Cerca de análisis en el conjunto de datos determinado. Esto va a calcular la distancia al punto más cercano en el conjunto de datos y agregar el atributo de distancia y cerca de punto de FID para la tabla. Secuencia de comandos, a continuación, se realizará un bucle a través del conjunto de datos de eliminar cada punto de tener un vecino en la proximidad de los más pequeños de 150 m (si el conjunto de datos de sistemas de coordenadas de las unidades son metros!). Aparecerá una lista de cualquier punto de la FID que se borró y de verificación de los puntos con NEAR_DIST < 150 si su NEAR_FID no ha sido ya eliminado. Si lo tiene, esto significa que la distancia no es cierto ya.
Compare esto con la solución dada por celenius. Si usted tiene un par de puntos en la proximidad de los más pequeños de 150 m a cada uno de los otros a que ambos se elimina si este control no se realiza.
Después de conseguir a través de todo el archivo de la secuencia de comandos realiza Cerca análisis de nuevo y repetir todo el asunto. Es sorprendentemente rápido.
Por favor, tenga en cuenta que esta es una de mi primera vez de secuencias de comandos y sé que es horrible, pero hace el trabajo. No tienes tiempo para hacerlo mejor, pero ahora estoy feliz de contestar cualquier pregunta. Tenga en cuenta que el sistema de coordenadas de su archivo de entrada debe tener metros como unidades y puede que necesite cambiar los nombres de campo en el guión según corresponda a su entrada. Esto puede ser importado a ArcGIS como herramienta de secuencia de comandos - el único parámetro de ella es la clase de entidad de entrada.
import arcpy, sys
feature = arcpy.GetParameterAsText(0)
arcpy.gp.overwriteOutput = True
#running NEAR analysis - every point gets attribute of a distance to the nearest point
#in same feature class
arcpy.AddMessage("running first near analysis")
arcpy.Near_analysis(feature, feature)
arcpy.AddMessage("inserting cursor")
cur = arcpy.UpdateCursor(feature)
row = cur.next()
arcpy.AddMessage("starting loop")
i=0
while row:
i+=1
#fids list will store list of deleted points so if any other point will have
#deleted one as the nearest and distance < 150 will not get deleted as this
#distance is no longer true
fids = []
while row:
if row.NEAR_DIST < 150:
try:
#it seems I didn't know if .. in .. at the time ;) such a fun to dig
#this script up! index throws an exception if element is not in the
#list
fids.index(row.NEAR_FID)
arcpy.AddMessage("OBJECTID = " + str(row.OBJECTID) + " is listed!")
except:
arcpy.AddMessage("deleting OBJECTID = " + str(row.OBJECTID))
fids.append(row.FID)
cur.deleteRow(row)
d = 1
row = cur.next()
del cur, row, fids
try:
#this idiotic test is to break the loop when no points will have
#NEAR_DIST < 150, shameful - I know!
if d == 1:
pass
except:
sys.exit(0)
d = 0
arcpy.AddMessage("loop iteration " + str(i))
#and again we go..
arcpy.Near_analysis(feature, feature)
cur = arcpy.UpdateCursor(feature)
row = cur.next()
e: algo de edición para una mejor comprensión de las cosas que ha hecho.