GDAL是一个开源的地理工具包,其支持基本所有的地理操作,其有python、java、c等语言包,是地理信息C端开发不可越过的工具,鉴于python语言的简单性,这里使用python中GDAL包来进行shp文件的生成,这里本质是利用ogc地理标准的坐标字符串来生成shp。
第一步:安装GDAL环境,建议下载后,本地安装,注意与python版本号要对应,可参考网上教程。
第二部:代码分析
引入GDAL工具包
import osgeo.ogr as ogr
import osgeo.osr as osr
注册驱动,这里是ESRI Shapefile类型,并设置shp文件名称
driver = ogr.GetDriverByName("ESRI Shapefile")
data_source = driver.CreateDataSource("ceshi.shp")
注入投影信息,这里使用的4326,表示经纬度坐标,根据情况可以自行更改
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)
这里定义的是,生成的要素类型,包括点、线、面
#ogr.wkbPoint 点
#ogr.wkbLineString 线
#ogr.wkbMultiPolygon 面
这里的图层名称要与上面注册驱动的shp名称一致
layer = data_source.CreateLayer("ceshi", srs, ogr.wkbLineString)
这里设置要素的属性字段,其中设置了两个字段,分别是Name、data,其中ogr.OFTString表示字符串类型,其长度都是14字节,可自行设置宽度
field_name = ogr.FieldDefn("Name", ogr.OFTString)
field_name.SetWidth(14)
layer.CreateField(field_name)
field_name = ogr.FieldDefn("data", ogr.OFTString)
field_name.SetWidth(14)
layer.CreateField(field_name)
在生成的字段名中插入要素值,即属性表中每行的值
feature = ogr.Feature(layer.GetLayerDefn())
feature.SetField("Name", "ceshi")
feature.SetField("data", "1.2")
核心部分,生成line数据
其中各要素格式如下:
POINT(6 10)
LINESTRING(3 4,10 50,20 25)
POLYGON((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2))
MULTIPOINT(3.5 5.6, 4.8 10.5)
MULTILINESTRING((3 4,10 50,20 25),(-5 -8,-10 -8,-15 -4))
MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2,2 3,3 3,3 2,2 2)),((6 3,9 2,9 4,6 3)))
GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))
POINT ZM (1 1 5 60)
POINT M (1 1 80)
需要注意的是,这里应该与上面定义的生成要素的类型保持一致,最后是清空缓存,这里多说一句,字符串语法与postgis等开源gis一致,都遵循ogc国际标准
wkt = 'LINESTRING(3 4,10 50,20 25)'
line = ogr.CreateGeometryFromWkt(wkt)
feature.SetGeometry(line)
layer.CreateFeature(feature)
feature = None
data_source = None
结果如下:
用arcgis打开
可以使用该方法,下载在线shp数据,只需要知道所需要素的geojson格式数据中坐标串即可。或者图像识别中获取的矢量边界赋予经纬度。
最后,希望新型肺炎早日过去,一切恢复如旧