Як люди використовують структури даних та класи Python в ArcPy?


16

Це питання може виявити моє незнання щодо програмування, але мені цікаво, як люди використовують різні структури даних python в ArcPy.

На цій сторінці перераховані структури даних в Python. Я розумію, як списки можуть бути реалізовані в ГІС (список класів функцій, список типів функцій, список кадрів даних тощо). Я розумію, як можна використовувати також набори (для видалення дублікатів). Як люди реалізують кортежі, словники та інші структури даних у ArcPy? Також є інші приклади списків та наборів, які я не перераховував?

Крім того, без сумніву, люди створюють власні класи в ArcPy. За яких обставин та ситуацій ви цього вимагаєте? Чи можете ви навести приклади? Хтось створює власні класи, які успадковуються від вбудованих класів arcpy?

Я не вимагаю відповідей на всі ці запитання, мені просто цікаво, як люди використовують Python в ГІС і які робочі процеси вимагають цих налаштувань.


4
Цікаве запитання, але це не має остаточної відповіді. Має бути вікі спільноти.
РК

Відповіді:


14

Багато функцій arcpy, які приймають кілька входів, приймають об'єкти списку Python.

Наприклад, Dissolve_managementфункція приймає список імен полів, які слід розчинити на:

arcpy.Dissolve_management("taxlots", "C:/output/output.gdb/taxlots_dissolved",
    ["LANDUSE", "TAXCODE"], "", "SINGLE_PART", "DISSOLVE_LINES")

Кортеж можна використовувати замість списку, коли вам не потрібно змінювати порядок чи кількість елементів, оскільки кортежі незмінні . Вони є корисною структурою даних для неоднорідних, але пов'язаних між собою фрагментів даних, таких як елементи часової позначки або координати точки. Ви часто побачите списки кортежів, де кортеж виступає як окремий запис із фіксованою кількістю атрибутів, тоді як список може легко змінювати розмір, бути переупорядкованим (відсортованим) тощо. Для отримання додаткових відомостей див. Це питання StackOverflow. списків проти кортежів.

Словник може використовуватися як таблиця швидкого пошуку для кешування відносно невеликого, але часто використовуваного набору пар ключових значень у пам'яті. Я бачив цікавий приклад цього на форумах ArcGIS: http://forums.arcgis.com/threads/55099-Update-cursor-with-joined-tables-work-around-w-dic Dictionary

Використання словника замість з'єднання збільшило їх обчислення від 3,5 годин до 15 хвилин.

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

Я не знайшов необхідності писати клас на Python для використання в arcpy, але це не означає, що не існує такого випадку використання. Клас може бути корисним, коли у вас є набір тісно пов’язаних функцій (поведінки), які працюють на деякому вході (даних), і ви хочете мати можливість використовувати ці дані та поведінку об'єктно-орієнтованим способом, але це більше швидше за все, це буде бізнес-логіка і не пов'язана з архпією.


7

Blah238 добре висвітлює цю тему, тому я просто додам пару прикладів із власної роботи. Я розвиваю багато даних про аеропорт, і одна з речей, яку мені потрібно регулярно робити, - це читати, щоб уздовж обстежених точок злітно-посадкової смуги від злітно-посадкової смуги. Ви б могли подумати, що ці пункти вже будуть в порядку (у базі даних ГІС), але вони рідко є. Точки центральної лінії трапляються кожні 10 футів уздовж центральної лінії і розташовані з обох боків двома іншими рядами оглядових точок, розташованих на відстані 10 футів. Ви отримуєте малюнок: безліч балів ... і, як правило, все це змішується в базі даних. З тим, що я роблю в своїх сценаріях, зазвичай найпростіше просто виділити точки центральної лінії за атрибутами (або просторово, якщо потрібно), прочитати координати для кожного та перенести результати в список Python. Тоді я можу сортувати, попсувати, перевертати тощо.

Так само я широко використовую словники Python (напевно, набагато більше, ніж деякі з них схвалюють). Мені доводиться створювати набори тривимірних одиниць векторів для кожного кінця злітно-посадкової смуги в аеропорту, і я отримую доступ до них постійно в рамках сценарію і роблю це у багатьох своїх сценаріях. Я також зберігаю багато інших наборів даних, що регулярно отримують доступ, у словниках. Як і списки, вони швидкі та гнучкі. Настійно рекомендується.

