我有一些形状数据(熔合表和/或数据库列中的一系列kml文件),我想将它与另一个包含纬度经度的表合并点。基本上我想要一些方法来确定一个给定的经纬度点是否包含在kml形状的内部,如果是这样,保存对该行的参考。 我虽然也许有一种方法可以在融合表内做到这一点,但如果没有,也许有一种方法可以循环每个kml并测试是否包含经纬度点。我理解这并不是非常有效。 任何帮助,算法,服务等都会很棒。如何确定一个点是否位于kml或shape内
3
A
回答
3
Fusion Tables SQL API具有ST_INTERSECTS运算符,但只能找到CIRCLE或RECTANGLE中的点。 GMap V3有一个几何库,它有一个poly.containsLocation()方法,我认为它可以用于任意多边形。参见:GoogleMap geometry/poly library
P.S.我知道这不适合KML文件的工作,但他们确实含有可以变成GMAP多边形
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)');
}
};
相关问题
- 1. 确定点是否位于特定几何区域内
- 2. Javascript - 确定用户当前位置是否位于Google地图的KML层内
- 3. 确定是否一组点位于一个规则的网格
- 4. 使用Google Maps API V3,确定标记是否位于KML层边界内
- 5. 确定顶点是否位于相机的左侧或右侧
- 6. 确定点是否位于有界区域内的算法
- 7. 如何确定一个点是否是一个四边形
- 8. 如何确定内存是否属于堆或堆栈?
- 9. 如何知道点是否或多或少属于一个圆?
- 10. 如何检查一个点是否在KML多边形(GIS Shapefile)
- 11. 如何确定一个多边形是否在另一个内?
- 12. 如何确定一个元素是否“定位”?
- 13. 如何确定一系列点(或多边形)是否在矩形区域内?
- 14. 确定一个点是否在路上
- 15. Redis或Mongo确定一个数字是否在范围内?
- 16. 确定一个点是否在Raphael.js中的路径元素内
- 17. 确定一个节点是否存在于HTMLAgiltyPack
- 18. 确定一个ElementFinder是否与一个定位器匹配
- 19. 如何确定一个顶点是否有奇数或偶数的outE()?
- 20. 确定一个节点是否与另一个节点重叠
- 21. 如何快速确定点(纬度和经度)是否在一个国家内?
- 22. 如何确定一个网页是否有RSS或不在C#
- 23. 如何确定一个领域是否有焦点?
- 24. 确定点是否在多边形内
- 25. 如何确定一个坐标是否在mutilpolygon内?
- 26. 如何确定Task.Run是否在一个循环内完成
- 27. 如何找到一个点位于一条线或多边形内
- 28. 如何确定地址是否位于地图上的某些边界内?
- 29. 如何确定鼠标光标是否位于控件中
- 30. 确定是否编译ELF对象是32位或64位
艳光四射,这是一个很好的开始 – user379468 2012-04-13 14:56:54