4 votos

Registros inesperados añadido después de la unión espacial

En la siguiente unión espacial, quiero unirme pd_subdistricts a parcel y mantener tanto la coincidencia y unmatching registros. Desde parcel ha 292,109 registros, el resultado debe haber la misma cantidad exacta, dado que las geometrías son válidos. Después de hacer las geometrías válido, obtengo un resultado inesperado. La salida - test tiene 249 más registros de los que parcel ¿Cómo es esto posible?

He realizado exactamente la misma consulta para unirse a otras mesas y la cantidad de registros es siempre igual a parcel

Input   parcel          has 292,109 records
Input   pd_subdistricts has 1,083 records
Output  test            has 292,358 records 

Con esta consulta,

CREATE TABLE test AS
SELECT t.*
FROM parcel AS t
LEFT JOIN pd_subdistricts AS m
  ON ST_Within(t.geom, m.geom)

6voto

jlehenbauer Puntos 7749

Desde la parcela se ha 292109 registros, el resultado debe haber la misma cantidad exacta, dado que las geometrías son válidos.

Que no es como un LEFT OUTER JOIN obras. A partir de la documentación

LEFT OUTER JOIN en Primer lugar, una combinación interna se lleva a cabo. A continuación, para cada fila en T1 que no cumplen la condición de combinación con cualquier fila en T2, se unió a la fila se agrega con valores nulos en las columnas de T2. Por lo tanto, la tabla combinada siempre tiene al menos una fila para cada fila de la T1.

Así que primero un INNER JOIN se realiza,

INNER JOIN para cada fila R1 T1, se unió a la tabla tiene una fila para cada fila en T2 que satisface la condición de combinación con R1.

Y, ese es su problema.

LEFT JOIN pd_subdistricts AS m
  ON ST_Within(t.geom, m.geom)

Ahora, echemos un vistazo a ST_Within Por lo ST_Within(t.geom, m.geom) evaluará cierto para cada fila tal que t.geom encaja en m.geom, pero ¿qué pasa si una t.geom encaja en varios m.geom(s)? Imaginen esto,

  1. t.geom es Houston.
  2. Estos tres casos
    1. m.geom representa Texas
    2. m.geom representa United States
    3. m.geom representa North America

Ahora para cada uno de los tres casos ST_Within devolverá true. Así que con una fila en su t.geom (en representación de Houston) tendrá tres filas en su salida (en representación de Houston está dentro de los tres lugares mencionados anteriormente).

Usted puede encontrar las distintas t.geoms el uso de

SELECT DISTINCT ON(t.geom) t.*
FROM parcel AS t
LEFT JOIN pd_subdistricts AS m
  ON ST_Within(t.geom, m.geom)

Usted puede encontrar los duplicados usando esto.

SELECT t.geom, count(*)
FROM parcel AS t
LEFT JOIN pd_subdistricts AS m
  ON ST_Within(t.geom, m.geom)
GROUP BY t.geom
HAVING count(*) > 1;

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X