ArcGIS Desktop을 사용하여 산점을 매핑하기 위해 동적 페이지 수를 최소화 하시겠습니까?


10

때때로 관심 지점을 보여주기 위해 맵북을 만들어야합니다. 일반 메쉬를 사용하여 페이지를 작성하는 첫 단계 :

여기에 이미지 설명을 입력하십시오

a) 가장자리에 단일 포인트 (예 : 25 페이지)가있는 페이지가 있고 b) 페이지가 너무 많기 때문에 솔루션이 마음에 들지 않습니다.

첫 번째 문제는 코드를 사용하여 쉽게 수정할 수 있습니다.-페이지 범위의 사각형을 관련 포인트 범위의 중심으로 이동하십시오.

여기에 이미지 설명을 입력하십시오

여전히 마음에 들지 않습니다. 페이지 수가 동일하기 때문에 매우 혼잡합니다. 모두 보고서의 여러 사본에 실제 A3 용지 페이지가됩니다.

그래서 페이지 수를 줄이는 코드를 만들었습니다. 이 예에서는 45에서 34 사이입니다.

여기에 이미지 설명을 입력하십시오

이것이 달성 할 수있는 최상의 결과인지 확실하지 않습니다.

모든 점을 포착하기 위해 주어진 크기의 사각형 수를 최소화하기 위해 점을 뒤섞는 가장 좋은 전략 (의사 코드, 게시, Python 라이브러리)은 무엇입니까? 확실히 누군가가 게임 이론, 군사 예술 또는 낚시 산업에서 그것을 발견했습니다.

이것은 원래 질문으로 업데이트되었습니다.

필요한 실제 범위와 페이지 크기가 표시됩니다.

여기에 이미지 설명을 입력하십시오

164 페이지 중 10 페이지를 더 가까이서 확대

여기에 이미지 설명을 입력하십시오

샘플 포인트 기능 클래스

사각형 크기가 한계 내에 머 무르 자마자 변경 될 수 있습니다.


2
제 생각에는 일반 메쉬가 가장 좋습니다. 지도 독자들은 익숙하기 때문에 그런 것을 기대하고 있습니다. 다른 옵션은 혼잡하고 내 의견으로는 혼동됩니다. 원하는 것을 수행하는 최적화 알고리즘이 있지만 잠재 고객이 감사하게 생각하지는 않습니다. 당신이하려는 일에 감사하기 때문에 +1입니다. 마지막으로, 페이지 수를 줄이는 한 가지 방법은 배율을 변경하는 것입니다.
Fezter

나는 대부분 Fezter에 동의합니다. 비 연속지도 책이있는 경우가 있으며 답변을보고 싶습니다 (공유하려는 경우 현재 코드도 포함). 예를 들어, 각 트레일을 자체지도에 표시하고 다른 트레일을 표시하는 데 신경 쓰지 않는 트레일 북 (모두 상대적으로 작은 위치의 단일 맵을 원할 수도 있음). 그냥 내가이 경우에 당신이 생각하는 당신의 예제 이미지를보고 점은 고유의 그룹화 속성이되지 아니하는 한,이 엑스트라를 의미하는 경우에도, 페이지 사이에 계속 가입을 할 수 있습니다.
크리스 W

@Fezter, 페이지 크기가 전체 범위에 필적 할 때 일반 메쉬가 작동합니다.이 범위와 크기 변경은 여기에 해당되지 않습니다
FelixIP

1
@ MichaelMiles-Stimson, Avenue를 사용하여 수행 한 작업은 Python에서 수행 할 수 있습니다. 기하학 게임에서 전자는 여전히 우수하기 때문에 전자를 사용했습니다. 선택 점, 가장 가까운 맨해튼 거리 이웃을 찾고, 다 지점을 만들고, 범위를 얻습니다. 범위를 초과하면 종료하십시오. 원본 목록에서 그룹을 제거하고 남은 작업을 진행하십시오. 정렬 순서가 중요하다고 생각하고 변경하려고했습니다. 아주 작은 차이 ...
FelixIP

1
예, 파이썬에서 상당한 노력을 기울일 수 있습니다. 기하학을 다룰 때 C #에서 ArcObjects를 선호합니다. 크리스가 말했듯이, 그들은 이미 아주 최소한으로 보이며 왜 당신이 가진 것을 고수하고 그것을 부르지 않습니까?
Michael Stimson

답변:


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()

설문 조사 계획에 최근에 적용 :

여기에 이미지 설명을 입력하십시오

최신 정보:

'스트레이 (stray)'지점을 먼저 다루는 일부 패턴의 경우가는 길인 것 같습니다. 나는 '볼록 껍질'껍질을 사용하여 그것들을 식별했습니다. whuber의 아이디어는 게시물을 찾을 수 없습니다. 죄송합니다.

여기에 이미지 설명을 입력하십시오


이것은 당신이 찾고있는 @whuber의 게시물입니까? gis.stackexchange.com/a/161855/115
PolyGeo

네 그렇습니다. "헌트"시작 전에 포인트를 정렬하는 데 사용했습니다. 내일 내 답변을 업데이트하겠습니다. 데스크탑 없이는 쉽지 않음
FelixIP

2

이것은 Set Cover Problem 과 밀접한 관련이 있는 Maximum Coverage Problem 의 기하학적 버전처럼 보이며 ,이 두 가지는 NP-Complete입니다.

그래서 그것을 풀기 위해 근사법을 사용할 수 있습니다. 나는 다음 알고리즘을 시도하고 완벽하게 작동하는 것 같습니다. 문제의 복잡성으로 인해 최상의 답변을 찾을 수 없습니다.

  1. Foreach 점은 임의의 거리에서 N = 10 직사각형을 생성합니다. 사각형이 점을 덮고 있는지 확인하십시오 (각 사각형에는 하나 이상의 점이 있고 각 점은 하나 이상의 사각형에 속합니다)
  2. 모든 점이 덮일 때까지 반복하십시오. 커버 포인트로 표시하십시오.

이 알고리즘의 구현은 서클 전용입니다. http://jsfiddle.net/nwvao72r/3/


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.