6 votos

conversión ogr2ogr csv con latlon en una columna

Tengo un csv con "lat,lon" en una sola columna. Estoy tratando de convertirlo con ogr2ogr a otro formato, y no puedo averiguar cómo formatear el archivo VRT para aceptar este formato.

De momento no puedo hacer nada más que cambiar el VRT debido a otras limitaciones. Me encantaría reescribir el csv, pero este es el formato con el que tengo que lidiar por ahora.

ejemplo para la formación:

name, date, value, latlon
a, 20130101, 0, "100.8\\,40.2"
b, 20130101, 1, "101.2\\,40.4"
c, 20130102, 1, "100.2\\,41.2"
d, 20130103, 2, "102.0\\,40.7"
e, 20130104, 3, "100.6\\,41.0"

Los datos no tienen un número determinado de caracteres, por lo que la división en un número de caracteres no funciona correctamente.

a, 20130101, 0, "10.844\\,-40.2745"
b, 20130101, 1, "101.2010\\,40.411111"
c, 20130102, 1, "-100.27867\\,1.24522"
d, 20130103, 2, "-1.04577\\,16.745637"
e, 20130104, 3, "100.617417\\,-1.0757"

La respuesta aceptada en realidad no requiere el CSV intermedio, se puede hacer directamente desde el CSV original. El INSTR es lo que he conseguido que funcione.

<OGRVRTDataSource>
    <OGRVRTLayer name="result">
        <SrcDataSource>test2.csv</SrcDataSource>
        <SrcSQL dialect="sqlite">SELECT name, date, value, SUBSTR(latlon,2,INSTR(latlon,"\,")-1) AS lat, SUBSTR(latlon,INSTR(latlon,"\,")+2,-1) AS lon FROM test2</SrcSQL>
    </OGRVRTLayer>
</OGRVRTDataSource>

6voto

Nikola Puntos 21

Se puede resolver con dos archivos VRT encadenados y un poco de OGR SQL. El primer VRT (por ejemplo remapped_csv.vrt ) es:

<OGRVRTDataSource>
    <OGRVRTLayer name="remapped_csv">
        <SrcDataSource>test.csv</SrcDataSource>
        <SrcSQL>SELECT *, SUBSTR(latlon,2,5) AS lat, SUBSTR(latlon,9,12) AS lon FROM test</SrcSQL>
    </OGRVRTLayer>
</OGRVRTDataSource>

El segundo VRT (por ejemplo result.vrt ) es:

<OGRVRTDataSource>
    <OGRVRTLayer name="result">
        <SrcDataSource>remapped_csv.vrt</SrcDataSource>
        <GeometryType>wkbPoint</GeometryType>
        <LayerSRS>WGS84</LayerSRS>
        <GeometryField encoding="PointFromColumns" x="lon" y="lat"/>
        <SrcSQL>SELECT name, date, value, lat, lon FROM remapped_csv</SrcSQL>
    </OGRVRTLayer>
</OGRVRTDataSource>

Este es el resultado final:

>ogrinfo result.vrt result
INFO: Open of `result.vrt'
      using driver `VRT' successful.

Layer name: result
Geometry: Point
Feature Count: 5
Extent: (40.200000, 100.200000) - (41.200000, 102.000000)
Layer SRS WKT:
GEOGCS["WGS 84",
    DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563,
            AUTHORITY["EPSG","7030"]],
        TOWGS84[0,0,0,0,0,0,0],
        AUTHORITY["EPSG","6326"]],
    PRIMEM["Greenwich",0,
        AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.0174532925199433,
        AUTHORITY["EPSG","9108"]],
    AUTHORITY["EPSG","4326"]]
name: String (0.0)
date: String (0.0)
value: String (0.0)
lat: String (0.0)
lon: String (0.0)
OGRFeature(result):1
  name (String) = a
  date (String) =  20130101
  value (String) =  0
  lat (String) = 100.8
  lon (String) = 40.2
  POINT (40.2 100.8)

OGRFeature(result):2
  name (String) = b
  date (String) =  20130101
  value (String) =  1
  lat (String) = 101.2
  lon (String) = 40.4
  POINT (40.4 101.2)

OGRFeature(result):3
  name (String) = c
  date (String) =  20130102
  value (String) =  1
  lat (String) = 100.2
  lon (String) = 41.2
  POINT (41.2 100.2)

OGRFeature(result):4
  name (String) = d
  date (String) =  20130103
  value (String) =  2
  lat (String) = 102.0
  lon (String) = 40.7
  POINT (40.7 102.0)

OGRFeature(result):5
  name (String) = e
  date (String) =  20130104
  value (String) =  3
  lat (String) = 100.6
  lon (String) = 41.0
  POINT (41.0 100.6)

Versión mejorada de remapped_csv.vrt utilizando el dialecto SQLite (SQLite >= 3.7.15, porque el instr fue añadida a las funciones del núcleo de SQLite desde esta versión):

<OGRVRTDataSource>
    <OGRVRTLayer name="remapped_csv">
        <SrcDataSource>test2.csv</SrcDataSource>
        <SrcSQL dialect="sqlite">SELECT *, SUBSTR(latlon,2,INSTR(latlon,"\,")-1) AS lat, SUBSTR(latlon,INSTR(latlon,"\,")+2,-1) AS lon FROM test2</SrcSQL>
    </OGRVRTLayer>
</OGRVRTDataSource>

No lo he probado (porque tengo GDAL construido con SQLite 3.7.9 en este momento), pero debería funcionar.


Esta es una versión de trabajo de remapped_csv.vrt utilizando el enfoque de recorte:

<OGRVRTDataSource>
    <OGRVRTLayer name="remapped_csv">
        <SrcDataSource>test2.csv</SrcDataSource>
        <SrcSQL dialect="sqlite">SELECT *, rtrim(rtrim(latlon,'"+-.0123456789'),'\,') AS lat, ltrim(ltrim(latlon,' "+-.0123456789'),'\,') AS lon FROM test2</SrcSQL>
    </OGRVRTLayer>
</OGRVRTDataSource>

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