El mapa de alto alemán de Android dibuja un polígono, dibuja un rectángulo con un punto central conocido de ancho y alto, y la distancia real entre kilómetros y coordenadas del mapa

Mapabc se utiliza en el proyecto para dibujar un área rectangular. El cliente solo puede seleccionar manualmente el punto central y completar el ancho y alto del área, y la unidad de corte es km. Se requiere mostrar el área planificada en tiempo real.

Toma nota.

El primer paso es encontrar la API del polígono de dibujo del mapa

polygon = map.addPolygon(new PolygonOptions()
        .addAll(createRectangle(marker.getPosition(), 1, 1))//绘制多边形顶点坐标
        .fillColor(0x1A1677FF)//填充颜色
        .strokeColor(0xDE1677FF)//边界颜色
        .strokeWidth(5));//边界宽度

Conocemos las coordenadas del vértice y el km ancho y alto introducido por el cliente. Necesitamos calcular las coordenadas del vértice (rectángulo) del polígono:

 /**
     * 生成一个长方形的四个坐标点
     */
    private List<LatLng> createRectangle(LatLng center, double halfWidth,
                                         double halfHeight) {

        float distance = (float) Math.sqrt(halfWidth * halfWidth + halfHeight * halfHeight);//计算直角三角形斜边 。
        float degree= getDegree(0.0,0.0,-halfWidth,0.0,-halfWidth,halfHeight);//计算三角形锐角角度
        //生成四边形四个点坐标
        return Arrays.asList(
                getLatlng(distance, center,90-degree),
                getLatlng(distance, center, 90+degree),
                getLatlng(distance, center, 270-degree),
                getLatlng(distance, center, 270+degree)
        );
    }

Paso 1. Calcule la distancia desde el vértice del rectángulo hasta el punto central por el ancho y la altura.

float distance = (float) Math.sqrt(halfWidth * halfWidth + halfHeight * halfHeight);

Paso 2. Calcule el ángulo entre el eje y y la diagonal del rectángulo colocando el eje de coordenadas virtuales

float degree= getDegree(0.0,0.0,-halfWidth,0.0,-halfWidth,halfHeight);

            Utilice las matemáticas para calcular el ángulo incluido mediante un sistema de coordenadas virtual

/**
 * 在坐标系中计算两条相交线夹角
 * @param vertexPointX 交点坐标
 * @param vertexPointY
 * @param point0X A点坐标
 * @param point0Y
 * @param point1X  b点坐标
 * @param point1Y
 * @return
 */
private int getDegree(Double vertexPointX, Double vertexPointY, Double point0X, Double point0Y, Double point1X, Double point1Y) {
    //向量的点乘
    Double vector = (point0X - vertexPointX) * (point1X - vertexPointX) + (point0Y - vertexPointY) * (point1Y - vertexPointY);
    //向量的模乘
    double sqrt = Math.sqrt(
            (Math.abs((point0X - vertexPointX) * (point0X - vertexPointX)) + Math.abs((point0Y - vertexPointY) * (point0Y - vertexPointY)))
                    * (Math.abs((point1X - vertexPointX) * (point1X - vertexPointX)) + Math.abs((point1Y - vertexPointY) * (point1Y - vertexPointY)))
    );
    //反余弦计算弧度
    double radian = Math.acos(vector / sqrt);
    //弧度转角度制
    return (int) (180 * radian / Math.PI);
}

Paso 3. Calcula las coordenadas de los vértices en el mapa desde el centro del mapa, la distancia real (la distancia desde los vértices del rectángulo al centro) y el ángulo incluido.

getLatlng (distancia, centro, 90 grados)

/**
 *
 * @param distance 距离
 * @param latlngA 中心点坐标
 * @param angle 夹角
 * @return
 */
public static LatLng getLatlng(float distance, LatLng latlngA, double angle) {
    return new LatLng(latlngA.latitude + (distance * Math.cos(angle * Math.PI / 180)) / 111,
            latlngA.longitude + (distance * Math.sin(angle * Math.PI / 180)) / (111 * Math.cos(latlngA.latitude * Math.PI / 180))
    );
}

 

La imagen que dibujo por defecto se muestra en la dirección positiva. Incline si es necesario. Simplemente haga trucos en el tercer parámetro de getLatlng (distancia, centro, 90 grados)

 

Si el punto de referencia es un vértice de un rectángulo, es más fácil hacer referencia al método anterior.

Supongo que te gusta

Origin blog.csdn.net/qq_36355271/article/details/108781514
Recomendado
Clasificación