Що стосується занять, як, наприклад, Blah238, я не знайшов необхідності створювати будь-які. Напевно, є кілька випадків, коли клас віддав перевагу моїм сценаріям, але я дійсно не зміг визначити ці місця. Хтось із більшим досвідом програмування, ймовірно, знайде їх швидко.


5

Я теж люблю словники - використовую їх постійно. Цей метод отримує деякі просторові довідкові властивості і зберігає все це в диктаті:

def get_coord_sys(self, in_dataset):
    """Get and return info on dataset coord sys/projection"""
    spatial_ref = arcpy.Describe(in_dataset).spatialReference
    # Get spatial ref props and put in dictionary
    spat_ref_dict = {}
    spat_ref_dict["name"] = spatial_ref.name
    spat_ref_dict["type"] = spatial_ref.type
    spat_ref_dict["gcs_code"] = spatial_ref.GCSCode
    spat_ref_dict["gcs_name"] = spatial_ref.GCSName
    spat_ref_dict["pcs_code"] = spatial_ref.PCSCode
    spat_ref_dict["pcs_name"] = spatial_ref.PCSName
    return spat_ref_dict

Цей фрагмент методу витягує точкові геометрії з двох класів функцій, потім я потім використовую геометрії, щоб зробити якийсь триггер:

def build_fields_of_view(self):
        """For all KOPs in a study area, build left, right, center FoV triangles"""
        try:    
            fcs = {os.path.join(self.gdb, "WindFarmArray"):[], os.path.join(self.gdb, "KOPs"):[]}
            # Build a dict of WTG and KOP array geometries, looks like:
            #  {'KOPs': [[1, -10049.2697098718, 10856.699451165374], 
            #            [2, 6690.4377855260946, 15602.12386816188]], 
            #   'WindFarmArray': [[1, 5834.9321158060666, 7909.3822339441513], 
            #                     [2, 6111.1759513214511, 7316.9684107396561]]}
            for k, v in fcs.iteritems():
                rows = arcpy.SearchCursor(k, "", self.sr)
                for row in rows:
                    geom = row.shape
                    point = geom.getPart()
                    id = row.getValue("OBJECTID")
                    v.append([id, point.X, point.Y])   

            kops = fcs[os.path.join(self.gdb, "KOPs")] # KOP array
            wtgs = fcs[os.path.join(self.gdb, "WindFarmArray")] # WTG array

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


дякую за відповідь. Чому в цих випадках словник є кращим вибором, ніж інша структура даних?
Фестер

Мені просто подобається, щоб я міг називати свої значення своїми ключами.
Чад Купер

2
Ще одна причина диктів може бути кращою - це те, що вони читаються набагато швидше, ніж списки, тому що вони не впорядковані. отже, обробка дуже довгих списків може зайняти трохи більше часу, якщо вони мають багато записів.
ndimhypervol

@gotanuki Правда, і якщо вам потрібно скористатися великим списком, використовуйте замість них кортеж, оскільки вони також швидші за списки.
Чад Купер

2

Прочитайте це , збираючи відповідь, і довелося внести деякі зміни.

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

У мене є клас, який називається featureLayer (мабуть, не пітонічно названий ... все ще навчається). я можу зробити

sys.path.append(r"\\Path\To\Scripts")
import gpFuncs as gpF
fc = arcpy.GetParameterAsText(0)
featureLayer = gpF.featureLayer(fc)
points = featureLayer.featureVerticesToPoints(featureid, "", first_and_last)

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

Я думаю, що якщо правильно побудовані класи, то це має функціонал. Наприклад, незабаром я почну рефакторинг, щоб у мене був клас FeatLayer, у якому є методи та атрибути, які мають усі шари функцій. Потім успадкуйте від нього, щоб створити екземпляр класу featureLayerStrict, який успадкує всі атрибути / методи FeatureLayers, але інстанціюватиме певний тип геометрії, як багатокутник.


4
Ознайомтеся з посібником зі стилів Python (він же PEP 8) щодо призначення імен.
blah238

0

Я працюю головним чином у VB .net, але все більше й більше використовую python та arcpy. У VB мені подобається і намагаюся використовувати Enums, оскільки це робить читання коду зрозумілішим. Раніші версії python не реалізовували Enums, тому хак повинен був створити клас, що розкриває деякі властивості, купа прикладів обговорюється на Stack Overflow . Зараз це виглядає як остання версія реалізації python, про яку йдеться тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.