EDITAR He editado la pregunta porque el OP especificó que está trabajando con shapefiles de puntos (el enfoque será similar al original, sin embargo).
Propongo un enfoque que sólo recurre a un generador de geometría y a una función personalizada.
Contexto
Supongamos partir de esta capa vectorial puntual que representa las piedras:
La capa almacena los identificadores de clase en el archivo "CLASS_ID"
campo.
Solución
Ir a Layer Properties | Style
y luego:
- Elija el
Categorized
renderizador;
- Seleccione
"CLASS_ID"
(o el que desee para su situación), sin necesidad de hacer clic en el campo Classify
botón;
- Haga clic en el botón
Change
para el Symbol
opción.
Desde el Symbol selector
elija un Geometry generator
como tipo de capa de símbolos y Point / MultiPoint
como tipo de geometría. A continuación, haga clic en el botón Function Editor
ficha:
A continuación, haga clic en New file
y escriba show
como nombre de la nueva función:
Verá que se ha creado una nueva función y que aparece en la parte izquierda del cuadro de diálogo. Ahora, haga clic en el nombre de la función y sustituya el valor por defecto @qgsfunction
con el siguiente código (no elimine las bibliotecas importadas por defecto):
@qgsfunction(args='auto', group='Custom')
def set_dist(distance, layer_name, geom, curr_feat, feature, parent):
layer = QgsMapLayerRegistry.instance().mapLayersByName(layer_name)[0]
buffered_geom = geom.buffer(distance, -1)
req = QgsFeatureRequest().setFilterRect(buffered_geom.boundingBox())
show = 1
for feat in layer.getFeatures(req):
inGeom = feat.geometry()
if feat.id() != curr_feat.id() and buffered_geom.intersects(inGeom):
return False
break
return True
Una vez hecho esto, haga clic en el botón Load
y podrá ver la función desde el botón Custom
Menú del Expression
diálogo.
Ahora, escriba esta expresión (vea la imagen de abajo como referencia):
CASE
WHEN
show(10, @layer_name, $geometry, $currentfeature)
THEN
$geometry
END
Acabas de ejecutar una función que dice, de forma imaginaria:
" Para la capa actual ( @nombre_capa ), visualizar la geometría ( $geometría ) de la característica actual ( $característicaactual ) metros de cualquier otro elemento de la misma capa".
Lo único que tiene que cambiar es el valor de investigación para la visualización, que en su caso debería ser 0,002 si está utilizando un SIR proyectado. Por lo tanto, deje los demás parámetros de la función como se proporcionan.
Si desea establecer símbolos SVG para las piedras, vaya a Relleno simple y seleccione la opción adecuada:
Por último, vuelva al Style
y haga clic en el botón Classify
(¡por fin!) para fijar los cambios.
Verá que algunas piedras no se renderizan (en la siguiente imagen también he informado de una capa intermedia de 10 metros en aras de la claridad):
0 votos
Por favor, eche un vistazo a mi respuesta. No la he probado a fondo, pero parece que funciona (espero que no entre en conflicto con los símbolos SVG). Avísame si hay algún problema.
0 votos
¿Cómo decidirá cuál mostrar? Si hay dos: una a la izquierda y otra a la derecha, ¿cuál debe mostrarse? ¿La más grande?
0 votos
@Fezter No sé si tu comentario va por mí pero, en mi planteamiento, no hago elecciones. Si hay dos piedras, una a la izquierda, otra a la derecha, se mostrarán si sus buffers no intersecan a la otra piedra correspondiente; en caso contrario, no se mostrarán las dos (ya que la condición debe verificarse o no para ambas piedras a la vez).
0 votos
@mgri oh ya veo.