Python:在土地覆盖分析中将KMeans Centroids转换为Shapefile以进行像素分类

时间:2016-11-02 11:40:34

标签: python matplotlib scikit-learn geospatial unsupervised-learning

我尝试使用KMeans质心标记/聚集像素进行土地覆盖分析。我希望只使用sklearn和matplotlib来做到这一点。目前我的代码看起来像这样:

kmeans.fit(band_5)
centroids = kmeans.cluster_centers_
plt.scatter(centroids[:, 0], centroids[:, 1])

band_5的形状是(713,1163),但从散点图中我可以看出质心坐标的值远远超过该形状。

根据我的理解,KMeans提供的质心需要转换为正确的坐标,然后转换为shapefile,然后在监督过程中使用它来标记/聚集像素。

如何将这些质心转换为正确的坐标,然后导出到shapefile?另外,我是否需要创建shapefile?

我试图采用这篇文章中的一些代码,但我无法让它工作。 http://scikit-learn.org/stable/auto_examples/cluster/plot_color_quantization.html#sphx-glr-auto-examples-cluster-plot-color-quantization-py

1 个答案:

答案 0 :(得分:1)

有几点:

  1. scikit-learn期望列中的数据(想想电子表格中的表格),所以简单地传入表示栅格波段的数组实际上会尝试对数据进行分类,就好像你有1163个采样点和713个值( (每个样本)。相反,你需要flatten数组,如果你在像ArcGIS这样的东西中查看它,那么返回的kmeans将等同于你的栅格的分位数分类,质心在波段最小值的范围内波段最大值(不在单元格坐标中)。

    看看你提供的例子,他们有一个三波段jpeg,它重塑为三个长列:

  2. image_array = np.reshape(china, (w * h, d))
    
    1. 如果您需要具有空间受限的像素,那么您有两种选择:选择连接受约束的聚类方法,例如Agglomerative ClusteringAffinity Propagation,并查看将规范化的单元格坐标添加到样本集中,例如:
    2. xs, ys = np.meshgrid(
          np.linspace(0, 1, 1163), # x
          np.linspace(0, 1, 713), # y
      )
      data_with_coordinates = np.column_stack([
          band_5.flatten(),
          xs.flatten(),
          ys.flatten()
      ])
      
      # And on with the clustering
      
      1. 使用scikit-learn完成聚类后,假设您使用fit_predict,您将按群集为每个值获取一个标签,并且您可以重新塑造为乐队的原始形状以进行绘制聚集的结果。
      2. labels = classifier.fit_predict(data_with_coordinates)
        plt.imshow(labels.reshape(band_5.shape)
        

        如果你有标记点,你真的需要群集质心吗?你在现实世界的空间坐标中需要它们吗?如果是,那么您需要查看rasterioaffine方法以从地图坐标转换为数组坐标,反之亦然。然后查看fiona将点写入shapefile。