Estoy intentando convertir el archivo shapefile admin1 de Ghana que se puede encontrar aquí . Mi objetivo final es obtener un TopoJSON como se describe en esta pregunta. He usado este comando en una máquina Linux:

ogr2ogr -f GeoJSON GHA_adm1.json GHA_adm1.shp

Y devuelve esto:

Unable to open datasource `GHA_adm1.shp' with the following drivers.
... here goes a long list of drivers...

Estoy haciendo algo mal? ¿Debo instalar otros "controladores"? ¿Pero cómo? Gracias.

3
GPierre 17 feb. 2015 a las 10:11

2 respuestas

La mejor respuesta

Descarga la fuente GIS

GADM es la fuente perfecta para archivos administrativos GIS.

GADM.org> Página de descarga: selecciona tu país y formatea "shapefile"> ok.

O a través de la terminal (reemplace el código de New Ghana GHA por el código iso de su país de destino):

# prepare folder
mkdir -p ./map; cd ./map
curl http://d3js.org/d3.v3.min.js -O -J
curl http://d3js.org/topojson.v1.min.js -O -J
# download data
curl \
    -L -C - 'http://biogeo.ucdavis.edu/data/gadm2/shp/GHA_adm.zip' \
    -o ./GHA_adm.zip
unzip -n ./GHA_adm.zip -d ./

Shp a topojson

Use línea de comando topojson, es más directo. Si desea conservar todas las propiedades:

 topojson -q 1e4 \
          -o out.json \
          -- in1.shp in2.shp

También puede seleccionar atributos de los archivos shap y cambiarles el nombre sobre la marcha:

 topojson \
    --bbox \
    --id-property none \
    -p name=NAME_1 \
    -p code=ID_1 \
    -p L0=NAME_0 \
    -q 1e4 \
    --filter=small \
    -o GHA_adm_w.topo.json \
    -- admin_1=GHA_adm1.shp admin_2=GHA_adm2.shp

Para GHA, no hay ningún atributo en el .shp adecuado para una buena ID. NAME_1 tienen espacios que darán un id no válido dentro de su HTML.

enter image description here

Inspeccionar json

Utilice http://jsoneditoronline.org. La inspección de su json le dará pistas sobre qué datos están disponibles y dónde (ruta de notación de puntos). La destilería de topojson ayuda a obtener una vista previa de cualquier topojson y si el código es correcto.

Llamada D3js

<!DOCTYPE html>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<style>
.L1 {
    fill: #E0E0E0;
    stroke: #FFF;
    stroke-width:1px;
}
</style>
<body>
<script src="./d3.v3.min.js"></script>
<script src="./topojson.v1.min.js"></script>
<script>
var mapIt = function(width, url){
    console.log("mapIt(): start");
    var height = width/960*500;
    var svg = d3.select('body').append('svg')
        .attr('width', width)
        .attr('height', height);
    var projection = d3.geo.mercator()
          .scale(1)
          .translate([0, 0]);

    var path = d3.geo.path()
        .projection(projection);

    d3.json(url, function (error, json) {
        var admin_1 = topojson.feature(json, json.objects.admin_1);

        /* Autofocus code comes here ! */

        svg.selectAll("path")
            .data(admin_1.features)
          .enter().append("path")
            .attr('d', path)
            .attr('class', 'L1');
    });    
};
mapIt(960,"http://somesite.org/data/NZL_adm.topo.json");
</script>
</body>
</html>

Atención

Un enfoque automático correcto necesitará un poco de código de Mike Bostocks, ejemplo aquí:

// Compute the bounds of a feature of interest, then derive scale & translate.
var b = path.bounds(admin_1),
    s = .95 / Math.max((b[1][0] - b[0][0]) / width, (b[1][1] - b[0][1]) / height),
    t = [(width - s * (b[1][0] + b[0][0])) / 2, (height - s * (b[1][1] + b[0][1])) / 2];

// Update the projection to use computed scale & translate.
projection
    .scale(s)
    .translate(t);

EDITAR: debería funcionar ahora. Demostración en vivo: bl.ocks.org

6
Community 23 may. 2017 a las 11:54

Funciona perfectamente bien aquí:

GDAL 1.11.1, publicado el 24/09/2014

¿Quizás está ejecutando una versión desactualizada de GDAL? Puede verificar su versión usando: ogr2ogr --version

1
iH8 17 feb. 2015 a las 07:32