2011|08|
2013|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|05|06|07|08|09|10|11|12|
2016|01|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|

2018-12-07 プロキシサーバに接続しています 資格情報 うっとうしい [長年日記]

(1)IEを起動するかコントロールパネルから[インターネットオプション]を起動

(2)[接続]タブの[LANの設定]ボタンをクリック

(3)プロキシの設定がされている前提で[詳細設定]ボタンをクリック

(4)下部の例外入力エリアにoffice15client.microsoft.comを設定して完了


2018-12-01 Lenovo Ideapad 120S の液晶パネル交換 [長年日記]

必要な場面まで、適当に進めて下さい。

交換パネルはAmazonで購入しましたが、実際のところ使えるかどうかは、賭けでした(運がよかった)。

接続部分が小さくて、これを見つけるのに、随分時間がかかりました。私の場合、老眼鏡に加えて、虫めがねがなければ、作業できませんでした。

難しかったのは、交換パネルを接続する時です。これもインターフェースのコネクタを近づけて、はまった気がしたら、すばやく金具でロックしてみて下さい。時間かけて、何度でも繰り返せば、そのうちはまります。


2018-11-29 見積の取得方法 [長年日記]


2018-11-16 postGISでのワーシャルフロイド法の使い方 [長年日記]

■ワーシャルフロイド法の使い方
 
Floydのアルゴリズムとも呼ばれるFloyd-Warshallアルゴリズムは、密集グラフのグラフのノードの各ペアの最短経路のコストの合計を計算するのに適しています。
 
主な特徴は次のとおりです。
 
・パスを返しません。
・グラフ内のノードの各ペアに対する最短経路のコストの合計を返します。
・プロセスは肯定的なコストのエッジでのみ実行されます。
・Boostは、V×V行列を返します。ここで、無限大の値です。 パスがない頂点間の距離を表します。
・無限大以外の値のみを(start_vid、end_vid、agg_cost)のセットの形で返します。
・戻り値がテーブルに格納されている場合は、一意のインデックスは(start_vid、end_vid)のペアになります。
・無向グラフの場合、結果は対称です。
・(u、v)のagg_costは(v、u)と同じです。
・start_vid = end_vidのとき、agg_cost = 0。
・推奨されているのは、3500エッジ以下のバウンディングボックスを使用することです。
 
-----
 
SELECT * FROM pgr_floydWarshall('SELECT gid, source, target, cost FROM ways where gid = 10' );
 
 start_vid | end_vid |       agg_cost
-----------+---------+-----------------------
        95 |      23 |   0.00093223435894817
        23 |      95 |   0.00093223435894817
      4506 |       1 |  0.000788520466807583
         1 |    4506 |  0.000788520466807583
      3221 |       2 | 2.70185121784218e-005
         2 |    3221 | 2.70185121784218e-005
      1724 |       3 |   0.00037710190931161
         3 |    1724 |   0.00037710190931161
       196 |       4 |   0.00036557605227385
       196 |    1800 |   0.00100402907325107
         4 |     196 |   0.00036557605227385
         4 |    1800 |  0.000638453020977218
      1800 |     196 |   0.00100402907325107
      1800 |       4 |  0.000638453020977218
      4099 |       5 |   0.00030819351844984
         5 |    4099 |   0.00030819351844984
      1458 |       6 |  0.000280440956354741
      1458 |    2417 |   0.00131019044532306
         6 |    1458 |  0.000280440956354741
         6 |    2417 |   0.00102974948896831
      2417 |    1458 |   0.00131019044532306
      2417 |       6 |   0.00102974948896831
(22 行)
 
感想 
  何やっているのか、さっぱり分からん
 
 
 
SELECT * FROM pgr_floydWarshall('SELECT gid, source, target, cost FROM ways')  WHERE start_vid = 9 and end_vid = 24;
 
 
 start_vid | end_vid |     agg_cost
-----------+---------+-------------------
         9 |      24 | 0.180760172336233
 
なんか出てきたが、酷く時間がかかった。
 

2018-11-15 postGISでのA*の使い方 [長年日記]

kashiwanoha_routing=# SELECT * FROM pgr_astar('SELECT gid as id, source, target, cost_s As cost, x1, y1, x2, y2 FROM ways', 100, 159);
 seq | path_seq | node | edge |       cost        |     agg_cost
-----+----------+------+------+-------------------+------------------
   1 |        1 |  100 | 2168 |   8.5892500035812 |                0
   2 |        2 | 1571 | 4424 |  1.10979209576821 |  8.5892500035812
   3 |        3 | 3232 | 9213 | 0.440968020162748 | 9.69904209934941
   4 |        4 | 6708 |  217 |  2.29065882200656 | 10.1400101195122
   5 |        5 |  159 |   -1 |                 0 | 12.4306689415187
