วิธีการแสดงข้อมูล azimuthal ด้วยความไม่แน่นอน?


10

ฉันพยายามทำให้ร่างแสดงข้อมูล azimuthal ด้วยช่วงความไม่แน่นอนที่แตกต่างกันในแต่ละจุด รูปเก่าแก่ของโรงเรียนจากกระดาษ 1991 จับแนวคิด "bowtie plot" ที่ฉันตั้งเป้าไว้:

จาก Hillhouse และ Wells, 1991. "ผ้าแม่เหล็ก, ทิศทางการไหล, และพื้นที่แหล่งกำเนิดของยุคล่างพีชสปริงส์ Tuff ในรัฐแอริโซนา, แคลิฟอร์เนีย, และเนวาดา"

ข้อเสนอแนะใด ๆ เกี่ยวกับวิธีที่ฉันจะทำให้ร่างที่คล้ายกัน? ฉันเป็นมือใหม่ที่เกี่ยวข้องกับ GIS แต่ฉันสามารถเข้าถึง ArcGIS ผ่านมหาวิทยาลัยของฉันได้ ประสบการณ์ Arc ของฉันถูก จำกัด ในการสร้างแผนที่ทางธรณีวิทยาดังนั้นฉันจึงไม่ต้องทำอะไรแปลกใหม่เกินไป

ฉันแหย่ไปในตัวเลือกสัญลักษณ์ใน Arc และ QGIS แต่ไม่เห็นการตั้งค่าใด ๆ ที่ฉันคิดว่าจะทำงาน โปรดทราบว่านี่ไม่ได้เป็นเพียงเรื่องของการหมุนสัญลักษณ์รูปโบว์โดย azimuth; ช่วงเชิงมุมของ "bowtie" แต่ละอันจะต้องแตกต่างกัน

ฉันให้คะแนนทักษะ Python ของฉันเป็น 'strong ตัวกลาง' และทักษะ R ของฉันเป็น 'low middle' ดังนั้นฉันไม่รังเกียจที่จะแฮ็คข้อมูลบางอย่างร่วมกับmatplotlibและmpl_toolkits.basemapหรือไลบรารีที่คล้ายคลึงกันหากจำเป็น แต่ฉันคิดว่าฉันขอคำแนะนำที่นี่ก่อนที่จะลงไปที่ถนนในกรณีที่มีวิธีแก้ปัญหาที่ง่ายกว่าจาก GIS-land ที่ฉันไม่เคยได้ยินมาก่อน


อะไรคือข้อมูลสำหรับ 'bowtie' แต่ละอัน? ฉันถือว่า lat / lon / elevation แต่อาร์คคืออะไร พวกเขาสะท้อนเรื่องจุดนี้หรือไม่?
Simbamangu

ใช่แต่ละจุดคือ lat / long, azimuth ("การนัดหยุดงาน" ในแง่ธรณีวิทยา) รวมถึงความไม่แน่นอนบางอย่างเกี่ยวกับมูลค่าของ azimuth ตัวอย่างเช่นถ้าฉันมีจุดที่มี az = 110 และความไม่แน่นอนที่ 10 องศาฉันต้องการ 'bowtie' ที่มีสีในมุมระหว่างจาก100->120พร้อมกับช่วงที่เท่ากัน 180 องศาที่180->200
jurassic

คำตอบ:


10

สิ่งนี้ต้องการรูปแบบ "การคำนวณภาคสนาม" ซึ่งค่าที่คำนวณได้ (ขึ้นอยู่กับละติจูดลองจิจูดลองจิจูดอะซิมุ ธ กลางความไม่แน่นอนและระยะทาง) เป็นรูปทรง bowtie แทนที่จะเป็นตัวเลข เนื่องจากความสามารถในการคำนวณภาคสนามนั้นทำได้ยากขึ้นมากในช่วงการเปลี่ยนภาพจาก ArcView 3.x เป็น ArcGIS 8.x และไม่ได้รับการกู้คืนอย่างสมบูรณ์ในปัจจุบันเราใช้สคริปต์ใน Python, R หรืออะไรก็ตาม แต่กระบวนการคิดยังคงเป็น เหมือนกัน.

ฉันจะอธิบายด้วยRรหัสการทำงาน ที่แกนกลางของมันคือการคำนวณรูปร่าง bowtie ซึ่งเราจึงแค็ปซูลเป็นฟังก์ชั่น ฟังก์ชั่นนั้นง่ายมาก ๆ : ในการสร้างอาร์คสองอันที่ปลายธนูนั้นจำเป็นต้องติดตามลำดับในช่วงเวลาปกติ (ของราบ) สิ่งนี้ต้องการความสามารถในการค้นหาพิกัด (lon, lat) ของจุดที่อิงตามการเริ่มต้น (lon, lat) และระยะทางที่สำรวจ เสร็จแล้วด้วยรูทีนย่อยgotoซึ่งเกิดการยกแบบทางคณิตศาสตร์ทั้งหมด ที่เหลือก็แค่เตรียมทุกอย่างเพื่อนำไปใช้gotoแล้วนำไปใช้

