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.