Shapefile 到 Topojson 的转换
Shapefile to Topojson conversion
我正在尝试转换可以找到的 Ghana admin1 shapefile here. My end goal is to obtain a TopoJSON as described in this question。
我在 Linux 机器上使用过这个命令:
ogr2ogr -f GeoJSON GHA_adm1.json GHA_adm1.shp
它returns这个:
Unable to open datasource `GHA_adm1.shp' with the following drivers.
... here goes a long list of drivers...
我是不是做错了什么?我应该安装其他 "drivers" 吗?但是怎么办?谢谢
在这里工作得很好:
GDAL 1.11.1, released 2014/09/24
也许您是 运行 GDAL 的过时版本?您可以使用以下命令检查您的版本:ogr2ogr --version
下载 GIS 源
GADM 是管理 GIS 文件的完美来源。
GADM.org > Download page : select your country and format "shapefile" > ok.
或通过终端(将新加纳代码 GHA
替换为目标国家/地区的 iso 代码):
# 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 to topojson
使用topojson command line,更直接。如果您想保留所有属性:
topojson -q 1e4 \
-o out.json \
-- in1.shp in2.shp
您还可以 select 来自 shapfile 的属性,并随时重命名它们:
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
检查json
使用http://jsoneditoronline.org . Inspecting your json will give you clues of what data is available, and where (dot notation path). The topojson distillery帮助预览任何拓扑json以及代码是否正确。
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>
专注
正确的自动对焦需要来自 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
我正在尝试转换可以找到的 Ghana admin1 shapefile here. My end goal is to obtain a TopoJSON as described in this question。 我在 Linux 机器上使用过这个命令:
ogr2ogr -f GeoJSON GHA_adm1.json GHA_adm1.shp
它returns这个:
Unable to open datasource `GHA_adm1.shp' with the following drivers.
... here goes a long list of drivers...
我是不是做错了什么?我应该安装其他 "drivers" 吗?但是怎么办?谢谢
在这里工作得很好:
GDAL 1.11.1, released 2014/09/24
也许您是 运行 GDAL 的过时版本?您可以使用以下命令检查您的版本:ogr2ogr --version
下载 GIS 源
GADM 是管理 GIS 文件的完美来源。
GADM.org > Download page : select your country and format "shapefile" > ok.
或通过终端(将新加纳代码 GHA
替换为目标国家/地区的 iso 代码):
# 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 to topojson
使用topojson command line,更直接。如果您想保留所有属性:
topojson -q 1e4 \
-o out.json \
-- in1.shp in2.shp
您还可以 select 来自 shapfile 的属性,并随时重命名它们:
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
检查json
使用http://jsoneditoronline.org . Inspecting your json will give you clues of what data is available, and where (dot notation path). The topojson distillery帮助预览任何拓扑json以及代码是否正确。
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>
专注
正确的自动对焦需要来自 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