Python Shapefile Conversion – Converting XYZ File

convertpythonshapefilexyz

I have numerous XYZ files, which aren't gridded and I'd like to use Python to convert them to shapefiles.

I'm not quite sure how to go about this?

Best Answer

I have numerous XYZ files, which aren't gridded

from GDAL XYZ – ASCII Gridded XYZ

GDAL supports reading and writing ASCII gridded XYZ raster datasets (i.e. ungridded XYZ, LIDAR XYZ etc. must be opened by other means

The ungridded XYZ file header

# test.xyz
#
0.3517846     -0.7869986      -2.873479    
0.5057634     -0.7079139      -2.871073    
0.6422613     -0.5988617      -2.868600    
.....

Read the xyz file with pandas

import pandas as pd
inputfile = "test.xyz"
df  = pd.read_table(inputfile, skiprows=2, delim_whitespace=True, names=['x', 'y', 'z'])
print(df.head(3))
      x         y         z
0  0.351785 -0.786999 -2.873479
1  0.505763 -0.707914 -2.871073
2  0.642261 -0.598862 -2.868600

Convert the pandas DataFrame to a 2D GeoPandas GeoDataFrame

import geopandas as gpd
gdf2d = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.x, df.y))
print(gdf2d.head(3))
      x         y         z                  geometry
0  0.351785 -0.786999 -2.873479  POINT (0.35178 -0.78700)
1  0.505763 -0.707914 -2.871073  POINT (0.50576 -0.70791)
2  0.642261 -0.598862 -2.868600  POINT (0.64226 -0.59886)
# to shapefile
gdf2d.to_file("test2d.shp")

Convert the pandas DataFrame to a 3D GeoPandas GeoDataFrame

 from shapely.geometry import Point
 gdf3d = gpd.GeoDataFrame(df, geometry=df.apply(lambda row: Point(row.x,row.y,row.z), axis=1))
 print(gdf3d.head(3))
       x         y         z                             geometry
 0  0.351785 -0.786999 -2.873479  POINT Z (0.35178 -0.78700 -2.87348)
 1  0.505763 -0.707914 -2.871073  POINT Z (0.50576 -0.70791 -2.87107)
 2  0.642261 -0.598862 -2.868600  POINT Z (0.64226 -0.59886 -2.86860)
 # to shapefile
 gdf3d.to_file("test3d.shp")