有另一种方法可以使用Google Earth Api来解决这个问题。我知道它是javascript,但我认为这是一个新颖的解决方法。
无论如何,我在这里提供了一个完整的工作解决方案 - 请注意,它也适用于河流: http://www.msa.mmu.ac.uk/~fraser/ge/coord/
我使用的基本思路是在Google Earth Api中实现GEView对象的hiTest方法。
看一下来自Google的hitest的以下示例。
http://earth-api-samples.googlecode.com/svn/trunk/examples/hittest.html
hitTest方法会提供一个屏幕上的随机点(以像素坐标表示),它会返回一个GEHitTestResult对象,其中包含与该点对应的地理位置信息。如果使用GEPlugin.HIT_TEST_TERRAIN模式调用该方法,则可以将结果限制为仅限于陆地(地形),只要我们筛选高度> 1m的点即可。
这是我使用的实现hitTest的函数:
var hitTestTerrain = function()
{
var x = getRandomInt(0, 200);
var y = getRandomInt(0, 200);
var result = ge.getView().hitTest(x, ge.UNITS_PIXELS, y, ge.UNITS_PIXELS, ge.HIT_TEST_TERRAIN);
var success = result && (result.getAltitude() > 1);
return { success: success, result: result };
};
显然,您还希望从全球任何地方获得随机结果(不仅仅是从单个视点可见的随机点)。为了做到这一点,在每次成功的
hitTestTerrain
调用后,我移动地球视图。这是通过使用一个小的辅助函数实现的。
var flyTo = function(lat, lng, rng)
{
lookAt.setLatitude(lat);
lookAt.setLongitude(lng);
lookAt.setRange(rng);
ge.getView().setAbstractView(lookAt);
};
最后,这里是一个简化的主要代码块,调用这两个方法。
var getRandomLandCoordinates = function()
{
var test = hitTestTerrain();
if (test.success)
{
coords[coords.length] = { lat: test.result.getLatitude(), lng: test.result.getLongitude() };
}
if (coords.length <= number)
{
getRandomLandCoordinates();
}
else
{
displayResults();
}
};
所以,地球会随机移动到一个位置。
其他函数只是帮助生成随机的x、y和随机的纬度、经度数值,输出结果并切换控制等。
我已经对代码进行了相当多的测试,结果不是100%完美的,将altitude
调高一些,比如50米,可以解决这个问题,但显然会减少可能选择的坐标区域。
显然,您可以根据自己的需求来调整这个想法。也许可以运行代码多次来填充数据库或其他内容。