【问题标题】:Show FloorPlan and get Location with IndoorAtlas使用 IndoorAtlas 显示 FloorPlan 并获取位置
【发布时间】:2015-04-28 06:19:58
【问题描述】:

有没有关于如何使用 IndoorAtlas SDK 的资源?

我对如何显示平面图和获取当前位置感到困惑。

请帮助我。

【问题讨论】:

    标签: android android-studio indoor-positioning-system


    【解决方案1】:

    以下是非常粗略的方法:

    1) 初始化 IndoorAtlas 实例:

    IndoorAtlas ia = IndoorAtlasFactory.createIndoorAtlas(context, listener, apiKey, apiSecret);
    

    2) 获取 FloorPlan 实例:

    FutureResult<FloorPlan> result = ia.fetchFloorPlan(floorPlanId);
    result.setCallback(new ResultCallback<FloorPlan>() {
                @Override
                public void onResult(final FloorPlan result) {
                    mFloorPlan = result;
                    loadFloorPlanImage(result);
                }
                // handle error conditions too
    }
    

    3) 获取实际图像:

    void loadFloorPlanImage(FloorPlan floorPlan) {
      BitmapFactory.Options options = createBitmapOptions(floorPlan);
      FutureResult<Bitmap> result = ia.fetchFloorPlanImage(floorPlan, options);
      result.setCallback(new ResultCallback<Bitmap>() {
                @Override
                public void onResult(final Bitmap result) {
                   // now you have floor plan bitmap, do something with it
                   updateImageViewInUiThread(result);
                }
                // handle error conditions too
      }
    }
    

    4) 开始定位:

    ia.startPositioning(venueId, floorId, floorPlanId);
    

    5) 在平面图上显示位置:

    public void onServiceUpdate(ServiceState state) {
    
       // get position on original floor plan image
       int i = state.getImagePoint().getI();
       int j = state.getImagePoint().getJ();
    
       // take into account how your floor plan image has been scaled
       // and draw position
       PointF scaledPoint = new PointF();
       Util.calculateScaledPoint((int) floorPlan.dimensions[0], (int) floorPlan.dimensions[1], i, j, mImageView, scaledPoint);
    
       drawNewPositionInUiThread(scaledPoint.x, scaledPoint.y);
    
    }
    

    当然可以先定位再获取图像。您也可以在本地缓存图像,但就像说的那样,大致就是这样。

    Util.java:

    public class Utils {
    
    
        /**
         * Calculates scaling factor for an image with original dimensions of
         * {@code originalWidth x originalHeight} being displayed with {@code imageView}.
         *
         * The assumption with this example code is that a) layout has been already performed for
         * {@code imageView} and that {@link android.widget.ImageView.ScaleType#CENTER_INSIDE} is used.
         *
         * @param originalWidth  height of the original bitmap to be displayed using {@code imageView}
         * @param originalHeight width of the original bitmap to be displayed using {@code imageView}
         */
        public static float calculateScaleFactor(int originalWidth, int originalHeight,
                                                 ImageView imageView) {
    
            if (imageView.getScaleType() != ImageView.ScaleType.CENTER_INSIDE) {
                throw new IllegalArgumentException("only scale type of CENTER_INSIDE supported, was: "
                        + imageView.getScaleType());
            }
    
            final int availableX = imageView.getWidth()
                    - (imageView.getPaddingLeft() + imageView.getPaddingRight());
            final int availableY = imageView.getHeight()
                    - (imageView.getPaddingTop() + imageView.getPaddingBottom());
    
            if (originalWidth > availableX || originalHeight > availableY) {
                // original image would not fit without scaling
                return originalWidth > availableX
                        ? availableX / (float) originalWidth
                        : availableY / (float) originalHeight;
            } else {
                return 1f; // no scaling required
            }
    
        }
    
    
        /**
         * Calculates point where to draw coordinates {@code x} and {@code y} in a bitmap that's
         * original dimensions were {@code originalWidth x originalHeight} and may now be scaled down
         * as it's been displayed with {@code imageView}.
         *
         * @param originalWidth  width of the original bitmap before any scaling
         * @param originalHeight height of the original bitmap before any scaling
         * @param x              x-coordinate on original bitmap
         * @param y              y-coordinate on original bitmap
         * @param imageView      view that will be used to display bitmap
         * @param point          point where result value is to be stored
         * @see #calculateScaleFactor(int, int, ImageView)
         */
        public static void calculateScaledPoint(int originalWidth, int originalHeight,
                                                int x, int y,
                                                ImageView imageView,
                                                PointF point) {
    
    
            final float scale = calculateScaleFactor(originalWidth, originalHeight, imageView);
            final float scaledWidth = originalWidth * scale;
            final float scaledHeight = originalHeight * scale;
    
            // when image inside view is smaller than the view itself and image is centered (assumption)
            // there will be some empty space around the image (here offset)
            final float offsetX = Math.max(0, (imageView.getWidth() - scaledWidth) / 2);
            final float offsetY = Math.max(0, (imageView.getHeight() - scaledHeight) / 2);
    
            point.x = offsetX + (x * scale);
            point.y = offsetY + (y * scale);
    
    
        }
    
    
    }
    

    【讨论】:

    • 感谢您的回复。我在上面。但是对于第 1 点,您如何声明 listener ? IndoorAtlasListener 还是其他 Listener ?
    • 是的,IndoorAtlasListener。可以从 IndoorAtlas SDK 附带的示例应用程序中找到基本示例。
    • 也许我不明白如何声明:loadFloorPlanImage、updateImageViewInUiThread、drawNewPositionInUiThread。你能指导我吗?谢谢之前
    • loadFloorPlanImage: 那是第 3 步)(我用方法签名更新答案)。 updateImageViewInUiThread: 可以像将位图分配给 ImageView 一样简单,但您需要在主线程下进行,例如developer.android.com/reference/android/app/…。 drawNewPositionInUiThread:在这里你可以画例如画布上的一个圆圈,位于您新位置的位置。我会尽量找时间做一个完整的例子。
    • 那更清楚了。很抱歉忘记提及“createBitmapOptions”。该方法的内容是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 2016-01-23
    相关资源
    最近更新 更多