7 votos

Pérdida de datos durante la conversión de PostGIS Geom a GeoJson y luego a PostGIS Geom

Necesito convertir datos geométricos de PostGIS a formato GeoJSON y posteriormente volver a convertirlos a PostGIS.

Sin embargo, observo que para algunos datos, las conversiones hacen que los datos no sean válidos... Especialmente con "ST_IsValidDetail".

Ejemplo :

cur.execute('select geom from xxx where id = \'yyy\';')
val = cur.fetchone()
print(val)

cur.execute('''select * from ST_IsValidDetail('{}')'''.format(val['geom']))
val = cur.fetchone()
print(val)

cur.execute('''select ST_AsGeoJSON(1, geom, 25, 4) from xxx where id = 'xxx';''')
val = cur.fetchone()
print(val)

cur.execute('''select ST_Force2D(ST_GeomFromGeoJSON('{}')) as geom;'''.format(val[0]))
val = cur.fetchone()
print(val)

cur.execute('''select * from ST_IsValidDetail('{}')'''.format(val['geom']))
val2 = cur.fetchone()
print(val2)

Me sale..:

['01060000206A08000001000000010300000001000000360000008FC2F5286B6412417D3F358EF0145A41DBF97E6A7B6412411B2FDDBCF3145A4146B6F37D8A6412412DB29DEFF6145A41D9CEF753A5641241A245B6FBF8145A4196438BECFD641241295C8F8AFA145A41F6285C0F4A6512418D976E72FB145A412731082C4A65124121B07270FB145A41C74B370950651241DBF97E4AFB145A41EA263108886512416991ED1CF7145A411B2FDD2489651241DD240609F7145A41AAF1D24D9B651241FA7E6AC4F5145A41B4C876BE9B651241CBA145AEF5145A414260E5D09B651241273108ACF5145A410AD7A370D1651241736891E5F2145A41F6285C0FD1651241FED47829F2145A41DF4F8D97BD651241653BDF97F1145A418D976E92BD651241DF4F8D97F1145A416BBC7493BD6512412DB29D97F1145A4117D9CE77BE6512417593187CF1145A416DE7FBA9E7651241DD2406B9F1145A41105839344C661241CBA145B6EC145A41AC1C5A64B36612419418044EE7145A41E3A59BC402671241B6F3FDD4E3145A41B4C8763EF666124117D9CECFE2145A412731082CF76612419A9999C1E2145A41713D0AD7C9661241560E2D42DF145A41295C8FC2C9661241A69BC440DF145A419A9999195166124139B4C88ED6145A412FDD24862B661241D578E966D3145A41AAF1D2CD1A6612410AD7A310D2145A4160E5D02208661241295C8F92D0145A4177BE9F9AD26512413CDF4F35CC145A419A999999D26512413CDF4F35CC145A41CBA145B6B3651241BD7493B0C9145A4154E3A51B48651241448B6C57D0145A413108AC1C48651241448B6C57D0145A4154E3A51B4865124192ED7C57D0145A41250681157965124154E3A59BD3145A41B29DEFA7FE641241BF9F1A0FDD145A41508D97EE1465124196438BFCE2145A4121B0726812651241D34D62C8E4145A416991ED7C05651241448B6CE7E5145A41F4FDD478056512412DB29DE7E5145A4110583934FD64124185EB5198E5145A4189416065E46412418D976EAAE4145A4121B07268E464124177BE9FAAE4145A414A0C022BE4641241713D0AA7E4145A4115AE47E1E36412412FDD24AEE4145A41A69BC4A0C9641241D122DBC9E6145A419A9999999A64124190C2F590EA145A41A8C64BB787641241EE7C3F15EC145A41333333337A641241EC51B8DEEC145A41DF4F8D1760641241A245B663EE145A418FC2F5286B6412417D3F358EF0145A41']
[True, None, None]
['{"type":"MultiPolygon","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::2154"}},"coordinates":[[[[301338.79,6837186.222],[301342.854,6837198.951],[301346.623,6837211.744],[301353.332,6837219.933],[301375.481,6837226.165],[301394.515,6837229.788],[301394.543,6837229.757],[301396.009,6837229.164],[301410.008,6837212.452],[301410.286,6837212.141],[301414.826,6837207.069],[301414.936,6837206.723],[301414.954,6837206.688],[301428.36,6837195.587],[301428.265,6837192.648],[301423.398,6837190.373],[301423.393,6837190.368],[301423.394,6837190.369],[301423.617,6837189.939],[301433.916,6837190.891],[301459.051,6837170.848],[301484.848,6837149.219],[301504.692,6837135.328],[301501.561,6837131.247],[301501.793,6837131.025],[301490.46,6837117.034],[301490.44,6837117.012],[301460.275,6837082.231],[301450.881,6837069.608],[301446.701,6837064.26],[301442.034,6837058.29],[301428.651,6837040.833],[301428.65,6837040.833],[301420.928,6837030.759],[301394.027,6837057.366],[301394.028,6837057.366],[301394.027,6837057.367],[301406.271,6837070.432],[301375.664,6837108.236],[301381.233,6837131.946],[301380.602,6837139.131],[301377.372,6837143.616],[301377.368,6837143.619],[301375.301,6837142.38],[301369.099,6837138.663],[301369.102,6837138.666],[301369.042,6837138.61],[301368.97,6837138.721],[301362.407,6837147.154],[301350.65,6837162.265],[301345.929,6837168.332],[301342.55,6837171.48],[301336.023,6837177.558],[301338.79,6837186.222]]]]}']
['01060000206A08000001000000010300000001000000360000008FC2F5286B6412417D3F358EF0145A41DBF97E6A7B6412411B2FDDBCF3145A4146B6F37D8A6412412DB29DEFF6145A41D9CEF753A5641241A245B6FBF8145A4196438BECFD641241295C8F8AFA145A41F6285C0F4A6512418D976E72FB145A412731082C4A65124121B07270FB145A41C74B370950651241DBF97E4AFB145A41E9263108886512416891ED1CF7145A411B2FDD2489651241DD240609F7145A41AAF1D24D9B651241FA7E6AC4F5145A41B4C876BE9B651241CBA145AEF5145A414260E5D09B651241273108ACF5145A410AD7A370D1651241736891E5F2145A41F6285C0FD1651241FED47829F2145A41DF4F8D97BD651241643BDF97F1145A418D976E92BD651241DF4F8D97F1145A416ABC7493BD6512412DB29D97F1145A4117D9CE77BE6512417593187CF1145A416DE7FBA9E7651241DD2406B9F1145A41105839344C661241CBA145B6EC145A41AC1C5A64B36612419318044EE7145A41E3A59BC402671241B6F3FDD4E3145A41B4C8763EF666124117D9CECFE2145A412731082CF76612419A9999C1E2145A41713D0AD7C9661241560E2D42DF145A41295C8FC2C9661241A69BC440DF145A419A9999195166124139B4C88ED6145A412FDD24862B661241D578E966D3145A41AAF1D2CD1A6612410AD7A310D2145A4160E5D02208661241295C8F92D0145A4177BE9F9AD26512413BDF4F35CC145A419A999999D26512413BDF4F35CC145A41CBA145B6B3651241BC7493B0C9145A4154E3A51B48651241448B6C57D0145A413108AC1C48651241448B6C57D0145A4154E3A51B4865124191ED7C57D0145A41250681157965124154E3A59BD3145A41B29DEFA7FE641241BE9F1A0FDD145A41508D97EE1465124196438BFCE2145A4121B0726812651241D34D62C8E4145A416891ED7C05651241448B6CE7E5145A41F4FDD478056512412DB29DE7E5145A4110583934FD64124185EB5198E5145A4189416065E46412418D976EAAE4145A4121B07268E464124177BE9FAAE4145A414A0C022BE4641241713D0AA7E4145A4114AE47E1E36412412FDD24AEE4145A41A69BC4A0C9641241D122DBC9E6145A419A9999999A6412418FC2F590EA145A41A8C64BB787641241EE7C3F15EC145A41333333337A641241EC51B8DEEC145A41DF4F8D1760641241A245B663EE145A418FC2F5286B6412417D3F358EF0145A41']
[False, 'Self-intersection', '01010000006BBC7493BD6512412DB29D97F1145A41']

