学习日记2——将带有坐标的txt文件转换为shp

学习日记2——将带有坐标的txt文件转换为shp,第1张

学习日记2——将带有坐标的txt文件转换为shp

要求:

将特定格式的txt文本,使用geopandas库转化为线矢量。

注意:安装geopandas时,由于geopandas是python第三方库,其有很多依赖库,如GDAL,Fiona,Shapely,pyproj等,不能直接使用pip安装,安装依赖库后才能使用 pip install geopandas 安装。依赖库的安装不细说,在 https://www.lfd.uci.edu/~gohlke/pythonlibs 中找到对应版本的.whl文件就行,下载后放到对应的python环境的scripts文件夹下,然后使用使用pip 安装即可。

注:在cmd中,输入pip install 后,直接将.whl文件用鼠标拖到pip install 的空格后面,即可自动输入路径

本例使用的txt格式:

完整代码:

from osgeo import gdal
import re
import os
import csv
import time
import pandas as pd
import geopandas as gpd
from shapely.geometry import LineString

def read_wr_txt(txt_path,temp_2lines_path,temp_line_path):
    file=open(txt_path,encoding='utf-8')
    datas=file.readlines()
    #将txt文件分离
    lines_2=datas[0].split('[')[0]#前一部分是范围线数据
    line=datas[0].split('[')[1]#后一部分是卫星实际轨迹线数据

    records_2lines=re.findall("[(](.*?)[)]",lines_2)[0].strip('()')#写入第一部分,这部分是字符串,需要分割
    point_2list=records_2lines.split(",")
    with open(temp_2lines_path,"w") as f:
        for point in point_2list:
            temp=point.strip().split(" ")
            x=temp[0]
            y =temp[1]
            f.write(x+','+y+'n')
        f.close()

    records_line = re.findall("[(](.*?)[)]", line)#写入第二部分,这部分是点数组,直接读
    with open(temp_line_path,"w") as f:
        for point in records_line:
            temp=point.split(" ")
            x = temp[0]
            y = temp[1]
            f.write(x + ',' + y + 'n')
        f.close()

#分别对两个txt文件转为csv
def txt_to_csv(temp_line_path,temp_line_csv):
    fh = open(temp_line_csv, "w+", newline='')
    writer = csv.writer(fh)
    writer.writerow(["x_start", "y_start", "x_end", "y_end"])
    file = open(temp_line_path,encoding='utf-8')
    data=file.readlines()
    res = []
    for i in range(len(data)):
        start_word=data[i].strip().split(',')
        if i == len(data)-1:
            end_word = data[i].strip().split(',')
        else:
            end_word = data[i+1].strip().split(',')
        d=[start_word[0],start_word[1],end_word[0],end_word[1]]
        res.append(d)
    writer.writerows(res)
    file.close()
    fh.close()

# CSV转换为shapefile线数据,数据格式为x_start, y_start, x_end, y_end
def csv_to_lines(temp_line_csv,result_line_shp):
    df = pd.read_csv(temp_line_csv, header=0, encoding='gbk')
    geometry = [LineString(xy_list) for xy_list in zip(zip(df.x_start, df.y_start), zip(df.x_end, df.y_end))]
    gdf = gpd.GeoDataframe(df, crs="EPSG:4326", geometry=geometry)
    gdf.to_file(result_line_shp, encoding='gbk')

def create_txt2shp(txt_path):
    os.makedirs(os.getcwd()+r"txt", exist_ok=True)
    os.makedirs(os.getcwd() + r"csv", exist_ok=True)
    os.makedirs(os.getcwd() + r"shp", exist_ok=True)
    temp_2lines_path = os.path.join(os.getcwd()+r"txt", "2lines_" + os.path.split(txt_path)[1])
    temp_line_path = os.path.join(os.getcwd()+r"txt", "1line_" + os.path.split(txt_path)[1])
    temp_2lines_csv = os.path.join(os.getcwd()+r"csv", "2lines_" + os.path.split(txt_path)[1][0:-4] + ".csv")
    temp_line_csv = os.path.join(os.getcwd()+r"csv", "1line_" + os.path.split(txt_path)[1][0:-4] + ".csv")
    result_2lines_shp = os.path.join(os.getcwd()+r"shp", "2lines_" + os.path.split(txt_path)[1][0:-4] + ".shp")
    result_line_shp = os.path.join(os.getcwd()+r"shp", "1line_" + os.path.split(txt_path)[1][0:-4] + ".shp")
    read_wr_txt(txt_path, temp_2lines_path, temp_line_path)
    txt_to_csv(temp_2lines_path, temp_2lines_csv)
    txt_to_csv(temp_line_path, temp_line_csv)
    csv_to_lines(temp_2lines_csv, result_2lines_shp)
    csv_to_lines(temp_line_csv, result_line_shp)
    print("finished!")

#使程序更具健壮性,输入目录或者文件名,都可以进行处理
def dir_or_file(path):
    if not os.path.exists(path):
        print("输入路径不存在,请重新输入!")
        return 0
    if os.path.isdir(path):
        File_Path = os.listdir(Root_Path)
        if not File_Path:
            print("输入路径有误!请重新输入!")
            return 0
        bool=False
        for file in File_Path:
            if file.endswith(".txt"):
                bool=True
                print("正在处理" + file)
                create_txt2shp(os.path.join(Root_Path, file))
        if not bool:
            print("该路径下没有txt文件,请重新输入!")
            return 0
    if os.path.isfile(path):
        print("正在处理" + path)
        create_txt2shp(path)

if __name__ == '__main__':
    start=time.time()
    Root_Path=r"C:UsersAdministratorDesktoptxt2shptest"
    dir_or_file(Root_Path)
    end = time.time()
    print("用时"+str(end-start)+"秒!")

结果为:

 生成的shp文件在项目路径的shp文件夹下:

shp文件列表:

 生成的shp线要素效果:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5436512.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存