8 votos

círculo máximo en el interior de un polígono irregular desde un punto aleatorio

Estoy tratando de trabajar un algoritmo para crear el máximo círculo de radio dentro de un polígono irregular (un censo) basándose en un centro del círculo.

La motivación para esto es para ocultar la ubicación de una persona que ha respondido a una encuesta. Su ubicación actual es conocido, sin embargo, se debe oscurecida en el análisis, con el fin de liberar los datos al público, para su posterior análisis.

Queremos tener un donut con forma de polígono para cada encuestado que tiene el radio interior (fácil), delimitada por un radio exterior que se ve limitada por el censo que el individuo se encuentra en. Su ubicación final serán colocados al azar dentro del donut polígono.

He visto muchas respuestas a preguntas similares aquí, pero no específico, que en este caso comienza con una ubicación ESPECÍFICA.

Una vez que tenemos el donut establecida, se puede aleatorizar la ubicación de la respuesta individual dentro del polígono. Eso es relativamente fácil...

Gracias por tus ideas, de la mina hasta el momento han parecido bastante fuerza bruta, y de cómputo "caro" o ineficiente...

3voto

cjstehno Puntos 131

Un método simple para mover ubicaciones dentro de dichos anillos se aprovecha de una cuadrícula representación de la distancia a la zona de frontera. Comienzo con una poligonal de la representación de los distritos Censales (que es lo habitual),

  1. Convertir en el polígono de límites (una polilínea en la capa).

  2. Calcular la distancia Euclidiana cuadrícula de los límites.

  3. Extracto de la distancia Euclídea en las ubicaciones.

  4. Mover cada ubicación dentro del rango dado por la distancia-que, por definición, es el máximo hasta el límite.

Cada uno requiere, normalmente, de un solo comando con un SIG, hacer toda la secuencia fácilmente automatizado y fácil de llevar a cabo de forma manual. Estas son eficientes los comandos, ya que no requieren de la construcción de un buffer para cada punto (que normalmente crea varias docenas de casi un millar de puntos con el fin de describir un anillo o anillo). No hay que buscar aleatorios o ensayos son necesarios, ya sea: los puntos que están directamente desplazados por los importes garantizados a salir de ellas dentro de su original distritos Censales.


Por ejemplo, me mudé 172,902 lugares en 47 tramos en direcciones al azar por los desplazamientos distribuidos de manera uniforme entre la mitad de la distancia y la distancia total hasta el límite. Aquí está una parte de una de las vías antes de la mudanza:

Figure 1

(los cuadrados amarillos marque las ubicaciones) y después de la mudanza:

Figure 2

(ahora cuadrados grises marca las nuevas ubicaciones). El total de la operación tardó sólo un minuto o dos (usando un viejo anticuado SIG :-).

Comparando estas cifras de cerca, se puede ver que

  • Los puntos que ahora se encuentran cerca de la frontera (tales como cerca de los dos lagos que se muestra como el blanco de los "agujeros" en estas cifras) necesariamente permanecer cerca de la frontera.

  • Puntos lejos de la frontera tienden a moverse mucho.

En consecuencia, un punto cercano a la frontera probable (pero no seguro se originó muy cerca, mientras que cualquier punto lejos de la frontera probablemente se originó en algún otro lugar lejos de la frontera. Estas dos tendencias están lejos de ser completamente aleatorio: se podría (muy fácilmente) ser explotado por alguien que quiere penetrar en la intimidad que estos movimientos tenían la intención de pagar.

Mejores métodos iba a hacer las conexiones entre el final y el inicial de la ubicación más tenue y más aleatoria. Como mínimo, los puntos deben ser desplazado dentro razonablemente grandes barrios en lugar de en los barrios de diferentes (y, posiblemente, arbitrariamente pequeño) tamaño. Esos movimientos no fácilmente llevado a cabo con las redes, ya que por lo general requieren de un poco de ensayo y error: se genera un montón de puntos al azar dentro de una vecindad de cada punto original y seleccione el primero que se encuentra dentro de la misma sección Censal. Eso es un bucle que implica (1) un movimiento al azar y (2) un punto en el polígono de la investigación. Ambas operaciones son rápidas, pero esto requiere un poco de programación para implementar el bucle.

(En un comentario a la pregunta, que proporcionan enlaces a algunos de los estudios de los métodos utilizados para disfrazar los datos territoriales, por razones de privacidad.)

2voto

Lars Mæhlum Puntos 4569

Yo sólo quería poner a prueba tus donuts en PostGIS

Lo he probado en PostGISonline.

Para hacer la misma prueba que ir a: http://postgisonline.org/map.php

Hay algunos polígonos de la llamada "propiedad" impresión:

SELECT * FROM property;

y pulse "Mapa1"

Entonces usted puede probar el donut-código copiando el siguiente para el área de texto y pulse "map2" (entonces propiedad de mapa):

SELECT ST_Difference(ST_Buffer(the_geom,dist),ST_Buffer(the_geom,dist/3)) the_geom,dist FROM
(
    SELECT ST_Distance(poly.boundary,points.the_geom) dist, points.the_geom FROM
    (
        SELECT ST_Boundary(the_geom) boundary,the_geom FROM property
    ) poly
    INNER JOIN
    (
        SELECT ST_SetSrid('POINT(137816 267009)'::geometry,3021) the_geom
        UNION ALL
        SELECT ST_SetSrid('POINT(139816 268542)'::geometry,3021) the_geom
        UNION ALL
        SELECT ST_SetSrid('POINT(135016 268102)'::geometry,3021) the_geom
    ) points
    ON ST_Contains(poly.the_geom,points.the_geom)
) a

Eso te dará un resultado algo como: enter image description here

1voto

Aaron Puntos 25882

Esperemos que esto de Python solución le ayudará a cabo. El flujo de trabajo general es como sigue:

  1. Convertir polígonos en polilíneas para que usted pueda calcular una Cerca distancia
  2. Búfer de los puntos basados en la distancia cercana

enter image description here

# Import arcpy module
import arcpy, os
from arcpy import env

env.overwriteOutput = 1

env.workspace = r'C:\sample.gdb\temp'
Dir = env.workspace

# Local variables:
points = "points"
polygon = "polygon"
points_2 = "points"
buffers = "buffers"
polyline = "polyline"

# Polygon To Line
arcpy.PolygonToLine_management(polygon, polyline, "IDENTIFY_NEIGHBORS")

# Near
arcpy.Near_analysis(points, polyline)

# Buffer
arcpy.Buffer_analysis(points_2, buffers, "NEAR_DIST")

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X