กำลังคำนวณสถิติโฟกัสสำหรับพื้นที่ใกล้เคียงพิเศษหรือไม่


18

ฉันต้องการคำนวณสถิติโฟกัสสำหรับแต่ละแรสเตอร์ของแต่ละเซลล์ภายในละแวกบ้านตามเกณฑ์ที่กำหนด

ความเป็นมา - ฉันมีแรสเตอร์ไบนารีสองตัวแต่ละตัวแสดงประเภทพืชที่น่าสนใจเพียงชนิดเดียว ฉันต้องการคำนวณเปอร์เซ็นต์ความครอบคลุมของพืชแต่ละชนิดภายใน (เช่น) 20 กม. ^ 2 ของเซลล์ใด ๆ ในพื้นที่ศึกษาของฉัน (ผลรวม / เซลล์ทั้งหมดในละแวกใกล้เคียง) ปัญหาคือฉันไม่สามารถใช้วงกลมหรือสี่เหลี่ยมจัตุรัสรอบ ๆ แต่ละเซลล์ได้เพราะถ้าฉันทำพื้นที่ค้นหาที่ใช้ในการคำนวณผลรวมจะรวมพื้นที่นอกเขตการศึกษาของฉันด้วย ข้อยกเว้นนี้มีความสำคัญเนื่องจากสถิติจะถูกใช้เป็นข้อมูลป้อนเข้าสำหรับแบบจำลองที่อยู่อาศัยและพื้นที่ที่อยู่นอกพื้นที่ศึกษาของฉันไม่สามารถพิจารณาที่อยู่อาศัยที่เป็นไปได้ รวมถึงพวกเขาจะให้ฉันสถิติที่ผิดพลาด ดังนั้นสิ่งที่ฉันnกำหนดโดยจำนวนของเซลล์ที่จำเป็นเพื่อให้ครอบคลุมพื้นที่เท่ากับขนาดใกล้เคียงของฉันต้องการ) ที่ตรงตามเกณฑ์ของฉัน เกณฑ์ที่ว่าพวกเขาจะไม่ตกอยู่ในพื้นที่ทำให้เป็นเมือง ฉันคิดว่าควรใช้รูปแบบเซลลูลาร์แบบอัตโนมัติ ฉันไม่เคยทำงานกับ CA มาก่อน

ฉันเดาว่าสิ่งที่ฉันต้องการคืออะไรเช่นรหัสเริ่มต้นหรือจุดในทิศทางที่ถูกต้อง


ตอบกลับความคิดเห็นด้านล่าง:

สมมติว่าฉันกำลังคำนวณสถิตินี้สำหรับเซลล์บนขอบเขตของไซต์การศึกษาของฉัน ถ้าฉันกำหนดทุกพื้นที่นอกพื้นที่ศึกษาของฉันให้เป็นศูนย์ (หรือเพิกเฉย NoData) จากนั้นฉันจะได้รับสถิติที่แสดงถึงครึ่งหนึ่งของพื้นที่ครอบคลุมของสมองที่ฉันสนใจดังนั้นเปอร์เซ็นต์ครอบคลุมในพื้นที่ ~ 10 km ^ 2 แทนพื้นที่ 20 กม. ^ 2 เนื่องจากฉันกำลังศึกษาขนาดของบ้านเป็นสิ่งสำคัญ ละแวกใกล้เคียงต้องเปลี่ยนรูปร่างเนื่องจากเป็นวิธีการที่สัตว์ดู / ใช้ภูมิทัศน์ หากพวกเขาต้องการ 20 กม. ^ 2 พวกเขาจะเปลี่ยนรูปร่างหรืออาณาเขตบ้านของพวกเขา ถ้าฉันไม่ตรวจสอบละเว้น NoData ผลลัพธ์ของเซลล์จะเป็น NoData - และ NoData จะไม่ช่วยอะไร


"PROGRESS" ณ วันที่ 10/24/2014

นี่คือรหัสที่ฉันใช้มาจนถึงตอนนี้ด้วย Shapely และ Fiona:

import numpy as np
import pprint
import shapely
from shapely.geometry import*
import fiona
from fiona import collection
import math

traps = fiona.open('C:/Users/Curtis/Documents/ArcGIS/GIS_Data/occurrence/ss_occ.shp', 'r')

study_area = fiona.open('C:/Users/Curtis/Documents/ArcGIS/GIS_Data/Study_Area.shp', 'r')
for i in study_area: #for every record in 'study_area'
        sa = shape(i['geometry']) #make a variable called 'sa' that is a polygon

grassland = fiona.open('C:/Users/Curtis/Documents/ArcGIS/GIS_Data/land_cover/polys_for_aa/class3_aa.shp', 'r')
pol = grassland.next()
gl = MultiPolygon([shape(pol['geometry']) for pol in grassland])

areaKM2 = 20
with traps as input:
    r = (math.sqrt(areaKM2/math.pi))*1000
    for point in input:
        pt = shape(point['geometry'])
        pt_buff = pt.buffer(r)
        avail_area = pt_buff.intersection(sa).area
        # works to here
        while avail_area < areaKM2:
            r += 10
            pt_buff = pt.buffer(r)
            avail_area = pt_buff.intersection(sa).area

        perc_cov = pt_buff.intersection(gl).area//areaKM2
        print perc_cov