¿Alguien tiene una idea de cómo manejar esto?

1 votos

Creo que es probablemente un problema de precisión. Prueba a utilizar ST_SnapToGrid antes de ST_ AsGeoJSON.

0 votos

Acabo de probar : select ST_AsGeoJSON(1, ST_SnapToGrid(geom, 0.0001), 25, 4) y el mismo error :(

0 votos

La espiga que da problemas tiene 1,4 mm de longitud y el intervalo de encaje 0,0001 puede ser demasiado ajustado. Pruebe con 0,001. Es un poco difícil prever lo que sucede para las auto-intersecciones con snap porque afecta a todos los vértices.

11voto

Joe Puntos 16

Hay un pico de 1,4 mm de longitud en la geometría WKB original con un vértice que casi cruza el anillo, pero no lo hace y la geometría es válida.

Ubicación de la espiga

enter image description here

Pico medido

enter image description here

El viaje de ida y vuelta de la geometría a GeoJSON está cambiando ligeramente las coordenadas del vértice

Before: 301423.39400000003 6837190.369
After:  301423.394         6837190.369

El vértice se ha desplazado 0,00000000003 metros hacia el este pero es suficiente para hacer una auto-intersección.

Una forma de hacer válida esta última geometría es simplificarla primero con una tolerancia de 1 cm. Esto devuelve true:

select ST_IsValid(
ST_Simplify('01060000206A08000001000000010300000001000000360000008FC2F5286B6412417D3F358EF0145A41DBF97E6A7B6412411B2FDDBCF3145A4146B6F37D8A6412412DB29DEFF6145A41D9CEF753A5641241A245B6FBF8145A4196438BECFD641241295C8F8AFA145A41F6285C0F4A6512418D976E72FB145A412731082C4A65124121B07270FB145A41C74B370950651241DBF97E4AFB145A41E9263108886512416891ED1CF7145A411B2FDD2489651241DD240609F7145A41AAF1D24D9B651241FA7E6AC4F5145A41B4C876BE9B651241CBA145AEF5145A414260E5D09B651241273108ACF5145A410AD7A370D1651241736891E5F2145A41F6285C0FD1651241FED47829F2145A41DF4F8D97BD651241643BDF97F1145A418D976E92BD651241DF4F8D97F1145A416ABC7493BD6512412DB29D97F1145A4117D9CE77BE6512417593187CF1145A416DE7FBA9E7651241DD2406B9F1145A41105839344C661241CBA145B6EC145A41AC1C5A64B36612419318044EE7145A41E3A59BC402671241B6F3FDD4E3145A41B4C8763EF666124117D9CECFE2145A412731082CF76612419A9999C1E2145A41713D0AD7C9661241560E2D42DF145A41295C8FC2C9661241A69BC440DF145A419A9999195166124139B4C88ED6145A412FDD24862B661241D578E966D3145A41AAF1D2CD1A6612410AD7A310D2145A4160E5D02208661241295C8F92D0145A4177BE9F9AD26512413BDF4F35CC145A419A999999D26512413BDF4F35CC145A41CBA145B6B3651241BC7493B0C9145A4154E3A51B48651241448B6C57D0145A413108AC1C48651241448B6C57D0145A4154E3A51B4865124191ED7C57D0145A41250681157965124154E3A59BD3145A41B29DEFA7FE641241BE9F1A0FDD145A41508D97EE1465124196438BFCE2145A4121B0726812651241D34D62C8E4145A416891ED7C05651241448B6CE7E5145A41F4FDD478056512412DB29DE7E5145A4110583934FD64124185EB5198E5145A4189416065E46412418D976EAAE4145A4121B07268E464124177BE9FAAE4145A414A0C022BE4641241713D0AA7E4145A4114AE47E1E36412412FDD24AEE4145A41A69BC4A0C9641241D122DBC9E6145A419A9999999A6412418FC2F590EA145A41A8C64BB787641241EE7C3F15EC145A41333333337A641241EC51B8DEEC145A41DF4F8D1760641241A245B663EE145A418FC2F5286B6412417D3F358EF0145A41',0.01));

Pero también hay una fucnión que está hecha sólo para este propósito: https://postgis.net/docs/ST_MakeValid.html

0 votos

funciona perfectamente :) ¡gracias!

0 votos

He editado mi pregunta y he añadido un enlace en ST_MakeValid que debería ser la opción principal.

0 votos

Me alegro de que tengas una respuesta. En mi experiencia ST_MakeValid no siempre funciona si tienes precisión espuria, mientras que ST_SnapToGrid y ST_Simplify generalmente lo hacen, aunque en realidad estás cambiando las geometrías subyacentes como dice @user30184.

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