ベストでもない位置プロバイダも含めて現在位置特定を行う
id:yellow_73:20110815#p1 および id:yellow_73:20110819#p2 のつづき。
ここまで言ってませんでしたが、今回の位置特定は、現在位置をワンショットで特定するもので、精度はあまり求めないものです。継続して精度良く現在位置を取得するものとは異なります。
ある条件を満たす、現在使用可能な位置プロバイダ名の一覧を取得するには、次のようにします。
LocationManager mLocationManager; // 生成しておいてね。 ... Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_COARSE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(false); criteria.setPowerRequirement(Criteria.NO_REQUIREMENT); criteria.setSpeedRequired(false); ListlocationProviderNameList = this.mLocationManager.getProviders( criteria, true);
で、これを片っ端からリクエストするようにしてやる。
for (String providerName : locationProviderNameList) { if (providerName != null) { this.mLocationManager.requestLocationUpdates( providerName, 0, 0, this); } }
で、どれでも見つかったら、リスナを引き抜く。
this.mLocationManager.removeUpdates(this)
メソッド呼び出し一回で全部の位置プロバイダから受信しなくなります。
いやインデクスは効かせられるのです
http://soudai1025.blogspot.com/2011/08/blog-post.html で、PostGISではインデクスが有効利用されない、とおっしゃってることについて、日本語や…それはともかく、ひとこと言わねばなるまい、ということで、つっこみを入れさせてもらいます。
PostGISでは、図形について、MBR(その図形を含む最小の長方形)ベースで、空間インデクスを付けられます。
点も幅・高さの無い長方形として空間インデクスを付けられます。
PostGISで、特定の範囲内にある点に絞って、指定した点からの距離を求めるクエリは、だいたいこんなかんじになります。
SELECT ST_Distance_Sphere(the_geom, 'SRID=4326;POINT(x y)'::Geometry) FROM table WHERE the_geom && ST_SetSRID('BOX2D(minx miny, maxx maxy)'::box2d, 4326);
'..POINT..'と'BOX2D...'は文字列リテラルです。なので、x,y と minx,miny,maxx,maxy とについては具体的な数を入れます。minx, miny とかは minx=x-rx, max=x+rx (rは半径(x方向)) といったかんじで求めます。
WHEREの "&&" で、minx,miny-maxx,maxy で描ける長方形の範囲で絞込みを行っています。これは空間インデクスが効きます。
指定した点から指定した距離内にある点を正確に絞り込む場合は検索範囲は円になりますが、長方形を使う場合は、円に外接する長方形となり、円よりも範囲が広くなります。円ベースでインデクスが効いた方が絞り込みの効率は良いと言えば良いですが、問題によりますが、若干絞り込み結果のレコード数が増えても、言うほど影響が出ないんじゃないかな、と思います。
なお、ここギコさんが http://kokogiko.net/m/archives/001641.html で「インデックスが効いていない」おっしゃってるのは、この関数では*1、空間インデクスが効かないから、です。