(5 行)

2018-11-14 QGIS 右側 ウィンドウ 物件情報 [長年日記]


2018-11-05 ホームページのフルバックアップ [長年日記]

Login by SSH
 
cd /home/kobore
 
cp -r www www2  // Don't touch "www" itself
tar -czvf www2.tgz www2
mv www2.tgz www.kobore.net.20181102.tgz 
 
rm -r www2    // Never delete directory "www" 
 
After that, bring "www.kobore.net.20181102.tgz" into a PC  

2018-11-02 postGIS の ST_Distance, ST_DWithinを使ったサンプルコード [長年日記]


2018-11-01 便利なpostGIS関数 [長年日記]

_ 便利なpostGIS関数

■2点間の距離の算出

float ST_Distance(geometry g1, geometry g2);

float ST_Distance(geography gg1, geography gg2);

============

139.46383010 35.6078055 と 139.48004430 35.58936550 の距離を求めろ

============

SELECT ST_Distance('SRID=4326;POINT(139.46383010 35.6078055)'::GEOGRAPHY,'SRID=4326;POINT(139.48004430 35.58936550)'::GEOGRAPHY);

st_distance

---------------

2518.87992511 (単位はメートル)

(1 行)

SELECT ST_Distance(ST_Transform(ST_GeomFromText('POINT(139.46383010 35.6078055)',4326),26986),ST_Transform(ST_GeomFromText('POINT(139.48004430 35.58936550)',4326),26986));

st_distance

-----------------

2534.9890933572 (単位はメートル)

(1 行)

============

点(139.46507, 35.59577)と source 608 の距離を求めろ

============

SELECT ST_Distance('SRID=4326;POINT(139.46507 35.59577)'::GEOGRAPHY, the_geom) from ways where source = 608;

st_distance

-------------

48.64958043 (単位はメートル)

(1 行)

■点と線の最短距離の算出

===================

点(139.46383010 35.6078055) と

線(139.47364070 35.59500190),(139.47500790 35.59561250),(139.47618950 35.59667510) の # 3点は繋がっている

最短距離を求めろ

===================

SELECT ST_Distance('SRID=4326;POINT(139.46383010 35.6078055)'::GEOGRAPHY,'SRID=4326;LINESTRING(139.47364070 35.59500190,139.47500790 35.59561250, 139.47618950 35.59667510)'::GEOGRAPHY);

st_distance

---------------

1667.13188667 (単位はメートル)

(1 行)

■任意の座標に近いノードを抽出

boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);

boolean ST_DWithin(geography gg1, geography gg2, double precision distance_meters);

===============

点(139.47500790 35.59561250)から半径300メートル以内の全部のノードを、近い順に出せ

===============

SELECT source, x1 as longitude, y1 as latitude, ST_Distance('SRID=4326;POINT(139.47500790 35.59561250)'::GEOGRAPHY, the_geom) as dist FROM ways WHERE ST_DWithin(the_geom, ST_GeographyFromText('SRID=4326;POINT(139.47500790 35.59561250)'), 300.0) ORDER BY dist;

source | longitude | latitude | dist

--------+-------------+------------+--------------

277 | 139.4742202 | 35.5952626 | 0

342 | 139.4737614 | 35.5960846 | 0

554 | 139.4750079 | 35.5956125 | 0

554 | 139.4750079 | 35.5956125 | 0

465 | 139.4756076 | 35.5956018 | 54.35238655

465 | 139.4756076 | 35.5956018 | 54.35883189

148 | 139.4753681 | 35.5942035 | 62.47683957

488 | 139.4755625 | 35.595278 | 62.47683957

277 | 139.4742202 | 35.5952626 | 78.20859781

309 | 139.4758617 | 35.5957534 | 78.9363046

309 | 139.4758617 | 35.5957534 | 78.9363046

163 | 139.4736407 | 35.5950019 | 81.2567669

597 | 139.4728928 | 35.5961536 | 81.2567669

406 | 139.4760808 | 35.5958841 | 101.79071989

211 | 139.4761077 | 35.5959027 | 104.73755527

580 | 139.4761706 | 35.5959419 | 111.52418485

201 | 139.4762056 | 35.5959637 | 115.32014973

(単位はメートル)


2018-10-31 postGISを使って、自動車を走らせてみよう [長年日記]

/////////////////////////////////////////
// 
//
// postGISを使って、自動車を走らせてみよう
// 
//
//
 
 
 
