日々適当

hibitekitou

位置をプロット

xsi |2014-10-29
世界遺産。ユネスコにより採択される遺跡で、そのリストはユネスコのサイトで配布されています。その中にはエクセルファイルもあって、そのエクセルファイルには、緯度・経度が記録されています。
というわけで、それを地図上にプロットするというのは、正距円筒図法に対しては非常に容易だったりします。

まずはエクセルファイルを読むためのモジュールをインストールです。xlrdってモジュールを入れればいいようです。使い方はネット上にいろいろあるんで省略。僕も良くわかってないし。ということで、これを使って、プロットしてやります。

from win32com.client import constants as c
import xlrd

app = Application

xlsfilePath = 'D:\Users\whc-sites-2014.xls' #ダウンロードしたエクセルファイルのパス

xLen = 200.0

book = xlrd.open_workbook( xlsfilePath )
sheet0 = book.sheet_by_index(0)

for col in range( sheet0.ncols ):
	if str( sheet0.cell( 0, col ).value ) == 'longitude':
		colLog = col
		
	elif str( sheet0.cell( 0, col ).value ) == 'latitude':
		colLat = col
		
posList = []
for row in range( 1, sheet0.nrows ):
	LogMessage(sheet0.cell( row, colLog ).value)
	xpos = (xLen * 0.5) * sheet0.cell( row, colLog ).value / 180.0
	zpos = (xLen * 0.5 * 0.5 ) * sheet0.cell( row, colLat ).value / -90.0
	posList.append( xpos )
	posList.append( 0.0 )
	posList.append( zpos )

oPntCloud = app.GetPrim("PointCloud", "", "", "")
oICETrees = app.ApplyOp("ICETree",oPntCloud,c.siNode)
oICETree = oICETrees(0)

oAddPoint = app.AddICENode("$XSI_DSPRESETS\ICENodes\AddPointNode.Preset", oICETree )
app.ConnectICENodes(oICETree.FullName + ".port1", oAddPoint.FullName + ".add")

oStrToArr = app.AddICENode("StringToArray", oICETree)
app.SetValue(oStrToArr.FullName + ".Value_string", str(posList)[1:-1], "")

app.ConnectICENodes(oAddPoint.FullName + ".positions1", oStrToArr.FullName + ".Result")


ここまでで、ICEツリー下図の赤四角で囲まれた範囲が作成されます。ポイントクラウドを作成するわけっすね。



で、その後、ポリゴンのコピーをそのポイント位置に置いていく予定ながら、面積を持ったものをおくと、隣と干渉しまくる密度の濃い地域があるんで、干渉を出来るだけ回避するために、赤四角以外の範囲のICEツリーを手動で組んでいます。

でもって、空のポリゴンメッシュに対してICEツリーで下図を作成するだけ。形状のソースとなるものは、単なる板ポリでございます。



これだけでいいんだもんなぁ。SI、楽だよねぇ。

コメント ( 0 )|Trackback ( )
 
コメント
 
コメントはありません。
コメントを投稿する
ブログ作成者から承認されるまでコメントは反映されません
 
名前
タイトル
URL
コメント
コメント利用規約に同意の上コメント投稿を行ってください。

数字4桁を入力し、投稿ボタンを押してください。