本文介绍了Shapefile到Topojson的转换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试转换可以在此处.我的最终目标是获得此问题中所述的TopoJSON.我已经在Linux机器上使用了以下命令:

I am trying to convert the Ghana admin1 shapefile that can be found here. My end goal is to obtain a TopoJSON as described in this question.I have used this command on a Linux machine:

ogr2ogr -f GeoJSON GHA_adm1.json GHA_adm1.shp

它返回此:

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

我做错什么了吗?我应该安装其他驱动程序"吗?但是如何?谢谢.

I am I doing something wrong? Should I install other "drivers"? But how? Thanks.

推荐答案

下载GIS源

GADM是管理GIS文件的理想来源.

Download the GIS source

GADM is the perfect source for administrative GIS files.

或通过终端(用目标国家/地区的iso代码替换新加纳代码GHA):

Or via terminal (replace New Ghana code GHA by your target country's iso code):

# 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到topojson

使用 topojson命令行,它更直接.如果要保留所有属性:

shp to topojson

Use topojson command line, it's more direct. If you want to keep all properties :

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

您还可以从shapfiles中选择属性,并随时对其进行重命名:

You can also select attributes from the shapfiles, and rename them on the go :

 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

对于GHA,.shp中没有适合良好ID的属性. NAME_1包含空格,这些空格将在HTML中给出无效的id.

For GHA, there is no attribute in the .shp suitable for a good ID. NAME_1 have spaces which will give invalid id within your HTML.

使用 http://jsoneditoronline.org .检查您的json将为您提供可用数据以及位置(点符号路径)的线索. topojson酿酒厂帮助预览任何topojson以及代码是否正确.

Use http://jsoneditoronline.org . Inspecting your json will give you clues of what data is available, and where (dot notation path). The topojson distillery help to preview any topojson and if the code is correct.

<!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>

焦点

正确的自动对焦将需要 Mike Bostocks 中的一小段代码,例如:

Focus

A correct autofocus will need a small bit of code from Mike Bostocks, example here:

// 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);


编辑:应该立即运行.实时演示: bl.ocks.org


Should work now. Live demo: bl.ocks.org

这篇关于Shapefile到Topojson的转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-12 10:51