Vairāk

Pāra (lineārais) attālums starp vienas formas failiem


Ņemot vērā .shp failā saglabāto punktu kopu, kas apzīmē ciematus, vai ir kāds veids, kā starp tiem aprēķināt attālumu pāriem (Eiklida)? Tas, ko es gribētu izdomāt, ir sava veida simetriska matrica, ko turpmāk statistiski analizēt.

Es izmantoju ArcGIS 10.1 ar papildu licenci.


Varat arī izmantot rīku Ģenerēt tuvu tabulu, lai veiktu to pašu, ko GISGe ieteikums, bet ar dažiem papildu atribūtiem (piemēram, tuvās funkcijas xy un leņķi starp avota un tuvuma elementiem), ja tie būtu noderīgi jūsu pētījumā. Tas arī ļauj norādīt tuvāko atbilstību skaitu, lai tas nebūtu viss vai tikai tuvākais.


Lai to izdarītu, izmantojiet rīku Punktu attālums, norādot punkta formas failu kā ievades funkcijas un tuvu objektu parametrus.


Atvainojiet, es atbildētu uz iepriekšējiem komentāriem, bet manā profilā nav 50 punktu (jauns dalībnieks), un es esmu bloķēts. Tā kā jūsu ieejas un tuvējās funkciju klases ir vienādas, kāpēc gan neizveidot a kopiju no oriģinālā FC un izmantot oriģinālu kā "ievadi" un kopiju kā "tuvu" instrumentam? Tas var apiet problēmas, kas rodas, izmantojot to pašu funkciju klasi kā Ievades/Tuvumā.

Tuviem rīkiem un punktu attāluma rīkiem ir nepieciešama papildu licence, tāpēc šķiet, ka jums ir nepieciešamais licences līmenis. Tiem, kam ir pamata/standarta, ESRI tuvā algoritma ieviešana Python nav pārāk grūta. Šī atbilde ir līdzīga tai, ko ievietoju sadaļā Aprēķināt tuvāko attālumu ArcView, XY koordinātās. Bet tā kā jūs vēlaties visas pāru salīdzinājumus (ne tikai tuvāko iezīmi), rīks izveidos tabulu ar visiem pāru salīdzinājumiem. Tas arī izveidos funkciju līniju "svītras līnijas", kas savieno visus pārus un kurai ir tāda pati informācija kā tabulai (šī izeja ir noderīgāka IMO). Laukos Mērķa un avota ID varat izmantot “OBJECTID” vai jebkuru citu jūsu izvēlētu unikālu ID. Tas darbosies jebkurā licences līmenī. Ja jums nav paveicies ar iepriekš minētajiem ieteikumiem, izmēģiniet šo skriptu.

