2009年12月14日月曜日

Google Map上に線を描画する方法

今回はGoogle Map上に線を引く方法を解説する。



実際に動いているものは下記を参照して欲しい。
http://www.my-clip.net/Clip/Details/38

var lineColor = "#0000af";
var lineWeight = 3;
var lineOpacity = .8;
var points = [];
for (i = 0; i < markers.length; i++) {
var point = new GLatLng(markers[i].Latitude, markers[i].Longitude);
var marker = new GMarker(point)
marker.description = markers[i].Description;
map.addOverlay(marker);
GEvent.addListener(marker, &quot;click&quot;, function() {
openInfoWindow(this, this.description);
});
points.push(point);
}

var polyLine = new GPolyline(points, lineColor, lineWeight, lineOpacity);
map.addOverlay(polyLine);
}

上記のコードを見てもらえば分かるように地図上に線を描画するのは至極簡単だ。描画したい線の座標を順番にGLatLngの配列へと設定し、GPolylineのコンストラクタへ渡すだけで良い。

2009年12月9日水曜日

LinqToSqlでランダムセレクト

今回はLinqToSqlでレコードをランダムに取得する方法を解説する。ランダムに画像を複数件表示しなければならないときに実装した方法だ。

通常のSQLでは下記のようなクエリとなる。

select top 10 * from table order by NEWID()

これで10件のレコードをランダムに取得できる。これをLinqで記述すると下記になる。

partial class MyDataContext { 
     [Function(Name="NEWID", IsComposable=true)]  
     public Guid Random()  
     {
         throw new NotImplementedException();  
     } 
} 

var cust = (from row in db.Table
           order by db.Random() 
           select row).Take(10); 

元ネタはStack Overflowの下記のリンクだ。処理の詳細はSQL ServerのNEWID関数をRandomというDataContextの関数として実装し、前述のSQLをLinq上で再現している。

http://stackoverflow.com/questions/648196/random-row-from-linq-to-sql

上記リンク先でも指摘されているが、この方法は小さいテーブル用だ。多量のレコードに対して行うと大変な負荷をかけるので避けるようにしたい。大きいテーブル用のアプローチ方法としては全レコードに対してNEWIDするのではなく、ある程度小さくした集団に対して使用するべきだろう。上記リンク先にも大きいテーブル用のアプローチ方法が記載されいてるがここで紹介している内容と処理内容が異なるのでとくには解説しない。

ランダム、ランダムと書いていたらランダムがゲシュタルト崩壊してきた・・・。