Більше

Попарна (лінійна) відстань між точками одного файлу

Попарна (лінійна) відстань між точками одного файлу


Враховуючи набір точок, що представляють села, збережені у файлі .shp, чи є спосіб обчислити парну відстань (євклідову) між ними? Те, що я хотів би придумати, це своєрідна симетрична матриця, яка підлягає подальшому статистичному аналізу.

Я використовую ArcGIS 10.1 з розширеною ліцензією.


Крім того, ви можете скористатися інструментом «Створити таблицю поблизу», щоб зробити те ж саме, що і пропозиція GISGe, але з деякими додатковими атрибутами (такими як xy близької функції та кут між вихідними та близькими об’єктами), якщо вони будуть корисними у вашому дослідженні. Він також дозволяє вказати кількість найближчих збігів, щоб вони не були усі або лише найближчі.


Для цього скористайтесь інструментом «Відстань до точки» з файлом фігури точки як вхідними та близькими до параметрів функцій.


Вибачте, я б відповів на попередні коментарі, але у мене немає 50 балів у моєму профілі (новий учасник), і мене блокують. Оскільки ваші класи функцій "Введення" та "Близько" однакові, то чому б не зробити копіювати вашого оригінального ФК і використовувати оригінал як "Вхідні дані", а копію як "Поблизу" для інструменту? Це може уникнути проблем із використанням того самого класу об’єктів, що і Input/Near.

Інструменти Near та інструменти Point Distance потребують розширеної ліцензії, тому, здається, у вас є необхідний рівень ліцензії. Для тих, хто має базовий/стандартний алгоритм ESRI's Near, не так вже й важко реалізувати себе на Python. Ця відповідь подібна до тієї, яку я опублікував у Розрахунок найближчої відстані в ArcView, координати XY. Але так як ти хочеш все парні порівняння (не тільки найближча функція), інструмент створить таблицю з усіма попарними порівняннями. Він також створить клас функцій "вертикальні лінії", який з'єднує всі пари і має таку ж інформацію, що і таблиця (цей вихід є більш корисним IMO). Для полів цілі та ідентифікатора джерела можна використовувати "OBJECTID" або будь -який інший унікальний ідентифікатор на ваш вибір. Він працюватиме на будь -якому рівні ліцензії. Якщо вам не пощастило з наведеними вище пропозиціями, спробуйте цей сценарій.