/*
 
gcc -g -I"D:\PostgreSQL\pg96\include" test1031.cpp -o test1031.exe -L"D:\PostgreSQL\pg96\lib" -llibpq -lwsock32 -lws2_32
 
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/types.h>
#include <math.h>
#include "libpq-fe.h"
 
struct BUS{  
  double p_x; // 現在のX座標
  double p_y; // 現在のY座標
};
 
#define rad2deg(a) ((a)/M_PI * 180.0) /* rad を deg に換算するマクロ関数 */
#define deg2rad(a) ((a)/180.0 * M_PI) /* deg を rad に換算するマクロ関数 */
 
double distance_km(double a_longitude, 
				   double a_latitude, 
				   double b_longitude, 
				   double b_latitude, 
				   double *rad_up)				   				 
{
  double earth_r = 6378.137;
 
  double loRe = deg2rad(b_longitude - a_longitude); // 東西  経度は135度
  double laRe = deg2rad(b_latitude - a_latitude); // 南北  緯度は34度39分
 
  double EWD = cos(deg2rad(a_latitude))*earth_r*loRe; // 東西距離
  double NSD = earth_r*laRe; //南北距離
 
  double distance = sqrt(pow(NSD,2)+pow(EWD,2));  
  *rad_up = atan2(NSD, EWD);
 
  return distance;
}
 
 
double diff_longitude(double diff_p_x, double latitude) 
{
  double earth_r = 6378.137;
  // ↓ これが正解だけど、
  double loRe = diff_p_x / earth_r / cos(deg2rad(latitude)); // 東西
  // 面倒なので、これで統一しよう(あまり差が出ないしね)
  //double loRe = diff_p_x / earth_r / cos(deg2rad(35.700759)); // 東西
  double diff_lo = rad2deg(loRe); // 東西
 
  return diff_lo; // 東西
}
  
double diff_latitude(double diff_p_y) 
{
  double earth_r = 6378.137;
  double laRe = diff_p_y / earth_r;  // 南北
  double diff_la = rad2deg(laRe); // 南北
  
  return diff_la; // 南北
}
 
 
 
