在Carto移动SDK中获取触摸MapTile的x和y像素
Get x and y pixel of touched MapTile in Carto mobile SDK
我有一个用于显示 wms 层的 RasterTileLayer,我需要从 geoServer 获取触摸区域的特征;但是 geoServer 需要触摸 mapTile 的 x 和 y 坐标在 0 到 256 的范围内(因为图块大小设置为 256);但我不知道如何得到它或计算它,你有什么解决办法吗?
一般来说,您将通过注册 RasterTileEventListener 来接收点击事件。但是您收到的参数 (RasterTileClickInfo) 目前没有为您提供准确的点击坐标。在 4.1.4 之前的 SDK 版本中,您必须手动进行一些计算。以下代码段应该对您有所帮助:
rasterLayer.setRasterTileEventListener(new RasterTileEventListener() {
@Override
public boolean onRasterTileClicked(RasterTileClickInfo clickInfo) {
MapTile mapTile = clickInfo.getMapTile();
Projection proj = rasterLayer.getDataSource().getProjection();
double projTileWidth = proj.getBounds().getDelta().getX() / (1 << mapTile.getZoom());
double projTileHeight = proj.getBounds().getDelta().getY() / (1 << mapTile.getZoom());
double projTileX0 = proj.getBounds().getMin().getX() + mapTile.getX() * projTileWidth;
double projTileY0 = proj.getBounds().getMin().getY() + ((1 << mapTile.getZoom()) - 1 - mapTile.getY()) * projTileHeight;
double normTileX = (clickInfo.getClickPos().getX() - projTileX0) / projTileWidth;
double normTileY = (clickInfo.getClickPos().getY() - projTileY0) / projTileHeight;
Log.d("", "Clicked at: " + (int) (normTileX * 256) + ", " + (int) (normTileY * 256));
return true;
}
});
请注意,您可能需要翻转 y 坐标,因为它从底部开始。
附带说明一下,SDK 4.1.4 公开了 TileUtils class 和一些静态方法,这些方法执行上面使用的相同计算。
我有一个用于显示 wms 层的 RasterTileLayer,我需要从 geoServer 获取触摸区域的特征;但是 geoServer 需要触摸 mapTile 的 x 和 y 坐标在 0 到 256 的范围内(因为图块大小设置为 256);但我不知道如何得到它或计算它,你有什么解决办法吗?
一般来说,您将通过注册 RasterTileEventListener 来接收点击事件。但是您收到的参数 (RasterTileClickInfo) 目前没有为您提供准确的点击坐标。在 4.1.4 之前的 SDK 版本中,您必须手动进行一些计算。以下代码段应该对您有所帮助:
rasterLayer.setRasterTileEventListener(new RasterTileEventListener() {
@Override
public boolean onRasterTileClicked(RasterTileClickInfo clickInfo) {
MapTile mapTile = clickInfo.getMapTile();
Projection proj = rasterLayer.getDataSource().getProjection();
double projTileWidth = proj.getBounds().getDelta().getX() / (1 << mapTile.getZoom());
double projTileHeight = proj.getBounds().getDelta().getY() / (1 << mapTile.getZoom());
double projTileX0 = proj.getBounds().getMin().getX() + mapTile.getX() * projTileWidth;
double projTileY0 = proj.getBounds().getMin().getY() + ((1 << mapTile.getZoom()) - 1 - mapTile.getY()) * projTileHeight;
double normTileX = (clickInfo.getClickPos().getX() - projTileX0) / projTileWidth;
double normTileY = (clickInfo.getClickPos().getY() - projTileY0) / projTileHeight;
Log.d("", "Clicked at: " + (int) (normTileX * 256) + ", " + (int) (normTileY * 256));
return true;
}
});
请注意,您可能需要翻转 y 坐标,因为它从底部开始。
附带说明一下,SDK 4.1.4 公开了 TileUtils class 和一些静态方法,这些方法执行上面使用的相同计算。