Tengo un archivo CSV llamado office_locations.csv
que contiene datos de puntos. Quiero cargar en un Servidor SQL server base de datos geoespacial mediante ogr2ogr.
El archivo CSV está codificado en UTF-8. Contiene un encabezado y 14902 registros.
Las primeras líneas de este aspecto:
Id,Name,Lat,Lng,CountryCode,Address,CityName,Airport,AirportCode,RailwayStation,PostalCode,StateCode,StateProv,Country_Id
"7188","Tirana Airport","41.42108838","19.71271276","AL","Tirana Airport Muhamet Gjollesha Str., Muhamet Gjollesha Str., Tirana","Tirana","1","TIA","0","","","",0
"30768","Tirana Downtown","41.332","19.832","AL","Rruga E Durresit. Nr 61, Tirana","Tirana","0","","0","","","",0
"52400","Sheraton Italia Square","0.0","0.0","AL","Square Italia Hotel Sheraton , Tirana,","Tirana","0","","0","","","",0
"4650","Escaldes","42.511","1.548","AD","Avda. Miquel Mateu, 25, Escaldes-engordany , Andorra, Ad700","Andorra","0","","0","AD700","","",1
"152576","Andorra","42.508","1.522","AD","Avda D Enclar, 142, Andorra La Vella, Ad500","Andorra La Vella","0","","0","AD500","","",1
Estoy trabajando en una estación de trabajo Windows 7.
Mi GDAL versión 1.9.2.
ogr2ogr importar registros de salta
Para importar datos CSV utilizando ogr2ogr usted necesita para crear un archivo VRT. He creado uno que se parece a esto:
<OGRVRTDataSource>
<OGRVRTLayer name="office_locations">
<SrcDataSource>office_locations.csv</SrcDataSource>
<GeometryType>wkbPoint</GeometryType>
<LayerSRS>WGS84</LayerSRS>
<GeometryField encoding="PointFromColumns" x="Lng" y="Lat"/>
</OGRVRTLayer>
</OGRVRTDataSource>
Cuando yo uso el archivo VRT, ogr2ogr sólo lee y escribe 4977 características:
$ ogr2ogr --debug ON -overwrite -f MSSQLSpatial "MSSQL:server=.;database=OfficeImport;trusted_connection=yes" office_locations.vrt
OGR: OGROpen(office_locations.vrt/02F28328) succeeded as VRT.
OGR_MSSQLSpatial: EstablishSession(Connection:"server=.;database=OfficeImport;trusted_connection=yes")
ODBC: SQLDriverConnect(DRIVER=SQL Server;server=.;database=OfficeImport;trusted_connection=yes)
OGR: OGROpen(MSSQL:server=.;database=OfficeImport;trusted_connection=yes/02F3CFB8) succeeded as MSSQLSpatial.
OGR: OGROpen(office_locations.csv/02F3C808) succeeded as CSV.
OGR_MSSQLSpatial: Using column ogr_fid as FID for table office_locations.
OGR2OGR: 4977 features written in layer 'office_locations'
ODBC: SQLDisconnect()
VRT: 4977 features read on layer 'office_locations'.
CSV: 4977 features read on layer 'office_locations'.
Dos tercios de los de los registros han sido silenciosamente saltado!
Encontrar los registros que faltan
En la columna id en el archivo CSV contiene un identificador único para cada oficina. Puedo ordenar por que para encontrar los registros que faltan.
Para ordenar las filas en la base de datos he utilizado un comando como este:
$ sqlcmd -d OfficeImport -Q "SELECT id, name FROM office_locations ORDER BY CAST(id AS INT);" | more
id name
---- -------------------------------------------------------
11 Dublin - Airport
21 Dublin - Finglas
36 Brussels - Charleroi Airport
42 Crete - Chania Marna
79 Lesvos - Airport
83 Corfu - New Port
[...]
Para ordenar las filas en la hoja de cálculo que utiliza Excel 2010 es una Especie característica de la ficha Datos.
Descubrí que la oficina de 47 es la primera falta de registro:
"47","Fuerteventura - Airport","28.452","-13.87","ES","Aeropuerto Fue L.7, El Matorral.pto Del Rosario, Fuerteventura, 35610","Fuerteventura","1","FUE","0","35610","","",136
El aislamiento de la fila omitida
He creado un nuevo archivo CSV llamado test_import.csv
que contiene sólo la oficina de 47 y un encabezado:
Id,Name,Lat,Lng,CountryCode,Address,CityName,Airport,AirportCode,RailwayStation,PostalCode,StateCode,StateProv,Country_Id
"47","Fuerteventura - Airport","28.452","-13.87","ES","Aeropuerto Fue L.7, El Matorral.pto Del Rosario, Fuerteventura, 35610","Fuerteventura","1","FUE","0","35610","","",136
Y un nuevo VRT llamado test_import.vrt
que se parece a esto:
<OGRVRTDataSource>
<OGRVRTLayer name="test_import">
<SrcDataSource>test_import.csv</SrcDataSource>
<GeometryType>wkbPoint</GeometryType>
<LayerSRS>WGS84</LayerSRS>
<GeometryField encoding="PointFromColumns" x="Lng" y="Lat"/>
</OGRVRTLayer>
</OGRVRTDataSource>
ogr2ogr la salida de depuración muestra que 1 función se leen y se escriben:
$ ogr2ogr --debug ON -overwrite -f MSSQLSpatial "MSSQL:server=.;database=Argus;trusted_connection=yes" test_import.vrt
OGR: OGROpen(test_import.vrt/03488318) succeeded as VRT.
OGR_MSSQLSpatial: EstablishSession(Connection:"server=.;database=Argus;trusted_connection=yes")
ODBC: SQLDriverConnect(DRIVER=SQL Server;server=.;database=Argus;trusted_connection=yes)
OGR_MSSQLSpatial: Using column ogr_fid as FID for table argus_locations.
OGR_MSSQLSpatial: Using column ogr_fid as FID for table location.
OGR_MSSQLSpatial: Using column ogr_fid as FID for table location_utf8.
OGR_MSSQLSpatial: Using column ogr_fid as FID for table office_locations.
OGR_MSSQLSpatial: Using column ogr_fid as FID for table test_import.
OGR: OGROpen(MSSQL:server=.;database=Argus;trusted_connection=yes/0349CFA8) succeeded as MSSQLSpatial.
OGR: OGROpen(test_import.csv/0349D868) succeeded as CSV.
MSSQLSpatial: DeleteLayer(test_import)
OGR_MSSQLSpatial: Using column ogr_fid as FID for table test_import.
OGR2OGR: 1 features written in layer 'test_import'
ODBC: SQLDisconnect()
VRT: 1 features read on layer 'test_import'.
CSV: 1 features read on layer 'test_import'.
Esta vez la oficina de 47 es importado, pero la última vez que se ha omitido.
¿Por qué es esta fila se omite en el archivo completo, pero importados en el archivo de prueba?
¿Por qué no ogr2ogr reconoce que las filas se omiten?
Cuántas columnas de cada tabla?
MappaGnosis preguntó: "¿cuántas columnas a la única oficina (47) la importación de la tabla de atributos y cuántos no la original de importación?"
La entrada del archivo CSV tiene 14 columnas:
$ powershell -Command "(Import-Csv -Path 'office_locations.csv' | Get-Member -Type NoteProperty).Count"
14
El original de la tabla de importación se llama office_locations
, y la oficina única de importación de la tabla se llama test_import
. Cada uno tiene 16 columnas:
SELECT
OBJECT_NAME(object_id) AS table_name,
COUNT(*) AS column_count
FROM sys.columns
WHERE object_id IN (OBJECT_ID(N'test_import'), OBJECT_ID(N'office_locations'))
GROUP BY object_id;
table_name column_count
----------------- ------------
office_locations 16
test_import 16
ogr2ogr crea una columna para cada uno de los campos en los archivos CSV, y genera dos columnas adicionales, ogr_fid
y ogr_geometry
.
Importar sólo los identificadores y las coordenadas
Darren hacer Frente sugirió: "se Puede crear un segundo .csv con todos los registros, pero tira a cabo todas las columnas excepto el ID y lat/lon columnas? Intente importar que, y ver si todos los registros de venir. A veces hay un incorrectamente delimitado fila a un lugar que confundir las cosas, y es difícil elegir visualmente..."
He utilizado este comando de PowerShell para la extracción de la id
, lng
y lat
columnas de la office_locations.csv
archivo:
$ powershell -Command "(Import-Csv -Path 'office_locations.csv') | Select Id, Lng, Lat | Export-Csv -NoTypeInformation -Encoding UTF8 -Path 'office_minimal.csv'"
Creó un nuevo archivo CSV llamado office_minimal.csv
. Contiene la cantidad mínima de datos para localizar e identificar cada una de las oficinas.
Las primeras líneas de este aspecto:
"Id","Lng","Lat"
"7188","19.71271276","41.42108838"
"30768","19.832","41.332"
"52400","0.0","0.0"
"4650","1.548","42.511"
"152576","1.522","42.508"
He creado una correspondiente VR archivo llamado office_minimal.vrt
. Se parece a esto:
<OGRVRTDataSource>
<OGRVRTLayer name="office_minimal">
<SrcDataSource>office_minimal.csv</SrcDataSource>
<GeometryType>wkbPoint</GeometryType>
<LayerSRS>WGS84</LayerSRS>
<GeometryField encoding="PointFromColumns" x="Lng" y="Lat"/>
</OGRVRTLayer>
</OGRVRTDataSource>
El uso de la nueva 'mínimo' de los archivos, ogr2ogr las importaciones de todos los 14902 filas:
$ ogr2ogr --debug ON -overwrite -f MSSQLSpatial "MSSQL:server=.;database=OfficeImport;trusted_connection=yes" office_minimal.vrt
OGR: OGROpen(office_minimal.vrt/03388328) succeeded as VRT.
OGR_MSSQLSpatial: EstablishSession(Connection:"server=.;database=OfficeImport;trusted_connection=yes")
ODBC: SQLDriverConnect(DRIVER=SQL Server;server=.;database=OfficeImport;trusted_connection=yes)
OGR_MSSQLSpatial: Using column ogr_fid as FID for table office_locations.
OGR_MSSQLSpatial: Using column ogr_fid as FID for table test_import.
OGR: OGROpen(MSSQL:server=.;database=OfficeImport;trusted_connection=yes/0339CFB8) succeeded as MSSQLSpatial.
OGR: OGROpen(office_minimal.csv/033A0F48) succeeded as CSV.
OGR_MSSQLSpatial: Using column ogr_fid as FID for table office_minimal.
OGR2OGR: 14902 features written in layer 'office_minimal'
ODBC: SQLDisconnect()
VRT: 14902 features read on layer 'office_minimal'.
CSV: 14902 features read on layer 'office_minimal'.