いくつかの形状データ (フュージョン テーブルまたはデータベースの列にある一連の kml ファイル) があり、それを緯度経度ポイントを含む別のテーブルとマージしたいと考えています。基本的に、特定の緯度経度ポイントが kml シェイプに含まれているかどうかを判断する方法が必要です。含まれている場合は、その行への参照を保存します。おそらくフュージョン テーブル内からこれを行う方法があったと思いますが、そうでない場合は、各 kml をループして緯度経度ポイントがその中に含まれているかどうかをテストする方法があるかもしれません。私はこれがそれほど効率的ではないことを理解しています。ヘルプ、アルゴリズム、サービスなどは素晴らしいでしょう。
2 に答える
Fusion Tables SQL APIにはST_INTERSECTS演算子がありますが、CIRCLEまたはRECTANGLE内のポイントのみが検索されます。GMap V3には、任意のポリゴンで機能すると思われるpoly.containsLocation()メソッドを持つジオメトリライブラリがあります。参照:GoogleMapジオメトリ/ポリライブラリ
PSこれはKMLファイルでは機能しないことはわかっていますが、GMAPポリゴンに変換できるポリゴンポイントが含まれています
これはおそらく解決されてからずっと経っていますが、同様の問題があったので、解決策を投稿すると思いました。
i) アドレスとデータ、ii) ポリゴンとデータの 2 つの Fusion テーブルがありました。1 つ以上のポリゴン内のすべての住所を簡単に検索できるようにしたいと考えていました。マッピング Web ページを介してリアルタイムでこれを行うこともできましたが、事前に関連するポリゴンを検索し、このデータを使用してマッピング クエリを実行する方がよいと判断しました (Web インターフェースで複数のポリゴンをより速く簡単に指定できます)。
そのため、テーブル i) を住所とともに Google シートにエクスポートし、住所がどのポリゴンにあるかを確認して Google シートに書き戻す短い簡単なスクリプトを作成しました。次に、融合テーブルを更新しました i)。
3000 近くの住所と 2000 のポリゴンのデータ セットがあったため、数回タイムアウトし、いくつかの住所エラーが発生しましたが、これは簡単に修正でき、修正されていない最初の行からスクリプトを実行するように設定しただけです。更新されました。ポリゴンが互いに重なっている場合、これは機能しないことに注意してください。
私が使用したコードは以下にあり、要点はこちらにあります。明らかにテーブルIDを更新する必要があり、おそらくOAuthで何かをする必要があります(よくわかりませんでしたが、Googleの指示に従って完了しました)。
// replace with your fusion table's id (from File > About this table)
var TABLE_ID = 'xxxxxxxxxx';
// first row that has data, as opposed to header information
var FIRST_DATA_ROW = 2;
var FIRST_DATA_COLUMN = 11;
var LAT_COLUMN = 1;
var LNG_COLUMN = 2;
var SA2_COLUMN = 6;
var SA3_COLUMN = 7;
/**
* Uses a lat and lng data in google sheets to check if an address is within a kml polygon
* in a list of KML polygons in fusion (in this case ABS/ASGC SA2 and SA3 regions, but could be any polygon)
* the function then stores the ID/name of the relevant polygon in google sheets
* I could check this data in realtime as I render maps, but as it doesn't changed, figure its better to just record
* which polygon each address pertains to so its quicker and easier to search (in particular it mades it easier to write a query
* which identifies all the address within multiple polygons)
* in this case I had 3000 rows so it exceeded maximum execution times, so I just updated the first data row a couple of times
* when the execution time exceeded.
*/
function updateSA2ID() {
var tasks = FusionTables.Task.list(TABLE_ID);
var sqlResponse = '';
// Only run if there are no outstanding deletions or schema changes.
if (tasks.totalItems === 0) {
var sheet = SpreadsheetApp.getActiveSheet();
var latLngData = sheet.getRange(FIRST_DATA_ROW, FIRST_DATA_COLUMN, sheet.getLastRow(), sheet.getLastColumn());
i = 1;
// Loop through the current current sheet
for (i = 1; i <= latLngData.getNumRows(); i++) {
// cross reference to Fusion table
lat = latLngData.getCell(i,LAT_COLUMN).getValue();
lng = latLngData.getCell(i,LNG_COLUMN).getValue();
sqlString = "SELECT 'SA2 Code', 'SA3 Code' FROM " + TABLE_ID + " WHERE ST_INTERSECTS(geometry, CIRCLE(LATLNG(" + lat + ", " + lng + "),1)) ";
//Browser.msgBox('Lat ' + lat + ' Lng ' + lng + '; ' + sqlString, Browser.Buttons.OK);
sqlResponse = FusionTables.Query.sql(sqlString);
//Browser.msgBox('SQL Response ' + sqlResponse, Browser.Buttons.OK);
latLngData.getCell(i,SA2_COLUMN).setValue(sqlResponse.rows[0][0]); // set SA2
latLngData.getCell(i,SA3_COLUMN).setValue(sqlResponse.rows[0][1]); // set SA3
}
}
else {
Logger.log('Skipping row replacement because of ' + tasks.totalItems + ' active background task(s)');
}
};