__author__ = "John K. Tran" __contact__ = "[email protected]" __version__ = "1.0" __created__ = "7/1/15" "" "Salīdzina visas mērķa punktu funkcijas ar visām avota punktu funkcijām un aizpilda ID un attālumu starp pāriem, salīdzinot katru mērķi ar katru avotu. Var pēc izvēles izveidot svītras līnijas, lai vizualizētu saites starp avota un mērķa īpašībām. skripts ... ") # Iestatiet skripta sākotnējos parametrus. source = arcpy.GetParameterAsText (0) # Punktu klases. target = arcpy.GetParameterAsText (1) # Punktu klases. outputtable = arcpy.GetParameterAsText (2) # Tabulas funkciju klase, kurā tiek saglabāta attāluma un ID informācija. sourceIDfield = arcpy.GetParameterAsText (3) # Lauks, lai identificētu avota vērtību unikālo ID. targetIDfield = arcpy.GetParameterAsText (4) # Lauks, lai identificētu mērķa vērtību unikālo ID. createplumblines = arcpy.GetParameterAsText (5) # Neobligāta izvades vieta svītru līnijām. Ļoti iesakām jums norādīt ceļu šim nolūkam! arcpy.env.parallelProcessingFactor = "100%" #Convert arkveida lauku tipi argumentam "Lauka tips" AddField_management. fieldtypedict = {"Blob": "BLOB", "Date": "DATE", "Double": "DOUBLE", "Guid": "GUID", "Integer": "LONG", "Raster": "RASTER" , "Single": "FLOAT", "SmallInteger": "SHORT", "String": "TEXT", "OID": "LONG"} # Iegūstiet lauka veidu avota ID laukam, lai mēs varētu izveidot līdzīgu lauku mērķim NearID. sourcefields = arcpy.ListFields (source) targetfields = arcpy.ListFields (target) sourceIDfieldtype = fieldtypedict [[field.type for field in sourcefields if field.name == sourceIDfield] .pop ()] targetIDfieldtype = fieldtypedict [[field.type for lauks mērķa laukos, ja field.name == targetIDfield] .pop ()] # Iegūstiet avota un mērķa telpiskās atsauces un pārliecinieties, vai tās ir vienādas. sourcespatialref = arcpy. koordinātu sistēma. " # Izveidojiet punktu klasi ar attāluma metodi. Efektīvāks nekā vietējais arkijs. Ģeometrijas klase. class Point (objekts): def __init __ (self, x, y, ID): "" "Izveidojiet konstruktoru, lai inicializētu punktu." "" self.x = x self.y = y self.ID = ID def GetDist ( self, OtherPoint): "" "nosaka attālumu starp diviem punktiem, izmantojot Pitagora teorēmu." "" return math.sqrt ((self.x-OtherPoint.x) ** 2+ (self.y-OtherPoint.y) ** 2) # Izveidojiet avota punktu sarakstu, lai tos salīdzinātu ar katru mērķa punktu. scount = 0 avota punkti = saraksts () ar arcpy.da.SearchCursor (avots, ["[email protected]", sourceIDfield]) kā avota kursors: rindai avota kursorā: arcpy.SetProgressorLabel ("Avota punktu apkopošana: {0} līdzekļi ir pabeigti") .format (str (scount))) sourcepoint = Punkts (rinda [0] [0], rinda [0] [1], rinda [1]) sourcepoints.append (avota punkts) scount += 1 del sourcecursor # Izveidot vairākus startus mainīgie, ja ir iespējota svītru līniju izveide. ja createplumblines: arcpy.SetProgressorLabel ("Plumb Line Feature Class" veidošana) plumblines = list () arcpy.CreateFeatureclass_management (os.path.dirname (createplumblines), os.path.basename (createplumblines), "POLYLINE", nav, "DISABL" "," DISABLED ", targetpatialref) arcpy.AddField_management (createplumblines," SourceID ", sourceIDfieldtype) arcpy.AddField_management (createplumblines," TargetID ", targetIDfieldtype) # Izveidojiet tabulu, lai saglabātu informāciju par attālumu. arcpy.SetProgressorLabel ("Attāluma tabulas veidošana") arcpy.CreateTable_management (os.path.dirname (outputtable), os.path.basename (outputtable)) arcpy.AddField_management (outputtable, "SourceID", sourceIDfieldtype) arcp.dd ( "TargetID", targetIDfieldtype) arcpy.AddField_management (outputtable, "Distance", "DOUBLE") # Izveidojiet sarakstu katra salīdzinājuma saglabāšanai, lai mēs pēc tam to varētu pievienot tabulai. distlist = [] # Apmeklējiet katru mērķi un salīdziniet ar katru avotu un aizpildiet ID un attāluma laukus tabulā. count = 0 ar arcpy.da.SearchCursor (target, ["[email protected]", targetIDfield]) kā targetcursor: rindai mērķa kursorā: arcpy.SetProgressorLabel ("Skaitļošanas attālums: {0} funkcijas ir pabeigtas" .format (str (count ))) targetpoint = Punkts (rinda [0] [0], rinda [0] [1], rinda [1]) avota punktam avota punktos: currentdist = targetpoint.GetDist (sourcepoint) distlist.append ((sourcepoint.ID, targetpoint.ID, currentdist)) if createplumblines: plumblines.append ((avota punkts, mērķpunkts)) count = count + 1 del targetcursor # Atjauniniet tabulu ar informāciju no distlist. tnum = 0 ar arcpy.da.InsertCursor (izvadāms, ["SourceID", "TargetID", "Distance"]) kā tabulas kursors: rindai distlist: arcpy.SetProgressorLabel ("Attālumu pievienošana tabulai: {0} funkcijas ir pabeigtas" .format (str (tnum))) tablecursor.insertRow (row) del tablecursor # Ja opcija ir iespējota, izveidojiet svītras līnijas. if createplumblines: plnum = 0 plumbcursor = arcpy.da.InsertCursor (createplumblines, ["[email protected]", "SourceID", "TargetID"]) priekš sourcepnt, targetpnt in plumblines: arcpy.SetProgressorLabel ("Svira līniju ģenerēšana: {0} funkcijas pilnīgas ".format (str (plnum))) plumbarray = arcpy.Array ([arcpy.Point (sourcepnt.x, sourcepnt.y), arcpy.Point (targetpnt.x, targetpnt.y)]) plumbline = arcpy. Polyline (plumbarray) plumbcursor.insertRow ((plumbline, sourcepnt.ID, targetpnt.ID)) plnum += 1 del svirskursors # Gatavs! arcpy.ResetProgressor ()

Paziņojiet man, ja jums ir kādas problēmas ar skripta darbību. Tas darbojas ģeometrijas salīdzināšanai no punkta uz punktu. Sarežģītāks uzdevums ir rakstīt algoritmu, lai salīdzinātu augstākos ģeometrijas veidus.

Veiksmi!