Вибір багатокутника ArcSDE за точкою на ArcGIS Desktop за допомогою ArcPy?


15

Я продовжую думати, що я повинен щось бракувати, але, здається, в ArcGIS 10 не існує інструменту для вибору особливостей (зокрема багатокутників) із шару в точковому (X, Y) місці через ArcPy. Параметри для такого інструменту будуть просто назвою шару та розташуванням XY.

На даний момент я вирішую це питання, створюючи точковий клас класу, що містить точку, і виконую на ньому SelectLayerByLocation. Однак, коли клас функцій полігону знаходиться в Oracle (доступ до нього здійснюється через ArcSDE 9.x) і містить 3,5 мільйони полігонів, час, необхідний для здійснення вибору, може перевищувати 5 хвилин, якщо я думаю, що секунда-два (з меншим кодом) будуть більш доречним. Клас функцій має просторовий індекс, і я намагався використовувати arcpy.env.extent (який, як видається, SelectLayerByLocation ігнорує), щоб обмежити доступ до географічної області, але продуктивність залишається дуже низькою.

Чи є швидший спосіб зробити це за допомогою ArcGIS Desktop 10 та ArcPy?


Зараз є рішення цього питання на forums.arcgis.com/threads/…, і я відредагую цю інформацію сюди пізніше сьогодні - велике спасибі Джейсону Шейреру та Крісу
Снайдеру

2
Так само, як примітка до цього, ви можете знайти середовища, які заслуговує інструмент, внизу довідкової сторінки інструменту. SelectByLocation відзначає лише поточну робочу область та вихідну систему координат. help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…
blord-castillo

Відповіді:


9

Іншим підходом до цього було б використання інструменту Spatial Join. Використовуйте крапку в якості вхідного шару функції, як вище, а полігонний шар як ваші особливості ідентичності.
В відміну від SelectLayerByLocation, SpatialJoin робить честь середовища екстента.

targetlayer = layername
joinlayer=arcpy.PointGeometry(arcpy.Point(x, y))
fieldmappings = arcpy.FieldMappings()
fieldmappings.addTable(targetlayer)
arcpy.SpatialJoin_analysis(targetlayer, joinlayer, outputlayer, "JOIN_ONE_TO_MANY", "KEEP_COMMON", fieldmappings)

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

Решта за замовчуванням справно працюватимуть, тому ви можете залишити аргументи, що залишилися.


Велике спасибі за цей код, який містив пару методів, які я не пробував. Раніше я спробував SpatialJoin (щоб я міг поважати геопроцесорне середовище), але тестування, а також тест вашої техніки тільки зараз, залишили мені 4-5 хвилин часу відгуку порівняно з 10-12 секунд для шляху Кріс Снайдер привів мене до.
PolyGeo

Ви випробували техніку Кріса Снайдера і з SpatialJoin? Я думаю, що головна причина буферної техніки настільки швидка, що вона використовує копію пам’яті класу багатокутника. Я думаю, що вибір за місцеположенням повинен бути швидшим, ніж просторове з'єднання, але я не впевнений.
blord-castillo

Кінець не використовуючи біт in_memory. Це вже було так швидко, що я втримав це в запасі. Я думаю, що ключовим моментом було встановити міру отримання одного / декількох багатокутників (від 3,5 мільйона), які мені потрібно було перевірити на X, Y, швидко скопійованих у базу даних геоданих локальних файлів. Тому я думаю, що виконання цієї частини перед SpatialJoin призведе до того ж / подібного покращення продуктивності.
PolyGeo

1

Я просто щось зрозумів ...

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

Ви можете використовувати просте місце розташування XY за допомогою операції запиту функції функції, а також керувати вихідними атрибутами, включаючи форму.

Можливо, у вас є обмеження щодо того, наскільки ви можете виставити клас функції багатокутника, але якщо ви вже робите це доступним для служби геообробки, тоді ви також зможете створити службу функцій.


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

Я подумав, що може бути обмеження на використання будь-якого іншого, крім служби геопроцесорства :) Як не дивно, я вважаю, що Служба функцій - це набагато простіший шлях для впровадження та обслуговування. Це також може пояснити, чому потрібна функціональність недоступна; Ви вже можете це робити на кожному рівні програми. Переконайтеся, що ви надсилаєте запит до ESRI, щоб реалізувати його як інструмент у наступній версії.
blord-castillo

1

Ця відповідь надійшла зі старих дискусійних форумів ArcGIS .

Дякую Джейсону Шейреру за ще якийсь короткий код:

SelectLayerByLocation(in_layer=arcpy.PointGeometry(arcpy.Point(x, y)), select_features="mylayer") 

І особливо Крісу Снайдеру для поради щодо виступу:

Більш швидка робота може полягати в тому, щоб трохи заповнити точку, а потім використовувати міру буфера як ступінь аналізу, щоб зробити вбудовану копію (інструмент CopyFeatures) ваших даних SDE, а потім зробити SelectByLocation на меншому і локальному наборі даних пам’яті. Таким чином, ви начебто робите інструмент SelectByLocation вшанувати середовище ступеня аналізу, що зазвичай не робиться. BTW: Будь-які функції, які перетинаються зі ступенем аналізу, будуть скопійовані інструментом CopyFeatures. Я впевнений, що бажаю, щоб інструмент SelectByLocation і методи курсорів вшанували ступінь аналізу ...

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