__author__ = "John K. Tran" __contact__ = "[email protected]" __version__ = "1.0" __created__ = "7/1/15" "" "Порівнює всі функції цільової точки з усіма функціями вихідної точки та заповнює ідентифікатор і відстань усіх попарних порівнянь між кожною ціллю до кожного джерела. Можна за бажанням створити вертикальні лінії для візуалізації зв'язків між вихідними та цільовими ознаками. "" "імпортувати arcpy імпортувати імпортувати математику імпортувати випадковий arcpy.SetProgressor (" За замовчуванням "," Запускається script… ") # Встановіть початкові параметри сценарію. source = arcpy.GetParameterAsText (0) # Клас об'єктів точки. target = arcpy.GetParameterAsText (1) # Клас об'єктів точки. outputtable = arcpy.GetParameterAsText (2) # Клас об’єктів таблиці, що зберігає інформацію про відстань та ідентифікатор. sourceIDfield = arcpy.GetParameterAsText (3) # Поле для ідентифікації унікального ідентифікатора значень джерела. targetIDfield = arcpy.GetParameterAsText (4) # Поле для ідентифікації унікального ідентифікатора значень Target. createplumblines = arcpy.GetParameterAsText (5) # Необов’язкове місце виведення для схилів. ВАЖЛИВО пропоную вказати для цього шлях! arcpy.env.parallelProcessingFactor = "100%" #Перетворити типи полів arcpy для аргументу "Тип поля" в AddField_management. fieldtypedict = {"Blob": "BLOB", "Date": "DATE", "Double": "DOUBLE", "Guid": "GUID", "Integer": "LONG", "Raster": "RASTER" , "Single": "FLOAT", "SmallInteger": "SHORT", "String": "TEXT", "OID": "LONG"} # Отримайте тип поля для поля ідентифікатора джерела, щоб ми могли зробити аналогічне поле для NearID у цілі. sourcefields = arcpy.ListFields (source) targetfields = arcpy.ListFields (target) sourceIDfieldtype = fieldtypedict [[field.type для поля у вихідних полях, якщо field.name == sourceIDfield] .pop ()] targetIDfieldtype = fieldtypedict [[field.type для field у targetfields if field.name == targetIDfield] .pop ()] # Отримайте просторові посилання на джерело та ціль та переконайтесь, що вони однакові. sourcespatialref = arcpy.Describe (source) .spatialReference goalspatialref = arcpy.Describe (target) .spatialReference assert sourcespatialref.name == goalspatialref.name, "Джерело та ціль повинні мати однакову систему координат. Переконайтеся, що обидві дані в однаковій проектованій системі. система координат ". # Створіть клас Point з методом відстані. Більш ефективний, ніж рідний arcpy.Geometry class. class Point (object): def __init __ (self, x, y, ID): "" "Створіть конструктор для ініціалізації точки." "" self.x = x self.y = y self.ID = ID def GetDist ( self, OtherPoint): "" "Визначає відстань між двома точками, використовуючи теорему Піфагора." "" повертає math.sqrt ((self.x-OtherPoint.x) ** 2+ (self.y-OtherPoint.y) ** 2) # Створіть список вихідних точок для порівняння з кожною цільовою точкою. scount = 0 sourcepoints = list () з arcpy.da.SearchCursor (джерело, ["[email protected]", sourceIDfield]) як джерельний курсор: для рядка у sourcecursor: arcpy.SetProgressorLabel ("Збір вихідних точок: {0} функції завершені" .format (str (scount))) sourcepoint = Точка (рядок [0] [0], рядок [0] [1], рядок [1]) sourcepoints.append (вихідна точка) scount += 1 del sourcecursor # Створити декілька запусків змінних, якщо створення схилу було включено. якщо createplumblines: arcpy.SetProgressorLabel ("Створення класу функцій Plumb Line") plumblines = list () arcpy.CreateFeatureclass_management (os.path.dirname (createplumblines), os.path.basename (createplumblines), "POLYLINE", None, "DISAB "," DISABLED ", targetpatialref) arcpy.AddField_management (createplumblines," SourceID ", sourceIDfieldtype) arcpy.AddField_management (createplumblines," TargetID ", targetIDfieldtype) # Створіть таблицю для зберігання інформації про відстань. arcpy.SetProgressorLabel ("Створення таблиці відстаней") arcpy.CreateTable_management (os.path.dirname (outputtable), os.path.basename (outputtable)) arcpy.AddField_management (outputtable, "SourceID", sourceIDfieldtype) arcpy.AddField_management (outputtable, "TargetID", targetIDfieldtype) arcpy.AddField_management (outputtable, "Distance", "DOUBLE") # Створіть список для зберігання кожного порівняння, щоб ми могли потім додати його до таблиці. distlist = [] # Перегляньте кожну ціль і порівняйте з кожним джерелом та заповніть поля ID та відстань у таблиці. count = 0 з arcpy.da.SearchCursor (target, ["[email protected]", targetIDfield]) як targetcursor: для рядка у targetcursor: arcpy.SetProgressorLabel ("Обчислювальна відстань: {0} функції завершені" .format (str (count ))) targetpoint = Точка (рядок [0] [0], рядок [0] [1], рядок [1]) для вихідної точки у вихідних точках: currentdist = targetpoint.GetDist (джерельна точка) distlist.append ((sourcepoint.ID, targetpoint.ID, currentdist)) якщо createplumblines: plumblines.append ((sourcepoint, targetpoint)) count = count + 1 del targetcursor # Оновіть таблицю інформацією зі списку розсилки. tnum = 0 з arcpy.da. .format (str (tnum))) tablecursor.insertRow (рядок) del tablecursor # Створіть вертикальні рядки, якщо параметр увімкнено. якщо createplumblines: plnum = 0 plumbcursor = arcpy.da.InsertCursor (createplumblines, ["[email protected]", "SourceID", "TargetID"]) для sourcepnt, targetpnt у plumblines: arcpy.SetProgressorLabel ("Створення вертикальних рядків: {0} містить повний ".format (str (plnum))) plumbarray = arcpy.Array ([arcpy.Point (sourcepnt.x, sourcepnt.y), arcpy.Point (targetpnt.x, targetpnt.y)]) plumbline = arcpy. Полілінія (plumbarray) plumbcursor.insertRow ((plumbline, sourcepnt.ID, targetpnt.ID)) plnum += 1 del plumbcursor # Готово! arcpy.ResetProgressor ()

Дайте мені знати, якщо у вас виникли проблеми із запуском сценарію. Він працює для порівняння геометрії точка-точка. Більш складною вправою є написання алгоритму порівняння вищих географічних типів між собою.

Удачі!