2012-04-09 116 views
3

我有一些形状数据(熔合表和/或数据库列中的一系列kml文件),我想将它与另一个包含纬度经度的表合并点。基本上我想要一些方法来确定一个给定的经纬度点是否包含在kml形状的内部,如果是这样,保存对该行的参考。 我虽然也许有一种方法可以在融合表内做到这一点,但如果没有,也许有一种方法可以循环每个kml并测试是否包含经纬度点。我理解这并不是非常有效。 任何帮助,算法,服务等都会​​很棒。如何确定一个点是否位于kml或shape内

回答

3

Fusion Tables SQL API具有ST_INTERSECTS运算符,但只能找到CIRCLE或RECTANGLE中的点。 GMap V3有一个几何库,它有一个poly.containsLocation()方法,我认为它可以用于任意多边形。参见:GoogleMap geometry/poly library

P.S.我知道这不适合KML文件的工作,但他们确实含有可以变成GMAP多边形

+0

艳光四射,这是一个很好的开始 – user379468 2012-04-13 14:56:54

0

这可能是长久以来解决了多边形点,但我也有类似的问题,我想我会后我的解决办法。

我有两个Fusion表i)地址&数据和ii)多边形&数据。我希望能够轻松地查询以查找一个或多个多边形内的所有地址。我可以通过我的映射网页实时执行此操作,但决定最好事先查找相关的多边形,然后使用此数据执行我的映射查询(在Web界面中更快更轻松地指定多个多边形)。

因此,我将我的表格i)导出到Google表单的地址中,并创建了一个简短的脚本,用于检查地址所在的多边形并将其写回到Google表单。然后我更新了我的融合表我)。

我有一个近3000个地址和2000个多边形的数据集,所以它超时了几次,并且有几个地址错误,但这很容易解决,我只是将脚本设置为从第一行开始运行尚未更新。请注意,如果这些多边形彼此重叠,但这不会起作用,因为它们是地理边界;-)

我使用的代码在下面,也在要点here上。您显然需要更新表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)'); 
 
    } 
 
};

相关问题