zoukankan      html  css  js  c++  java
  • 读CSV文件并写arcgis shp文件

    一、在这里我用到的csv文件是包含x,y坐标及高程、降雨量数据的文件。如下图所示。

    二、SF简介

            简单要素模型(Simple Feature,SF),是 OGC 国际组织定义的面向对象的矢量数据模
    型。要素 Feature 包括几何对象和属性信息两部分。其中,几何对象有两种表示
    方式 - WKT(Well Known Text)和 WKB(Well Known Binary),前者用于编程赋值,后者
    用于数据库或二进制文件格式。

    三、创建SF对象

    from osgeo import ogr
    #SF 对象的 WKT 表示格式
    pnt_wkt = "POINT(1 1)"
    lin_wkt = "LINESTRING(0 0,15 15) "
    pol_wkt = "POLYGON((1 1,1 10,10 10,10 1,1 1),( 2 2,2 8,8 8,8 2,2 2)) "
    #创建 SF 对象
    pnt = ogr.CreateGeometryFromWkt(pnt_wkt)
    lin = ogr.CreateGeometryFromWkt(lin_wkt)
    pol = ogr.CreateGeometryFromWkt(pol_wkt)

    四、读CSV文件并写arcgis shp文件

    #读csv文件

    filename='stations.csv'
    fh=open(filename,'r')

    #读csv文件头

    title=fh.readline()

    title=title.strip()

    title=title.split(",")

    #读取csv数据

    vals=[]

    datas=[]

    val=fh.readline()

    while val is not None:
      val=val.strip()
      if len(val) ==0:
        break
      for v in val.split(","):
        v_=float(v)
        vals.append(v_)
      datas.append(vals)
      vals=[]
      val=fh.readline()

    #写shp文件

    from osgeo import ogr,osr

    import os

    filename = "stations.shp"

    driver = ogr.GetDriverByName("ESRI Shapefile")
    #判断shp文件名是否在当前文件夹中存在,如果存在则删除
    if os.access(filename, os.F_OK ):
      driver.DeleteDataSource(filename)

    #创建shp文件

    ds = driver.CreateDataSource(filename)

    #定义投影

    spatialref=osr.SpatialReference('LOCAL_CS["arbitrary"]')

    #定义几何类型

    geomtype=ogr.wkbPoint

    #定义图层(此方法可以根据datas数据设定字符编码默认为utf-8编码。)

    layer=ds.CreateLayer(filename[:-4],srs=spatialref,geom_type=geomtype)

    #定义图层属性字段信息

    fdx=ogr.FieldDefn(title[0],ogr.OFTReal)
    fdx.SetPrecision(3)
    fdy=ogr.FieldDefn(title[1],ogr.OFTReal)
    fdy.SetPrecision(3)
    fdz=ogr.FieldDefn(title[2],ogr.OFTReal)
    fdz.SetPrecision(3)
    fdp=ogr.FieldDefn(title[3],ogr.OFTReal)
    fdp.SetPrecision(3)

    layer.CreateField(fdx)

    layer.CreateField(fdy)

    layer.CreateField(fdz)

    layer.CreateField(fdp)

    #将几何对象及属性写入图层

    for i in range(len(datas)):
      d=datas[i]

      #创建SF对象
      wkt="POINT(%f %f %f)" % (d[0],d[1],d[2])
      geom=ogr.CreateGeometryFromWkt(wkt)

      #图层属性信息
      feat=ogr.Feature(layer.GetLayerDefn())
      feat.SetGeometry(geom)
      feat.SetField(title[0],d[0])
      feat.SetField(title[1],d[1])
      feat.SetField(title[2],d[2])
      feat.SetField(title[3],d[3])
      layer.CreateFeature(feat)

    #关闭文件

    ds.Dsetroy()

  • 相关阅读:
    sqlserver2000及以上版本导出数据到mysql里的详细图解
    JDBC和ODBC的区别何在?什么是ODBC?
    mysql ODBC 在64位下提示找不到odbc驱动问题
    Microsoft sqlserver2000如何导入.mdf格式的数据库文件
    使用navicat 链接sql server 出现08001错误
    sql语句如何转成hql语句?
    显示所有SAP图标的ABAP代码
    SMW0上传EXCEL模板时报错无分配给对象***的MIME类型
    显示小闹钟的函数
    便携计算器
  • 原文地址:https://www.cnblogs.com/ninicwang/p/11579915.html
Copyright © 2011-2022 走看看