基于arcpy实现空间数据聚类,kmeans

并不能直接进行空间数据的聚类,原理是读取要素的x,y坐标来进行聚类,然后将聚类中心保存为空间数据以达到效果

# encoding: utf-8
from sklearn.cluster import KMeans
import numpy as np
import arcpy
import pandas as pd
from arcpy import env
env.workspace=r"D:\84.gdb"
target="bujiandian"
cursor=arcpy.SearchCursor(target)
allfea=[]
dic={}
name="ysdm"#代码要素列别的字段
for row in cursor :
    ls=[]
    if(dic.has_key(row.getValue(name))):
        dic[row.getValue(name)]+=1
    else:
        dic[row.getValue(name)] = 1
    ls.append(row.getValue(name))
    ls.append(row.getValue("ptx"))
    ls.append(row.getValue("pty"))
    allfea.append(ls)
data2=pd.DataFrame(allfea,columns=[name,"ptx","pty"])
dataFilter=data2.query(name+"=='9000402'")
#取坐标进行聚类
df1 = dataFilter.ix[:,1 :]
kmeans = KMeans(n_clusters=3, random_state=10).fit(df1)
#dfl是聚类的结果
df1['jllable'] = kmeans.labels_
df_count_type = df1.groupby('jllable').apply(np.size)

##聚类中心
cent=kmeans.cluster_centers_
#将聚类中心保存为空间数据
sr = arcpy.SpatialReference(4326)
fc=arcpy.CreateFeatureclass_management( r"D:\cs","test.shp", "POINT", "", "","", sr)
arcpy.AddField_management(r"D:\cs\test.shp", "leibie", "TEXT")
cursor=arcpy.InsertCursor(fc)
for line in cent:
    feature = cursor.newRow()
    # Add the point geometry to the feature
    vertex = arcpy.CreateObject("Point")
    vertex.X = line[0]
    vertex.Y =line[1]
    feature.shape = vertex
    # Add attributes
    feature.leibie = "shumu"
    # write to shapefile
    cursor.insertRow(feature)
del cursor
del fc

转载自:https://blog.csdn.net/A873054267/article/details/84305281

You may also like...