最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

geometry - How can I fix Singular Matrix Warning when computing a concave hull with alphashape? - Stack Overflow

programmeradmin1浏览0评论

The actual warning printed is "WARNING:root:Singular matrix. Likely caused by all points lying in an N-1 space." This is a surprise to me, since my points clearly populate a 2D area and are not collinear, as shown in this screenshot from QGIS:

Lake with original points

I tried to drop duplicate points, since I read that could cause the warning, but the issue remains. My goal is to generate a concave hull that is not as concave as to strictly follow the zigzag pattern of my points, but for it to describe the outer concavities of the imaginary boundary.

This is my code right now:

# Read CSV Data
print("Parsing .csv file...", end=" ", flush=True)
filepath = f'output/{argv[1]}'
with open(filepath, "r") as archive:
    data = list(csv.reader(archive, delimiter=","))[1:]  # Skip header

lat = []
lon = []
z = []

for entry in data:
    lat.append(float(entry[9]))  # Keep raw latitude
    lon.append(float(entry[10])) # Keep raw longitude
    z.append(float(entry[1]) / 1000)  # Convert depth to meters

df = pd.DataFrame({'lon': lon, 'lat': lat, 'z': z})
df = df.drop_duplicates(subset=['lon', 'lat'], keep='first')
print("Done!")

print("Exporting points to .xyz file...", end=" ", flush=True)
with open(f"output/{name}.xyz", "w") as f: #export to .xyz
    f.write("LONGITUDE_(deg) LATITUDE_(deg) DEPTH_(m)\n")
    for lon, lat, z in zip(df['lon'], df['lat'], df['z']):
        f.write(f"{lon} {lat} {z}\n")
print("Done!")

print("Computing concave hull for fence boundary...", end=" ", flush=True)
points = np.column_stack((df['lon'], df['lat']))
alpha_opt = 0.01
concave_hull = alphashape.alphashape(points, alpha_opt)
hull_coords = np.array(concave_hull.exterior.coords)
hull_path = path.Path(hull_coords)
if isinstance(concave_hull, Polygon):
    print("Done!")
else:
    print("Something went wrong.")
    exit(1)

The actual warning printed is "WARNING:root:Singular matrix. Likely caused by all points lying in an N-1 space." This is a surprise to me, since my points clearly populate a 2D area and are not collinear, as shown in this screenshot from QGIS:

Lake with original points

I tried to drop duplicate points, since I read that could cause the warning, but the issue remains. My goal is to generate a concave hull that is not as concave as to strictly follow the zigzag pattern of my points, but for it to describe the outer concavities of the imaginary boundary.

This is my code right now:

# Read CSV Data
print("Parsing .csv file...", end=" ", flush=True)
filepath = f'output/{argv[1]}'
with open(filepath, "r") as archive:
    data = list(csv.reader(archive, delimiter=","))[1:]  # Skip header

lat = []
lon = []
z = []

for entry in data:
    lat.append(float(entry[9]))  # Keep raw latitude
    lon.append(float(entry[10])) # Keep raw longitude
    z.append(float(entry[1]) / 1000)  # Convert depth to meters

df = pd.DataFrame({'lon': lon, 'lat': lat, 'z': z})
df = df.drop_duplicates(subset=['lon', 'lat'], keep='first')
print("Done!")

print("Exporting points to .xyz file...", end=" ", flush=True)
with open(f"output/{name}.xyz", "w") as f: #export to .xyz
    f.write("LONGITUDE_(deg) LATITUDE_(deg) DEPTH_(m)\n")
    for lon, lat, z in zip(df['lon'], df['lat'], df['z']):
        f.write(f"{lon} {lat} {z}\n")
print("Done!")

print("Computing concave hull for fence boundary...", end=" ", flush=True)
points = np.column_stack((df['lon'], df['lat']))
alpha_opt = 0.01
concave_hull = alphashape.alphashape(points, alpha_opt)
hull_coords = np.array(concave_hull.exterior.coords)
hull_path = path.Path(hull_coords)
if isinstance(concave_hull, Polygon):
    print("Done!")
else:
    print("Something went wrong.")
    exit(1)
Share Improve this question asked Mar 4 at 1:50 jojusuarjojusuar 336 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 0

Apart from duplicate or near duplicate points, I found that large coordinate values can also lead to this warning. Try centering the coordinates in conjunction with dropping duplicate and near duplicate values. This might solve your problem.

发布评论

评论列表(0)

  1. 暂无评论