1 votos

Convertir puntos en segmentos de línea

En MySQL, tengo dos tablas para almacenar el trackpoint del GPS y una segunda tabla para almacenar los valores del encadenamiento. Las líneas pueden tener más de una condición. Deseo generar segmentos de líneas utilizando las dos tablas anteriores. Por favor, vea las imágenes adjuntas de ambas tablas:

Tabla: Trackpoint

r\_id    chainage    latitude    longitude
5246    0   12.251324   105.984187
5246    5   12.251354   105.984224
5246    6   12.251357   105.984219
5246    8   12.25137    105.984231
5246    9   12.251374   105.984222
5246    9   12.251374   105.984217
5246    9   12.251374   105.984217
5246    10  12.251373   105.984217
5246    17  12.251307   105.984206
5246    38  12.251117   105.984186
5246    42  12.251082   105.984184
5246    60  12.250926   105.984155
5246    88  12.250668   105.98414
5246    125 12.250338   105.984167
5246    129 12.250311   105.984186
5246    133 12.250278   105.984209
5246    138 12.250246   105.984233
5246    189 12.249824   105.984432
5246    275 12.249232   105.984933
5246    389 12.248444   105.985601
5246    475 12.247789   105.986025
5246    493 12.247635   105.986089
5246    503 12.247557   105.986123
5246    622 12.246541   105.986484

y

Tabla: Encadenamiento

R\_ID    Start\_Chainage  End\_Chainage    Condition
5246    0               10              Good
5246    10              50              Bad
5246    50              100             Fair
5246    100             140             Good
5246    140             230             Bad
5246    230             500             Poor
5246    500             627             Good

¿Cómo puedo generar una vista, que capaz de dibujar una línea en QGIS. similar esta road_line_condition.

He probado esto: , pero el resultado no es el esperado.

SELECT
  `t1`.`id`             AS `id`,
  `t1`.`chainage`       AS `chainage`,
  `t2`.`start_chainage` AS `start_chainage`,
  `t2`.`end_chainage`   AS `end_chainage`, 
  `t2`.`condition`    AS `Condition`,
   ST_GeomFromText(CONCAT("LineString(", GROUP_CONCAT(T1.longitude,' ',T1.latitude SEPARATOR ','), ")", ""),4326) AS line_wkt

FROM (`trackpoint` `t1`
   LEFT JOIN `Chainage` `t2`
     ON (`t1`.`r_id` = `t2`.`R_id`))
WHERE t1.`chainage`>=t2.`start_chainage` AND t1.`chainage`<=t2.`end_chainage`
GROUP BY t2.`end_chainage`

1voto

Bebegaming Puntos 1

En primer lugar, no veo la columna ID en sus datos de muestra. Si no la tiene, le sugiero que la añada. Puede comprobar esto enlace para encontrar más información.

Si tienes ID puedes unir el punto a un punto anterior. Aquí hay un ejemplo de SQL. Lo he comprobado y funciona.

SELECT t1.r_id, t1.id, t1.chainage AS t1_chainage, t2.r_id, t2.id, t2.chainage AS 
t2_chainage, c1.condition AS c1_condition, c2.condition AS c2_condition,
    ST_GeomFromText(CONCAT("LineString(", t1.lat,' ',t1.lon,',',t2.lat,' ',t2.lon, ")", ""),4326) AS line_wkt
FROM trackpoint t1
JOIN trackpoint t2 ON t2.id = t1.id-1
JOIN chainage c1 ON c1.r_id = t1.r_id AND t1.chainage >= c1.start_chainage AND t1.chainage < c1.end_chainage
JOIN chainage c2 ON c2.r_id = t2.r_id AND t2.chainage >= c2.start_chainage AND t2.chainage < c2.end_chainage
WHERE t1.id > 1;

En esta selección se une el punto a un punto anterior. El ID del primer punto debe ser mayor que 1 (de ahí la cláusula where). Tienes líneas que caen en diferentes clases de condición. Por eso tienes en la lista de columnas c1_condtion y c2_condition. En base a tus necesidades puedes usar la primera, la segunda o ambas.

Además de su comentario del 8 de mayo de 2020, a continuación se muestra una consulta que devuelve cadenas de líneas agrupadas por condición (condición en el punto final).

SELECT c2.condition, ST_AsText(
  ST_GeomFromText(CONCAT(
    'LineString (',
    GROUP_CONCAT(CONCAT(t2.lat,' ',t2.lon) SEPARATOR ','),
    ')'
  ),4326)
)
FROM trackpoint t1
JOIN trackpoint t2 ON t2.id = t1.id-1
JOIN chainage c1 ON c1.r_id = t1.r_id AND t1.chainage >= c1.start_chainage AND t1.chainage < c1.end_chainage
JOIN chainage c2 ON c2.r_id = t2.r_id AND t2.chainage >= c2.start_chainage AND t2.chainage < c2.end_chainage
GROUP BY c2.condition;

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