利⽤Python实现Shp格式向GeoJSON的转换!
⼀、简介
Shp格式是GIS中⾮常重要的数据格式,主要在Arcgis中使⽤,但在进⾏很多基于⽹页的空间数据可视化时,通常只接受GeoJSON格式的数据,众所周知JSON(JavaScript Object Nonation)是利⽤键值对+嵌套来表⽰数据的⼀种格式,以其轻量、易解析的优点,被⼴泛使⽤与各种领域,⽽GeoJSON就是指在⼀套规定的语法规则下⽤JSON格式存储⽮量数据,本⽂就将针对GeoJSON的语法规则,以及如何利⽤Python完成Shp格式到GeoJSON格式的转换进⾏介绍。Python学习交流:1004391443
⼆、Shp转GeoJSON
2.1 GeoJSON格式说明
GeoJSON本质依旧是JSON,其基本格式如下:
{
"type": "FeatureCollection",
"features": []
}
⼀个完整的GeoJSON⽂件最外层为⼀个字典,把整个GeoJSON⽂件看做⾃顶向下的树状结构的话,其根⽬录包含键值对"type":"FeaturesCollection" ,以及存放所有要素的键值对 "features":[] ,所有⽮量要素都存放在这个列表中,每个要素都是⼀个字典,下⾯我们来认识⼀下各种⽮量要素在GeoJSON中的规范格式:
点要素(Point):
对于单个点要素,其格式如下:
{"type":"Feature",
"properties":{value1,value2},
"geometry":{
"type":"Point",
"coordinates":[经度,纬度]
}
}
其中properties对应的值为这个要素对应的属性表中按顺序存放的值,geometry对应的值中type指明了要素类型,coordinates传⼊⼀个包含两个元素的列表,第⼀个元素代表经度,第⼆个元素代表纬度。
多点要素(MultiPoint):
多点要素是点要素的特殊情况,其geometry下的type属性传⼊"MultiPoint",其coordinates属性传⼊的是⼀个⼆维列表,其最内层列表定义了每个点的经纬度,如下:
{"type":"Feature",
"properties":{value1,value2},
"geometry":{
"type":"MultiPoint",
"coordinates":[[经度1,纬度1],
[经度2,纬度2]
]
exports is not defined}
}
线要素(LineString):
线要素记录的是⼀条线上所有折点的经纬度信息,只需要按顺序连接这些折点就可以还原⼀条线的形态,在GeoJSON中线要素与多点要素在coordinates属性上格式相同,区别在于geometry属性需要传⼊"LineString",如下:
{"type":"Feature",
"properties":{value1,value2},
"geometry":{
"type":"LineString",ajaxget和post区别
"coordinates":[[经度1,纬度1],
[经度2,纬度2],
[经度3,纬度3],
[经度4,,纬度4]]
}
}
多线要素(MultiLineString):
多线要素是多个线要素的组合,因此其coordinates传⼊三维列表,来组合多条线,对应的geometry下type属性为"MultiLineString",如下:
{"type":"Feature",
"properties":{value1,value2},
"geometry":{
"type":"MultiLineString",
"coordinates":
[
[
[经度1,纬度1],
[经度2,纬度2],
[经度3,纬度3],
[经度4,纬度4]
],
[
[经度5,纬度5],
[经度6,纬度6]
]
]
}
}
多边形要素(Polygon):
多边形要素记录了构成⼀个多边形所有边缘折点的经纬度信息,其coordinates属性传⼊"Polygon",其geometry下type属性格式为三维列表,其第三层列表中嵌套的所有列表记录的经纬度按顺序连接即构成了⼀个多边形,但需要注意的是,多边形头尾折点的经纬度需要相同,才能构成⼀个闭合的多边形,如下:
{"type":"Feature",
disabled in bbs order"properties":{value1,value2},
"geometry":{
"type":"Polygon",
"coordinates":[
[
[经度1,纬度1],
[经度2,纬度2],
[经度3,纬度3],
[经度4,纬度4],
[经度1,纬度1]
]
]
}
}
多多边形要素(MultiPolygon):
多多边形的格式为四维列表,其geometry下type属性传⼊"MultiPloygon",由于多多边形要素中存在⼏种特殊情况,下⾯我们在geojson.io中进⾏对应GeoJSON数据的可视化以便于理解:
互不重叠的两个多边形:
下⾯是互不重叠的两个多边形的⽰例:
对应的GeoJSON数据如下:
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "MultiPolygon",
"coordinates":
[
[
[
[102.74414062499999,36.217687122250574],
[102.7001953125,35.585851593232356],
[104.8590087890625,35.496456056584165],
[104.96337890625,36.24427318493909],
[102.74414062499999,36.217687122250574]
]
]
,
[
[
爬虫可以爬取哪些数据[102.6397705078125,35.074964853989556],
[103.0352783203125,34.23905366851639],
[105.00732421875,34.24813554589752],
[105.3973388671875,35.77771427205079],
[104.556884765625,35.05698043137265],
[102.711181640625,35.16931803601131],
[102.6397705078125,35.074964853989556]
python解析json文件]
]
]
}
}
优选资源网可以看到在多个多边形不重叠时,直接将两个多边形要素对应的三维列表存放在最外层列表下即可。互有重叠的两个多边形:
互有重叠的多个多边形要素格式同多个不重叠的多边形,效果如下:
对应的GeoJSON数据如下:
"type": "MultiPolygon",
"coordinates": [
[
[
[101.6455078125,27.68352808378776],
[114.78515624999999,27.68352808378776],
[114.78515624999999, 35.209721645221386],
[101.6455078125,35.209721645221386],
[101.6455078125,27.68352808378776]
]
],
[
[
[104.2822265625,30.107117887092357],
[108.896484375,30.107117887092357],
[108.896484375,33.76088200086917],
[104.2822265625,33.76088200086917],
[104.2822265625,30.107117887092357]
]
]
]
}
}
有孔的多边形:
有孔的多边形在类别上也是归类到MultiPolygon,下⾯是⼀个⽰例:
对应的GeoJSON数据如下,可以看出其与多个重叠的多边形的区别在于多边形⽮量信息嵌套在第⼆层列表中:
"type": "MultiPolygon",
"coordinates":
[
[
[
[101.6455078125,27.68352808378776],
[114.78515624999999,27.68352808378776],
[114.78515624999999,35.209721645221386],
[101.6455078125,35.209721645221386],
[101.6455078125,27.68352808378776]
],
[
[104.2822265625,30.107117887092357],
[108.896484375,30.107117887092357],
[108.896484375,33.76088200086917],
[104.2822265625,33.76088200086917],
[104.2822265625,30.107117887092357]
]
]
]
}
}
2.2 将Shp格式转换为GeoJSON
在2.1中我们较为详细的了解到⽮量数据在GeoJSON数据中具体的表现形式,通过下⾯的⾃编函数,以Shp⽂件名称(去除⽂件拓展名)、Shp⽂件编码、GeoJSON⽂件编码为输⼊参数:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论