เลือกเค้าโครงที่ความสูงเป็นจำนวนเต็มหรือไม่


18

ฉันมีคุณลักษณะรูปทรงคลาสที่มีช่วงเวลา 0.2 เมตร ฉันต้องการเลือกเฉพาะ Contours เหล่านั้นซึ่งอยู่ที่ช่วง 1 m หรือไม่

ฉันได้ลองใช้รูปแบบต่อไปนี้ในกล่องโต้ตอบ 'เลือกตามคุณสมบัติ' (ใน ArcMap) แต่มันเลือกรูปทรงทั้งหมด:

Mod("ELEVATION", 1)=0

ฉันควรเรียกใช้แบบสอบถามใด


ประหยัดเวลาได้มากสำหรับฉันขอบคุณจริงๆ! ไม่เคยเห็นรหัสแบบสอบถามนี้เช่น "Flor", "Elevation" และ "Mod"

คำตอบ:


22

เคล็ดลับง่ายๆในการเลือกเฉพาะค่าจำนวนเต็มคือใช้ไวยากรณ์ต่อไปนี้:

Mod(Round("ELEVATION", 0)*10, 10)=0

การคูณด้วย 10 ทำให้ค่าทั้งหมดเป็นจำนวนเต็มจากนั้นเราเลือกเฉพาะค่าที่เป็นทวีคูณของ 10

ในกรณีที่คุณต้องการเลือกทวีคูณของตัวเลขอื่นให้คูณ 10 ด้วยช่วงเวลา

  • ในการรับเส้นขอบรูปเป็นระยะ 5 เมตรให้ใช้:

    Mod(Round("ELEVATION",0) * 10, 50)=0

  • ในการรับเส้นขอบที่ระยะ 100 m ให้ใช้:

    Mod(Round("ELEVATION", 0) * 10, 1000)=0

อัปเดต
ตามคำแนะนำของ Whuber ที่ระบุไว้ในความคิดเห็นด้านล่างฉันได้เพิ่มฟังก์ชันการปัดเศษในนิพจน์แบบสอบถาม


6
ฉันไม่คิดว่าฉันจะเชื่อถือโซลูชั่นเหล่านี้ ปัญหาคือว่าด้วยช่วงเวลาที่ไม่ครบถ้วนของ 0.2 ฐานข้อมูลมีแนวโน้มที่จะเก็บไว้เป็นลอย ดังนั้นMODจะมีข้อผิดพลาดในการปัดเศษทศนิยม - และที่สำคัญที่นี่: หากคุณยังต่ำโดยตัวเลขที่สำคัญน้อยที่สุดMODอาจส่งคืนค่าที่ไม่ถูกต้อง (ขึ้นอยู่กับวิธีการใช้งาน) ฉันอยากจะแนะนำให้ปัดเศษค่าก่อนที่จะใช้MODเป็นวิธีการป้องกันข้อผิดพลาดเล็กน้อย (และร้ายกาจ) เหล่านี้
whuber

คุณต้องปัดเศษหลังจากคูณด้วย 10 แต่ก่อนจะหา mod
smithkm

1
หากฉันต้องการเลือกรูปทรงที่ช่วงเวลา 5m สูตรที่นำมาใช้ตามที่เขียนด้านบนจะเลือกไม่ใช่จำนวนเต็มที่ปัดเป็นตัวเลขที่สามารถหารได้อย่างเท่าเทียมกันด้วย 5 เช่น 14.5m และ 19.5m ถูกเลือก แต่ไม่ต้องการ สิ่งเหล่านี้ไม่ได้ถูกเลือกถ้าฉันทำส่วนของ 'Round' ทิ้ง
นาน

1
@delongtime หากคุณมีรูปทรงที่ควรจะมีระดับที่ไม่รวมอยู่เพียงแค่แก้ไขข้อโต้แย้งที่สองของROUNDเพื่อให้เกิดความแม่นยำมากขึ้นในการปัดเศษ
whuber

9

นี่คือตัวเลือกการสืบค้นอื่น มันส่วนใหญ่ทำเช่นเดียวกับคำตอบที่ระบุไว้ข้างต้น แต่ (ในความคิดของฉัน) ง่ายขึ้นเล็กน้อยในการปรับแต่งสำหรับสถานการณ์ที่แตกต่างกัน

หากต้องการแสดงรูปร่างที่หารด้วย 10

Floor(Elevation/10)=Elevation/10

เมื่อต้องการแสดงเส้นขอบใด ๆ ที่หารด้วย 50

Floor(Elevation/50)=Elevation/50

เพื่อแสดงรูปทรงครึ่งเมตร

Floor(Elevation/0.5)=Elevation/0.5

เมื่อต้องการแสดงเส้นโค้ง 10 เมตรพร้อมด้วยการชดเชยโดยอาร์บิท (เช่น 10.2, 20.2, 30.2)

Floor((Elevation-0.2)/10)=(Elevation-0.2)/10

ในตอนท้ายของวันนี้เป็นเพียงตัวเลือกอื่นที่ควรพิจารณา


2

นี่คือความหมายที่จะแสดงความคิดเห็นในคำตอบข้างต้น - ขอโทษ

ไวยากรณ์จะแตกต่างกันไปขึ้นอยู่กับชนิดของฐานข้อมูลของคุณจะถูกเก็บไว้ใน แต่วิธีการแก้ปัญหาที่กำหนดดูเหมือนจะเลือกรูปทรงหลังจากการปัดเศษค่าของพวกเขา ตัวอย่างเช่นในการทดสอบของฉันนี้ได้ชุดที่เลือกซึ่งรวม. 3 m และ. 4 m ในความเป็นจริงมันไม่รวมค่าใด ๆ

สมการนี้

Mod(Round("ELEVATION" * 10, 0), 2)=0

ให้ผลลัพธ์ที่ดูเหมือนกับสิ่งที่ผู้ถามถาม


1

เพื่อให้ได้รูปทรงดัชนีฉันใช้สิ่งนี้ในเครื่องคิดเลข

ใน ARCMAP

dim dIndexInterval
dim dCont
dim i
dim j
dim k
dim c

dIndexInterval = 200 ' set to interval of index contours
dCont = [level] ' Set to contour height field

i = ROUND(dCont, 0) * 10
j = dIndexInterval * 10
k = i MOD j

if k = 0 then
 c = 1 ' is an index contour
else
 c = 0 ' is not an index contour
end if

'พิมพ์ "c" (โดยไม่ใส่เครื่องหมายอัญประกาศ) ในช่องป้อนข้อความที่ด้านล่างของกล่องโต้ตอบแล้วคลิกตกลง

ใน QGIS

if(((round("level", 0) * 10) % (200 * 10)) = 0, 1, 0)

"" ระดับ "" ตั้งค่าเป็นเขตข้อมูลความสูงของเส้น "200" ตั้งค่าเป็นช่วงเวลาของรูปทรงดัชนี

จากนั้น: "1" เป็นรูปร่างของดัชนีและ "0" ไม่ใช่รูปทรงของดัชนี


0

คูณรูปร่างด้วย 10 แล้วมอดูลัส 10 โดยดูว่ามีเศษเหลือหรือไม่ หากไม่มีเศษเหลือเป็นจำนวนเต็มก็จะลอย

def contour_class(contour):
    if ((contour * 10) % 10) == 0:
        return "Integer"
    else:
        return "Float"

__esri_field_calculator_splitter__
contour_class(!Contour!)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.