int main (){
 
  // postGISとQGISで調べたノード番号(強制停車するバス停を擬制)
  int bus_stop_num[] = {115,104, 3, 62, 277,48, 213, 208, -1}; 
 
  const char *conninfo = "host=localhost user=postgres password=c-anemone dbname=city_routing";
  
  // データベースとの接続を確立する 
  PGconn *conn = PQconnectdb(conninfo);
  PGresult *res;
 
  // バックエンドとの接続確立に成功したかを確認する
  if (PQstatus(conn) != CONNECTION_OK){
	fprintf(stderr, "Connection to database failed: %s",
			PQerrorMessage(conn));
  }
 
  int cnt = 0; 
  int initial_flag = 1; 
 
  BUS test_bus; // バスの生成
 
  while (bus_stop_num[cnt] != -1){  // バス停単位の開始
	// printf("%d\n", bus_stop_num[cnt]);
	
	// SQL文字列格納用の配列
	char stringSQL[1024] = {0};  
	  
	// バス停とバス停の間のノードをダイクストラで計算する(node(source)とedge(gid)を取る)
	sprintf(stringSQL, "SELECT node, edge FROM pgr_dijkstra('SELECT gid as id, source, target, cost_s As cost, reverse_cost_s AS reverse_cost FROM ways', %d, %d, true );",bus_stop_num[cnt], bus_stop_num[cnt+1]);
 
	res = PQexec(conn, stringSQL);
	
	if (res == NULL){
	  fprintf(stderr, "failed: %s",
			  PQerrorMessage(conn));
	}
	
	// SELECTの場合戻り値は PGRES_TUPLES_OK.  これを確認しておく
	if (PQresultStatus(res) != PGRES_TUPLES_OK){
	  PQerrorMessage(conn);
	}
 
	int nFields = PQnfields(res);
 
	// バス停からバス停の間のノード番号の一つをゲットする処理
	for (int i = 0; i < PQntuples(res)-1  ; i++) {  // バス停とバス停の間のノードを全部出す
 
	  /* 
		 ここでは、両端のエッジの座標が必要になる。
		 pgr_dijkstraでは、エッジ(両端)情報(x1,y1,x2,y2)が取得できるのだけど、
		 どっちが先端でどっちが終端かが分からない。
 
		 そこで(恐しく迂遠だけえど)、まずエッジ情報(x1,y1,x2,y2)を得てから、
		 ノード情報(x1, y1)を取得する(ちなみにノード情報のx2,y2は、
		 交差点などの場合は複数出てくるので、信用してはならない)。
		 
		 で、ノード情報のx1,y1を先端として、エッジ情報のx1,y1とx2,y2と一致していない方を終端とする
		 という処理を取っている。
 
		 (もっと簡単な方法があったら、誰か教えて下さい)
 
	   */
 
	  double node[2] = {0.0}; // x1, y1
	  double edge[4] = {0.0}; // x1, y1, x2, y2
 
	  int dummy_int_1 = 0;
	  int dummy_int_2 = 0;
 
	  for (int j = 0; j < nFields; j++) { // (j=0:node(source)と j=1:edge(gid)の値をゲットする)
 
		// まずノードの方
		if (j == 0){//(j=0:node(source)
 
		  memset( stringSQL, 0, sizeof(stringSQL)); // 念の為クリア
		  sprintf(stringSQL, "SELECT x1,y1 from ways where source = %s;",
				  PQgetvalue(res, i, j)); // ノードの座標を得る
 
		  dummy_int_1 = atof(PQgetvalue(res, i, j));
 
		  PGresult *res2 = PQexec(conn, stringSQL);
		  if (res2 == NULL){
			fprintf(stderr, "failed: %s",
					PQerrorMessage(conn));
		  }
 
 
		  int nFields2 = PQnfields(res2);
 
		  for (int j2 = 0; j2 < nFields2; j2++) { // node(source)のx1,y1の2つの値
			// printf("%-15s", PQgetvalue(res2, 0, j2));
			node[j2] = atof(PQgetvalue(res2, 0, j2));  
		  }
 
		  PQclear(res2); // SQL文の発行に対して必ずクリアする
		}
 
		//次にエッジの方
		if (j == 1){//(j=1:edge(gid)
 
		  memset( stringSQL, 0, sizeof(stringSQL)); // 念の為クリア
		  
		  sprintf(stringSQL, "SELECT x1,y1,x2,y2 from ways where gid = %s;",
				  PQgetvalue(res, i, j)); // ノードの座標を得る
 
		  dummy_int_2 = atof(PQgetvalue(res, i, j));
 
		  PGresult *res2 = PQexec(conn, stringSQL);
		  if (res2 == NULL){
			fprintf(stderr, "failed: %s",
					PQerrorMessage(conn));
		  }
 
		  int nFields2 = PQnfields(res2);
 
		  for (int j2 = 0; j2 < nFields2; j2++) { // node(source)のx1,y1の2つの値
			// printf("%-15s", PQgetvalue(res2, 0, j2));
			edge[j2] = atof(PQgetvalue(res2, 0, j2));  
		  }
 
		  PQclear(res2); // SQL文の発行に対して必ずクリアする
 
		}
	  }
 
	  double start_x, start_y, end_x, end_y;
 
	  //出揃ったところで、始点と終点の判定を行う
	  if ((fabs(node[0] - edge[0]) < 1e-6) && (fabs(node[1] - edge[1]) < 1e-6)){
		start_x = edge[0];
		start_y = edge[1];
		end_x = edge[2];
		end_y = edge[3];
	  }else{
		start_x = edge[2];
		start_y = edge[3];
		end_x = edge[0];
		end_y = edge[1];
	  }
 
	  // printf("両端の確定 %f,%f,%f,%f\n", start_x, start_y, end_x, end_y);
 
	  //両端の進行方向(ベクトル)を計算する
	  double rad_up1;
	  distance_km(start_x, start_y, end_x, end_y, &rad_up1);
 
	  // 確定直後にバス位置は、出発点(start_x, start_y)に強制移動する
	  test_bus.p_x = start_x;
	  test_bus.p_y = start_y;
 
	  // ここから0.1m単位でグルグル回す
 
	  int do_flag = 0;
	  do{
		// printf("x=%-15f,y=%-15f\n",test_bus.p_x, test_bus.p_y);
		printf("%-15f,%-15f\n",test_bus.p_x, test_bus.p_y);
 
		// 以下の0.1は1サンプリング0.1メートルを擬制
		test_bus.p_x += diff_longitude(0.1 * cos(rad_up1), test_bus.p_y);	
		test_bus.p_y += diff_latitude(0.1 * sin(rad_up1));
		
		double rad0 = atan2((end_y - start_y),(end_x - start_x));
		double rad1 = atan2((end_y - test_bus.p_y),(end_x - test_bus.p_x));
		
		// ここは、http://kobore.net/over90.jpg で解説してある
 
		if (fabs(rad0 - rad1) >= 3.141592654 * 0.5){
		  // 終点越えの場合、終点に座標を矯正する
		  test_bus.p_x = end_x;
		  test_bus.p_y = end_y;
		  
		  do_flag = 1; // フラグを上げろ
		}
		
	  }while(do_flag == 0);
	  
	} // バス停とバス停の間のノードを全部出す
 
	PQclear(res); // SQL文の発行に対して必ずクリアする
 
	cnt += 1; // カウントアップ
 
  }// バス停単位の開始
}
syntax2html