|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  Raspberry Pi Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  AutoIt (Programación) Visual Basic Cosas de Windows Webs interesantes
Translate:
Búsqueda en este sitio:


.

App inventor 2 en español
Cómo programar los teléfonos móviles con Android
mediante App inventor 2 - Juan Antonio Villalpando

-- Tutorial de iniciación de App Inventor 2 en español --

Volver al índice del tutorial

____________________________

251.- Geofence. JavaScript. Extensión. Punto dentro o fuera de un polígono. Mapa. Coordenadas.

p251_geofenceJavaScript.aia

 

- Tenemos el poligono = [[2,9],[8,6],[12,10],[15,2],[10,4],[5,1]]

- Vamos a comprobar si estos puntos se encuentran dentro o fuera de ese polígono.

- punto = [6,5]

- punto = [7,8]

- Utilizaremos el siguiente algoritmo en JavaScript, se denomina even-odd rule

- El número de intersecciones de una línea que pasa desde el exterior del polígono a cualquier punto.
- Si es impar, muestra que el punto se encuentra dentro del polígono.
- Si es par, el punto se encuentra fuera del polígono.

- Adaptaré este código: https://www.algorithms-and-technologies.com/point_in_polygon/javascript

- Devuelve la cadena "true" o "false".

even-odd rule

// var poligono = [[2,9],[8,6],[12,10],[15,2],[10,4],[5,1]];
// var punto = [6, 5];
 
 
 
function pointInPolygon(polygon, point) {
    let odd = false;
    for (let i = 0, j = polygon.length - 1; i < polygon.length; i++) {
        if (((polygon[i][1] > point[1]) !== (polygon[j][1] > point[1])) 
            && (point[0] < ((polygon[j][0] - polygon[i][0]) * (point[1] - polygon[i][1]) / (polygon[j][1] - polygon[i][1]) + polygon[i][0]))) {
            odd = !odd;
        }
        j = i;
    }
    return odd;
};

result = pointInPolygon(poligono, punto);
AppInventor.setWebViewString(result);

_____________________________________
- Diseño.

_____________________________________
- Bloques.

_____________________________________
_____________________________________
2.- Con mapa. Consultar si un punto se encuentra en un polígono.

p251_geofenceJavaScript_Mapa.aia

 

- Dibujamos un polígono mediante LineString.PointsFromString, observa que la coordenada inicial y final es la misma para que cierre el polígono:

LineString.PointsFromString=[[36.50318,-6.27281],[36.50226,-6.27231],[36.50198,-6.27311],[36.50291,-6.27361],[36.50263,-6.27298],[36.50318,-6.27281]]

- Establecemos el polígono de consulta con estas coordenadas:

poligono = [[36.50318,-6.27281],[36.50226,-6.27231],[36.50198,-6.27311],[36.50291,-6.27361],[36.50263,-6.27298]]

- Desplazamos mediante un Reloj, un punto horizontalmente.

punto = [36.5027,h]

- Podemos parar el Reloj mediante "Stop" y tocar sobre el mapa, mediante el bloque TapAtPoint podemos consultar si el punto se encuentra dentro o fuera del polígono.

- NOTA: también funciona si establecemos el polígono de consulta repitiendo al final la coordenada inicial:

poligono = [[36.50318,-6.27281],[36.50226,-6.27231],[36.50198,-6.27311],[36.50291,-6.27361],[36.50263,-6.27298],[36.50318,-6.27281]]

_____________________________________
- Diseño.

_____________________________________
- Bloques.

_____________________________________
_____________________________________
3.- Extensión Geofence. Consultar si un punto se encuentra en un polígono.

p251_geofenceExtension_Mapa.aia

com.KIO4_Geofence.aix

- Adaptado de: https://www.algorithms-and-technologies.com/point_in_polygon/java

com.KIO4_Geofence.java

package com.KIO4_Geofence;
//  © Juan Antonio Villalpando 
// http://kio4.com/appinventor/251_exten_geofence_javascript.htm
// 2022/05/04

import com.google.appinventor.components.annotations.DesignerComponent;
import com.google.appinventor.components.annotations.DesignerProperty;
import com.google.appinventor.components.annotations.SimpleFunction;
import com.google.appinventor.components.annotations.SimpleObject;
import com.google.appinventor.components.common.ComponentCategory;
import com.google.appinventor.components.common.PropertyTypeConstants;
import com.google.appinventor.components.runtime.*;

@DesignerComponent(version = 1,
    description = "Geofence. Find out if a point is inside a polygon. " 
	+ "Juan Antonio Villalpando - KIO4.COM ",
    category = ComponentCategory.EXTENSION,
    nonVisible = true,
    iconName = "") 
@SimpleObject(external = true)
public class KIO4_Geofence extends AndroidNonvisibleComponent implements Component {

    private ComponentContainer container;
    public KIO4_Geofence(ComponentContainer container) {
        super(container.$form());
        this.container = container;
    }

////////////////////////// FUNCION /////////////////////////
@SimpleFunction(description = "Example String polygon: [[36.53,-6.27],[36.51,-6.28],[36.54,-6.29],[36.55,-6.22]]. Return boolean.")
public boolean Geofence(String polygon, String latitude, String longitude){
	float point[] = new float[2];
	point[0] = Float.valueOf(latitude);
	point[1] = Float.valueOf(longitude);

	int puntos = -1; // Vertices del poligono.
	 for (int i = 0; i < polygon.length(); i++) {
		if (polygon.charAt(i) == '[') {puntos++;}}
		
	float polygonF[][] = new float[puntos][puntos]; // Array float 2 dimensiones.
	polygon = polygon.replace("[", "").replace("]", "");		
	String[] polygonArray = polygon.split(",");
	
	 for (int i = 0; i < puntos; i++) {
		 polygonF[i][0] =  Float.valueOf(polygonArray[i*2]);
		 polygonF[i][1] =  Float.valueOf(polygonArray[i*2+1]);
	 }

	boolean odd = false;

	for (int i = 0, j = polygonF.length - 1; i < polygonF.length; i++) { 
		if (((polygonF[i][1] > point[1]) != (polygonF[j][1] > point[1])) 
			&& (point[0] < (polygonF[j][0] - polygonF[i][0]) * (point[1] - polygonF[i][1]) / (polygonF[j][1] - polygonF[i][1]) + polygonF[i][0])) {
			odd = !odd;
		}
		j = i;
	}
	return odd;
}

}	// ==> FIN

_____________________________________
- Diseño.

_____________________________________
- Bloques.

___________________________

 

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información