Tengo una función de polígono y quiero poder generar puntos dentro de ella. Necesito esto para una tarea de clasificación.
Generar puntos aleatorios hasta que uno esté dentro del polígono no funcionaría porque es realmente impredecible el tiempo que lleva.
Respuestas:
Comience descomponiendo el polígono en triángulos, luego genere puntos dentro de ellos . (Para una distribución uniforme, pondera cada triángulo por su área).
fuente
Al poner una etiqueta QGIS en esta pregunta: la herramienta Puntos aleatorios se puede usar con una capa límite.
Si está buscando código, el código fuente del complemento subyacente debería ser de ayuda.
fuente
Puede determinar la extensión del polígono, luego restringir la generación de números aleatorios para los valores X e Y dentro de esas extensiones.
Proceso básico: 1) Determine los vértices maxx, maxy, minx, miny de polígono, 2) Genere puntos aleatorios usando estos valores como límites 3) Pruebe cada punto para la intersección con su polígono, 4) Deje de generar cuando tenga suficientes puntos que satisfagan la intersección prueba
Aquí hay un algoritmo (C #) para la prueba de intersección:
fuente
Hay algunas buenas bibliotecas que hacen la mayor parte del trabajo pesado por usted.
Ejemplo usando [shapely] [1] en python.
O use
.representative_point()
para obtener un punto dentro del objeto (como lo menciona dain):fuente
representative_point
método: shapely.readthedocs.io/en/latest/…Si R es una opción, ver
?spsample
en elsp
paquete. Los polígonos se pueden leer desde cualquier formato compatible con GDAL integrado en el paquete rgdal, y luegospsample
funciona directamente en objetos importados con una variedad de opciones de muestreo.fuente
Me gustaría ofrecer una solución que requiera muy poco en términos de análisis SIG. En particular, no requiere triangular ningún polígono.
El siguiente algoritmo, dado en pseudocódigo, se refiere a algunas operaciones simples además de las capacidades básicas de manejo de listas (crear, encontrar longitud, agregar, ordenar, extraer sublistas y concatenar) y la generación de flotantes aleatorios en el intervalo [0, 1):
Todos estos están disponibles en casi cualquier entorno de programación gráfica o SIG (y fácil de codificar si no).
Clip
no debe devolver polígonos degenerados (es decir, aquellos con área cero).Procedimiento
SimpleRandomSample
obtiene eficientemente una lista de puntos distribuidos aleatoriamente dentro de un polígono. Es un envoltorio paraSRS
, que rompe el polígono en piezas más pequeñas hasta que cada pieza sea lo suficientemente compacta como para tomar muestras de manera eficiente. Para hacer esto, utiliza una lista precalculada de números aleatorios para decidir cuántos puntos asignar a cada pieza.SRS se puede "ajustar" cambiando el parámetro
t
. Este es el cuadro de límite máximo: relación de área de polígono que se puede tolerar. Hacerlo pequeño (pero mayor que 1) hará que la mayoría de los polígonos se dividan en muchos pedazos; hacerlo grande puede hacer que se rechacen muchos puntos de prueba para algunos polígonos (sinuosos, con astillas o llenos de agujeros). Esto garantiza que el tiempo máximo para muestrear el polígono original es predecible.El siguiente procedimiento se llama a sí mismo recursivamente si es necesario. La expresión misteriosa
t*N + 5*Sqrt(t*N)
estima conservadoramente un límite superior sobre cuántos puntos se necesitarán, lo que explica la variabilidad del azar. La probabilidad de que esto falle es de solo 0.3 por millón de llamadas a procedimientos. Aumente de 5 a 6 o incluso 7 para reducir esta probabilidad si lo desea.fuente
Si su polígono es convexo y conoce todos los vértices, es posible que desee considerar hacer una ponderación convexa "aleatoria" de los vértices para muestrear un nuevo punto que se garantiza que se encuentra dentro del casco convexo (polígono en este caso).
Por ejemplo, supongamos que tiene un polígono convexo de N lados con vértices
Luego genera aleatoriamente N pesos convexos
El punto muestreado al azar viene dado por
Puede haber diferentes formas de muestrear N pesos convexos
Cuando su polígono no es muy no convexo, puede considerar primero convertirlo en un casco convexo. Esto debería al menos limitar en gran medida el número de puntos que se encuentran fuera de su polígono.
fuente
La tarea es muy fácil de resolver en GRASS GIS (un comando) usando v.random .
A continuación se muestra un ejemplo sobre cómo agregar 3 puntos aleatorios en polígonos seleccionados (aquí áreas de código postal de la ciudad de Raleigh, NC) desde la página del manual. Al modificar la instrucción SQL "donde" se pueden seleccionar los polígonos.
fuente
Enlace de respuesta
https://gis.stackexchange.com/a/307204/103524
Tres algoritmos que utilizan diferentes enfoques.
Git Repo Link
Función ================================================= ==================
Utilice la función con una consulta simple, la geometría debe ser válida y polígono, polígonos múltiples o envolvente
SELECT I_Grid_Point_Distance(geom, 50, 61) from polygons limit 1;
Resultado ================================================= =====================
Segunda función basada en el algoritmo de Nicklas Avén . He intentado manejar cualquier SRID.
He aplicado los siguientes cambios en el algoritmo.
Función ================================================= ==================
Úselo con una consulta simple.
SELECT I_Grid_Point(geom, 22, 15, false) from polygons;
Resultado ================================================= ==================
Función ================================================= =================
Úselo con una consulta simple.
SELECT I_Grid_Point_Series(geom, 22, 15, false) from polygons;
Resultado ================================================= =========================fuente