在处理数据的时候,很多时候原始数据都是csv格式,分析的时候使用shapefile比较方便。特别是在mac系统上没有arcgis,处理大量数据的时候用qgis一个一个点很麻烦,于是写了个python脚本处理。
首先安装gdal的python安装包:
sudo easy_install GDAL
安装好之后就可以使用GDAL/OGR来进行数据处理了,脚本如下:
import osgeo.ogr as ogr
import osgeo.osr as osr
from osgeo import gdal
import csv
def poiMake(csvpath,shp,layerName):
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO")
gdal.SetConfigOption("SHAPE_ENCODING","")
source = osr.SpatialReference()
source.ImportFromEPSG(4326)
target = osr.SpatialReference()
target.ImportFromEPSG(3857)
reader = csv.DictReader(open(csvpath,"rb"),delimiter=',',quoting=csv.QUOTE_MINIMAL)
driver = ogr.GetDriverByName("ESRI Shapefile")
data_source = driver.CreateDataSource(shp)
layer = data_source.CreateLayer(layerName, target, ogr.wkbPoint)
field_name = ogr.FieldDefn("en", ogr.OFTString)
field_name.SetWidth(100)
layer.CreateField(field_name)
field_cn = ogr.FieldDefn("cn", ogr.OFTString)
field_cn.SetWidth(100)
layer.CreateField(field_cn)
for row in reader:
feature = ogr.Feature(layer.GetLayerDefn())
feature.SetField("en", row['en'].lstrip('"').rstrip('"'))
feature.SetField("cn", row['cn'].lstrip('"').rstrip('"'))
wkt = "POINT(%f %f)" % (float(row['lon']) , float(row['lat']))
transform = osr.CoordinateTransformation(source, target)
point = ogr.CreateGeometryFromWkt(wkt)
point.Transform(transform)
feature.SetGeometry(point)
layer.CreateFeature(feature)
feature.Destroy()
data_source.Destroy()
代码很简单,就不多解释了,其中最关键的是下面两句:
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO")
gdal.SetConfigOption("SHAPE_ENCODING","")
用来解决中文字符的问题
查看原文:http://www.giser.net/?p=1322
使用GDAL/OGR包+python将CSV转成shapefile并投影
最新推荐文章于 2024-02-13 08:16:13 发布