不確実性を伴う方位角データを視覚化する方法は?


10

各点で不確実性の範囲が異なる方位角データを示す図を作成しようとしています。1991年の論文からのこのオールドスクールフィギュアは、私が目指している「ボウタイプロット」のアイデアを捉えています。

ヒルハウスアンドウェルズ、1991年より。

同様の図を作成する方法について何か提案はありますか?私はGISの初心者ですが、大学を通じてArcGISにアクセスできます。私のArcの経験は地質図の作成に限定されているので、あまりエキゾチックなことをする必要はありませんでした。

ArcとQGISのシンボルオプションをいろいろ調べてみましたが、その仕事をすると思われる設定は見ていません。これは、蝶ネクタイの形をしたシンボルを方位角で回転するだけの問題ではないことに注意してください。各「ボウタイ」の角度範囲は異なる必要があります。

私のPythonスキルは「強い中級」、Rのスキルは「中級」と評価しているので、必要に応じてmatplotlibmpl_toolkits.basemapまたは類似のライブラリと一緒に何かをハッキングするのを嫌いません。しかし、聞いたことのないGISランドからのより簡単な解決策がある場合に備えて、その道を進む前にここでアドバイスを求めたいと思いました。


各「ボウタイ」のデータは何ですか?緯度/経度/高度を想定していますが、弧とは何ですか?彼らはその点についてミラーリングされていますか?
シンバマング2012

ええ、各ポイントは緯度/経度、方位角(地質学用語では「ストライク」)、および方位角の値に不確実性があります。例えば私は「蝶ネクタイ」を必要AZ = 110と10度の不確実性を有する点を持っている場合、それとの間の角度の色100->120で180°離れた同等の範囲と一緒180->200
ジュラ

回答:


10

これには、計算された値(緯度、経度、中心方位角、不確実性、および距離に基づいて)が数値ではなくボウタイ形状である、一種の「フィールド計算」が必要です。このようなフィールド計算機能は、ArcView 3.xからArcGIS 8.xへの移行時にはるかに困難になり、完全に復元されていないため、現在では、Python、Rなどのスクリプトを使用しています。ただし、思考プロセスは依然として同じ。

作業Rコードで説明します。その中心は、蝶ネクタイの形状の計算です。そのため、関数としてカプセル化します。この関数は非常に単純です。弓の端に2つの弧を生成するには、一定の間隔(方位角)でシーケンスをトレースする必要があります。これには、始点(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のボウタイを配置して、このようなテーブルをシミュレートしましょう。

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

(タイミングテストでは、R1秒あたり約25,000の頂点を生成できることが示されています。デフォルトでは、方位角ごとに1つの頂点があり、への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でプロット

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.