bowtie <- function(azimuth, delta, origin=c(0,0), radius=1, eps=1) {
  #
  # On entry:
  #   azimuth and delta are in degrees.
  #   azimuth is east of north; delta should be positive.
  #   origin is (lon, lat) in degrees.
  #   radius is in meters.
  #   eps is in degrees: it is the angular spacing between vertices.
  #
  # On exit:
  #   returns an n by 2 array of (lon, lat) coordinates describing a "bowtie" shape.
  #
  # NB: we work in radians throughout, making conversions from and to degrees at the
  #   entry and exit.
  #--------------------------------------------------------------------------------#
  if (eps <= 0) stop("eps must be positive")
  if (delta <= 0) stop ("delta must be positive")
  if (delta > 90) stop ("delta must be between 0 and 90")
  if (delta >= eps * 10^4) stop("eps is too small compared to delta")
  if (origin[2] > 90 || origin[2] < -90) stop("origin must be in lon-lat")
  a <- azimuth * pi/180; da <- delta * pi/180; de <- eps * pi/180 
  start <- origin * pi/180
  #
  # Precompute values for `goto`.
  #
  lon <- start[1]; lat <- start[2]
  lat.c <- cos(lat); lat.s <- sin(lat)
  radius.radians <- radius/6366710
  radius.c <- cos(radius.radians); radius.s <- sin(radius.radians) * lat.c
  #
  # Find the point at a distance of `radius` from the origin at a bearing of theta.
  # http://williams.best.vwh.net/avform.htm#Math
  #
  goto <- function(theta) {
    lat1 <- asin(lat1.s <- lat.s * radius.c + radius.s * cos(theta))
    dlon <- atan2(-sin(theta) * radius.s, radius.c - lat.s * lat1.s)
    lon1 <- lon - dlon + pi %% (2*pi) - pi
    c(lon1, lat1)
  }
  #
  # Compute the perimeter vertices.
  #
  n.vertices <- ceiling(2*da/de)
  bearings <- seq(from=a-da, to=a+da, length.out=n.vertices)
  t(cbind(start,
        sapply(bearings, goto),
          start,
        sapply(rev(bearings+pi), goto),
          start) * 180/pi)
}

สิ่งนี้มีวัตถุประสงค์เพื่อนำไปใช้กับตารางที่มีระเบียนที่คุณต้องมีอยู่แล้วในบางรูปแบบ: แต่ละรายการจะให้ตำแหน่งตำแหน่งมุมราบความไม่แน่นอน หูกระต่าย. ลองจำลองตารางดังกล่าวโดยตั้งค่า 1,000 bowties ทั่วซีกโลกเหนือ:

n <- 1000
input <- data.frame(cbind(
  id = 1:n, 
  lon = runif(n, -180, 180),
  lat = asin(runif(n)) * 180/pi,
  azimuth = runif(n, 0, 360),
  delta = 90 * rbeta(n, 20, 70),
  radius = 10^7/90 * rgamma(n, 10, scale=2/10)
  ))

ณ จุดนี้สิ่งต่างๆเกือบจะง่ายเหมือนการคำนวณภาคสนาม นี่มันคือ:

  shapes <- as.data.frame(do.call(rbind, 
         by(input, input$id, 
            function(d) cbind(d$id, bowtie(d$azimuth, d$delta, c(d$lon, d$lat), d$radius, 1)))))

(การทดสอบเวลาระบุว่าRสามารถผลิตได้ประมาณ 25,000 จุดต่อวินาทีโดยค่าเริ่มต้นมีจุดสุดยอดหนึ่งจุดสำหรับแต่ละระดับของ azimuth ซึ่งผู้ใช้สามารถตั้งค่าได้ผ่านการepsโต้แย้งbowtie)

คุณสามารถพล็อตเรื่องง่ายของผลRการตรวจสอบในตัวเอง:

colnames(shapes) <- c("id", "x", "y")
plot(shapes$x, shapes$y, type="n", xlab="Longitude", ylab="Latitude", main="Bowties")
temp <- by(shapes, shapes$id, function(d) lines(d$x, d$y, type="l", lwd=2, col=d$id))

ลงจุดใน R

ในการสร้างเอาต์พุต shapefile สำหรับนำเข้า GIS ให้ใช้shapefilesแพ็คเกจ:

require(shapefiles)
write.shapefile(convert.to.shapefile(shapes, input, "id", 5), "f:/temp/bowties", arcgis=T)

ตอนนี้คุณสามารถฉายผลลัพธ์ ฯลฯ ตัวอย่างนี้ใช้การประมาณการภาพสามมิติของซีกโลกเหนือ (ถ้าคุณดูอย่างรอบคอบที่ 180 / -180 องศาลองจิจูดคุณจะเห็นว่า GIS นี้ได้ตัดความสัมพันธ์ที่โค้งคำนับที่ข้ามเส้นนี้นั่นเป็นข้อบกพร่องทั่วไปของ GISes แต่มันไม่ได้สะท้อนถึงข้อผิดพลาดในRโค้ด)

ลงจุดใน ArcView

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