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.
___________________________
|