Giảm thiểu số lượng trang động để ánh xạ các điểm phân tán bằng ArcGIS Desktop?


10

Thỉnh thoảng tôi phải sản xuất bản đồ để thể hiện những điểm thú vị. Bước đầu tiên để tạo trang, sử dụng lưới thông thường:

nhập mô tả hình ảnh ở đây

Tôi không thích giải pháp vì a) có một số trang có một điểm duy nhất (ví dụ trang 25) ngồi ở rìa và b) quá nhiều trang.

Vấn đề đầu tiên rất dễ khắc phục bằng cách sử dụng mã, - di chuyển hình chữ nhật của phạm vi trang đến trung tâm của phạm vi điểm có liên quan:

nhập mô tả hình ảnh ở đây

Tôi vẫn không thích nó, nó trông rất đông vì số trang vẫn giữ nguyên. Hãy nhớ rằng, tất cả chúng cuối cùng là các trang giấy A3 thực tế trong nhiều bản sao của báo cáo!.

Vì vậy, tôi đã nấu một mã làm giảm số lượng trang. Trong ví dụ này từ 45 đến 34.

nhập mô tả hình ảnh ở đây

Tôi không chắc đây có phải là kết quả tốt nhất có thể đạt được hay không,

Chiến lược tốt nhất (mã giả, xuất bản, thư viện Python) để xáo trộn qua các điểm để giảm thiểu số lượng hình chữ nhật có kích thước nhất định để nắm bắt tất cả các điểm là gì? Chắc chắn, ai đó đã phát hiện ra nó trong lý thuyết trò chơi, nghệ thuật quân sự hoặc ngành công nghiệp đánh cá

Đây là cập nhật cho câu hỏi ban đầu:

Điều này cho thấy mức độ thực và kích thước trang yêu cầu:

nhập mô tả hình ảnh ở đây

Thu phóng gần hơn hiển thị 10 trên 164 trang:

nhập mô tả hình ảnh ở đây

Lớp tính năng điểm mẫu

Kích thước hình chữ nhật có thể thay đổi ngay khi nó nằm trong giới hạn, tức là nhỏ hơn là ổn.


2
Theo tôi, lưới thường xuyên là lựa chọn tốt nhất. Người đọc bản đồ đang mong đợi một cái gì đó như thế bởi vì họ đã quen với nó. Các lựa chọn khác là đông đúc và, theo tôi, khó hiểu. Chắc chắn có các thuật toán tối ưu hóa sẽ làm những gì bạn muốn, nhưng tôi không nghĩ khán giả của bạn sẽ đánh giá cao chúng. +1 mặc dù vì tôi đánh giá cao những gì bạn đang cố gắng làm. Cuối cùng, một cách để giảm số lượng trang là thay đổi tỷ lệ.
Fezter

Tôi hầu hết đồng ý với Fezter. Có những trường hợp một cuốn sách bản đồ không liên tục có vị trí của nó và tôi sẽ quan tâm để xem câu trả lời (ngay cả mã hiện tại của bạn nếu bạn muốn chia sẻ). Ví dụ: một cuốn sách về những con đường mà bạn muốn mỗi con đường trên bản đồ của riêng mình và không quan tâm đến việc hiển thị những con đường khác (mặc dù bạn vẫn có thể muốn một bản đồ đơn tỷ lệ nhỏ hơn hiển thị tất cả chúng ở vị trí tương đối). Chỉ cần nhìn vào hình ảnh ví dụ của bạn, tôi nghĩ trong trường hợp này bạn sẽ muốn có độ phủ liên tục giữa các trang, ngay cả khi nó có nghĩa là bổ sung, trừ khi các điểm có thuộc tính nhóm vốn có.
Chris W

@Fezter, lưới thông thường hoạt động khi kích thước trang tương đương với tổng mức độ, cả điều này và thay đổi quy mô không phải là trường hợp ở đây
FelixIP

1
@ MichaelMiles-Stimson, những gì tôi đã thực hiện khi sử dụng Avenue là có thể thực hiện được trong Python. Được sử dụng trước đây vì trong trò chơi hình học trước đây vẫn vượt trội. Chọn điểm, tìm hàng xóm khoảng cách gần nhất, tạo đa điểm, lấy phạm vi. Bỏ nếu quá mức. Đã xóa nhóm khỏi danh sách ban đầu, tiến hành còn lại. Tôi nghĩ thứ tự sắp xếp quan trọng, đã cố gắng thay đổi. Rất ít sự khác biệt ...
FelixIP 20/07/2015

1
Có, nó có thể làm được với trăn với nỗ lực đáng kể. Khi giao dịch với hình học, tôi thích ArcObjects trong C #. Như Chris nói họ đã trông khá tối giản tại sao không gắn bó với những gì bạn đã có và gọi nó là xong.
Michael Promotionson

Câu trả lời:


4

Đây không phải là câu trả lời, tôi chỉ nghĩ rằng tôi đăng giải pháp Python cho những ai quan tâm:

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

áp dụng nó gần đây cho kế hoạch khảo sát:

nhập mô tả hình ảnh ở đây

CẬP NHẬT:

Dường như đối với một số mô hình xử lý các điểm 'đi lạc' trước tiên là cách để đi. Tôi đã sử dụng vỏ 'vỏ lồi' để xác định chúng, ý tưởng về whuber, không thể tìm thấy bài đăng, xin lỗi.

nhập mô tả hình ảnh ở đây


Đây có phải là bài viết của @whuber mà bạn đang tìm kiếm không? gis.stackexchange.com/a/161855/115
PolyGeo

Vâng, đúng vậy. Tôi đã từng sắp xếp điểm trước khi "săn" bắt đầu. Tôi sẽ cập nhật câu trả lời của riêng tôi vào ngày mai. Không dễ dàng khi không có máy tính để bàn
FelixIP

2

Đây trông giống như một phiên bản hình học của Vấn đề Bảo hiểm Tối đa có liên quan chặt chẽ với Vấn đề Đặt bìa và hai vấn đề này là NP-Complete.

Vì vậy, để giải quyết nó, người ta có thể sử dụng xấp xỉ. Tôi sẽ thử thuật toán sau và nó dường như hoạt động hoàn hảo. Mặc dù do sự phức tạp của vấn đề, chúng ta không thể tìm thấy câu trả lời tốt nhất.

  1. Điểm Foreach tạo N = 10 hình chữ nhật trong khoảng cách ngẫu nhiên; chỉ để đảm bảo hình chữ nhật bao phủ điểm (mỗi hình chữ nhật có ít nhất một điểm thuộc về nó và mỗi điểm thuộc về ít nhất một hình chữ nhật)
  2. Lặp lại cho đến khi tất cả các điểm được che phủ: lấy hình chữ nhật bao gồm số điểm tối đa không được che chắn. Đánh dấu điểm như được bảo hiểm.

triển khai thuật toán này, chỉ dành cho vòng tròn, có tại đây: http://jsfiddle.net/nwvao72r/3/


1
Bạn có thể quan tâm đến gis.stackexchange.com/q/227344/115 nếu bạn chưa thấy nó.
PolyGeo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.