Мінімізація кількості динамічних сторінок для відображення розсіяних точок за допомогою ArcGIS Desktop?


10

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

введіть тут опис зображення

Рішення мені не подобається, тому що: a) є кілька сторінок з одинарними точками (наприклад, сторінка 25), які сидять на краю, і b) занадто багато сторінок.

Перший випуск легко виправити за допомогою коду, - перемістіть прямокутник розміром сторінки до центру відповідних точок:

введіть тут опис зображення

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

Тому я приготував код, який зменшує кількість сторінок. У цьому прикладі від 45 до 34.

введіть тут опис зображення

Я не впевнений, чи це найкращий результат, якого можна досягти,

Яка найкраща стратегія (псевдокод, публікація, бібліотека Python) для переміщення через точки, щоб мінімізувати кількість заданих розмірів прямокутників для захоплення всіх точок? Звичайно, хтось виявив це в теорії ігор, військовому мистецтві чи рибальській галузі

Це оновлення до початкового запитання:

Це показує реальний розмір та потрібний розмір сторінки:

введіть тут опис зображення

Більш масштабний показ 10 із 164 сторінок:

введіть тут опис зображення

Клас зразка точок зразка

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


2
На мою думку, звичайна сітка - найкращий варіант. Читачі карт очікують чогось подібного, тому що вони звикли до цього. Інші варіанти переповнені і, на мою думку, заплутані. Звичайно, є оптимізуючі алгоритми, які будуть робити те, що ви хочете, але я не думаю, що ваша аудиторія їх не оцінить. +1, хоча я ціную те, що ти намагаєшся зробити. Нарешті, одним із способів зменшити кількість сторінок є зміна масштабу.
Фестер

В основному я згоден з Фестер. Бувають випадки, коли книга безперервної карти має своє місце, і мені буде цікаво переглянути відповіді (навіть ваш поточний код, якщо ви хочете поділитися). Наприклад, книга стежок, де ви хочете, щоб кожен слід був на своїй власній карті, і не було байдуже показувати інші (хоча ви все ще можете мати меншу масштабну єдину карту, що показує їх усі у відносному положенні). Просто дивлячись на ваш приклад зображення , які я думаю , що в цьому випадку ви б хотіли безперервний охоплення між сторінками, навіть якщо це означає додаткові послуги, якщо очки не мають невід'ємне властивість групування.
Кріс У

@Fezter, звичайна сітка працює, коли розмір сторінки порівнянний із загальною величиною, і це, і зміна масштабу тут не так
FelixIP

1
@ MichaelMiles-Stimson, те, що я робив за допомогою Avenue, можливо виконати в Python. Використовується колишнє, тому що в іграх з геометрії колишній все ж перевершує. Виберіть точку, знайдіть найближчого сусіда на Манхеттені, створіть багатоточку, отримайте масштаб. Киньте, якщо надмір. Вилучено групу з оригінального списку, продовжуйте залишатися. Я вважав, що порядок сортування важливий, намагався змінити. Дуже мала різниця ...
FelixIP

1
Так, це можливо зробити в python із значними зусиллями. Маючи справу з геометріями, я віддаю перевагу ArcObjects в C #. Як сказав Кріс, вони вже виглядають досить мінімально, чому б не дотримуватися того, що у вас є, і назвати це зробленим.
Майкл Стімсон

Відповіді:


4

Це не відповідь, я просто думав, що розміщую рішення Python для тих, хто цікавиться:

# ---------------------------------------------------------------------------
# PAGE MAKER
# 
# ---------------------------------------------------------------------------
# Import arcpy module
import arcpy, traceback, os, sys
from arcpy import env

width=650
height=500

try:
    def showPyMessage():
            arcpy.AddMessage(str(time.ctime()) + " - " + message)
    mxd = arcpy.mapping.MapDocument("CURRENT")
    points = arcpy.mapping.ListLayers(mxd,"points")[0]
    pgons = arcpy.mapping.ListLayers(mxd,"pages")[0]

    g=arcpy.Geometry()
    geometryList=arcpy.CopyFeatures_management(points,g)
    geometryList=[p.firstPoint for p in geometryList]
    curT = arcpy.da.InsertCursor(pgons,"SHAPE@")
    while True:
        nPoints=len(geometryList)
        small=[geometryList.pop(0)]
        for p in geometryList:
            small.append(p)
            mPoint=arcpy.Multipoint(arcpy.Array(small))
            ext=mPoint.extent
            cHeight=ext.height
            cWidth=ext.width
            if cHeight>height or cWidth>width:
                small.remove(p)
        mPoint=arcpy.Multipoint(arcpy.Array(small))
        ext=mPoint.extent
        xC=(ext.XMin+ext.XMax)/2
        yC=(ext.YMin+ext.YMax)/2
        LL=arcpy.Point (xC-width/2,yC-height/2)
        UL=arcpy.Point (xC-width/2,yC+height/2)
        UR=arcpy.Point (xC+width/2,yC+height/2)
        LR=arcpy.Point (xC+width/2,yC-height/2)
        pgon=arcpy.Polygon(arcpy.Array([LL,UL,UR,LR]))
        curT.insertRow((pgon,))
        short=filter(lambda x: x not in small,geometryList)
        arcpy.AddMessage('Grabbed %i points, %i to go' %(len(small),len(short)))
        if len(short)==0: break
        geometryList=short[:]
    del mxd
except:
    message = "\n*** PYTHON ERRORS *** "; showPyMessage()
    message = "Python Traceback Info: " + traceback.format_tb(sys.exc_info()[2])[0]; showPyMessage()
    message = "Python Error Info: " +  str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"; showPyMessage()

останнім часом застосовується для планування опитування:

введіть тут опис зображення

ОНОВЛЕННЯ:

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

введіть тут опис зображення


Це публікація від @whuber, яку ви шукали? gis.stackexchange.com/a/161855/115
PolyGeo

Так. Раніше я сортував точки перед початком "полювання". Я завтра оновлю власну відповідь. Нелегко без робочого столу
FelixIP

2

Це виглядає як геометрична версія проблеми максимального покриття, яка тісно пов'язана з проблемою встановлення кришки , і ці два є NP-завершеними.

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

  1. Точка Foreach генерує N = 10 прямокутників у випадкових відстанях; просто щоб переконатися, що прямокутник охоплює точку (кожен прямокутник має принаймні одну точку належить йому, і кожна точка належить щонайменше одному прямокутнику)
  2. Повторіть, поки всі точки не будуть охоплені: отримайте прямокутник, що охоплює максимальну кількість непокритих точок. Позначте точки як накриті.

реалізація цього алгоритму, лише для кола, знаходиться тут: http://jsfiddle.net/nwvao72r/3/


1
Вас може зацікавити gis.stackexchange.com/q/227344/115, якщо ви цього не бачили.
PolyGeo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.