น่าเสียดายที่มันช้าลงอย่างไม่น่าเชื่อ


1
นั่นเป็นปัญหาที่น่าสนใจ คุณสามารถตั้งค่าเซลล์ทั้งหมดนอกพื้นที่ศึกษาของคุณเป็น NoData แต่ฉันไม่รู้ว่าคุณจะได้รับพื้นที่ใกล้เคียงในการปรับตัวและรักษาขนาด 20 ตารางกิโลเมตรเหมือนเดิมได้อย่างไร (มันจะต้องเปลี่ยนรูปร่าง)
jbchurchill

@CSB jbchurchill ถูกต้องสิ่งที่ดีที่สุดที่จะทำที่นี่คือการกำหนดค่า NoData นอกพื้นที่ศึกษาของคุณ เครื่องมือ Focal Stats สามารถจัดการค่า nodata เหล่านั้นได้อย่างเหมาะสม ดู 'การประมวลผลเซลล์ของ NoData' ที่นี่resources.arcgis.com/th/help/main/10.1/index.html#//…
WhiteboxDev

@WhiteboxDev - ข้อเสนอแนะของคุณจะไม่แก้ปัญหาของฉัน ฉันจะแก้ไขด้านบนและอธิบายสาเหตุที่ใช้ไม่ได้
CSB

คุณเคยเห็นโพสต์นี้ซึ่งกล่าวถึงการใช้สถิติโฟกัสที่มีรัศมีตัวแปร ( gis.stackexchange.com/questions/34306/… )? นี่น่าจะเป็นปัญหาของคุณ - เซลล์บนขอบควรมีรัศมีขนาดใหญ่และพิจารณาเฉพาะย่านละครึ่งวงกลม แน่นอนขึ้นอยู่กับขนาดมือถือของคุณคุณอาจต้องสร้างแรสเตอร์ให้เลือกมากมาย
phloem

1
@CSB คุณจะพบกับเอฟเฟกต์ขอบโดยไม่คำนึงว่าคุณใช้ NoData และละแวกที่หดหู่หรือหากคุณเปลี่ยนรูปร่าง / ตำแหน่งของละแวกของคุณเพื่อให้แน่ใจว่ามีขนาด อย่างน้อยในอดีตคุณจะไม่ถูกสุ่มตัวอย่าง / แสดงข้อมูลใกล้ขอบอย่างไม่โปร่งใส นี่เป็นส่วนหนึ่งของปัญหาหน่วย Areal ที่แก้ไขได้ที่น่าอับอาย
WhiteboxDev

คำตอบ:


0

โค้ดด้านบนนี้เป็นคำตอบสุดท้ายและไม่สมบูรณ์คำตอบที่ฉันได้รับสำหรับปัญหานี้ ในที่สุดฉันคิดว่าวิธีที่ดีที่สุดคือการใช้พื้นที่ใกล้เคียงแบบวงกลมและคำนวณพื้นที่ที่ตัดกันพื้นที่ "ว่าง" ของฉัน (ย่านวงกลมจะให้เซลล์ที่ใกล้เคียงที่สุด ~ ~ ดังนั้นไม่จำเป็นต้องแฟนซีด้วย Cellular Automata) หากพื้นที่มีขนาดเล็กเกินไปฉันจะขยายวงกลมจนไม่ได้

มันใช้งานได้ดี แต่อย่างที่ฉันสังเกตเห็นมันช้ามาก ดูกระทู้นี้สำหรับคำแนะนำเกี่ยวกับวิธีเพิ่มความเร็ว เพิ่มประสิทธิภาพของรหัสสำหรับหุ่นดี ผมทำตามคำแนะนำที่นำไปสู่หัวข้อนี้ทำความเข้าใจเกี่ยวกับการใช้ดัชนีเชิงพื้นที่ ฉันไม่ได้จบการใช้ r-tree ในท้ายที่สุดเพราะฉันไม่เคยจบลงด้วยการใช้รหัส ฉันพบว่าฉันสามารถเข้าถึงปัญหาจากมุมที่แตกต่างอย่างสิ้นเชิงและช่วยตัวเองเวลา / พลังงานมากดังนั้นฉันทำ บางทีฉันจะจบมันสักวัน ...


การอ่านโค้ดของคุณดูเหมือนว่ามีโอกาสที่ดีที่การใช้ดัชนีเชิงพื้นที่อาจทำให้โค้ดเร็วขึ้นอย่างมาก ทำการตัดกันกับ MultiPolygon เช่นนั้นช้ามาก
Snorfalorpagus

@Snorfalorpagus ใช่ถ้าคุณดูคำตอบฉันชี้ไปที่กระทู้อื่นสองหัวข้อที่เกี่ยวข้องกับคำถามนี้ ทั้งสองหารือกันโดยใช้ดัชนีเชิงพื้นที่
CSB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.