5 votos

¿Determinar si el punto se encuentra dentro de la forma?

¿Cuál sería el mejor método para determinar si una dirección (geocodificada a un punto de lat/long) se encuentra dentro de una forma dada en un shapefile del SIG? En el mejor de los casos, se nos da un resultado booleano, que luego podríamos aplicar algún javascript para leer los resultados de sí/no en nuestra aplicación web.

Actualmente utilizamos la API de Mapbox para mostrar los mapas. Sólo quería mencionarlo por si Mapbox tiene algún tipo de funcionalidad en este ámbito.

0 votos

Probablemente pueda utilizar JavaScript Topology Suite(jsts) probablemente en conjunción con proj4js , a resolver un punto en un polígono . Sin embargo, eso no cumple realmente con su requisito de shapefile ..en mi opinión, la mejor solución requerirá ir más allá del shapefile.

0 votos

Además de lo que ha preguntado @elrobis, ¿cómo se utiliza actualmente el shapefile? ¿Sólo se usa para renderizar mosaicos, o los datos poligonales ya están en el navegador (como geojson, etc.)? Además, si tienes python en tu entorno, echa un vistazo a esta respuesta

0 votos

Gracias chicos, me encantaría dejar de usar el archivo de forma por completo. Sólo estoy buscando una solución que sea la mejor para devolver un resultado booleano para una dirección. Y sí, los archivos de forma sólo se están utilizando para renderizar archivos a través de Mapbox.

1voto

csandor Puntos 113

Si tu shapefile puede ser convertido a GeoJSON, en otras palabras, fuiste capaz de crear una capa Leaflet adecuada a partir de él en Mapbox, puedes usar el operador Inside de TurfJS como aquí:

http://turfjs.org/static/docs/module-turf_inside.html

Si realmente no quieres ninguna dependencia puedes volver a la calcografía de la escuela secundaria. :) Mi algoritmo es así:

  1. Iterar sobre los lados del polígono en una dirección tomando los 2 extremos del lado del polígono dado.
  2. Llamemos a los puntos finales p0(x0,y0) y p1(x1,y1). Su punto de dirección a comprobar es P(x,y)
  3. Calcular firmado distancia de la línea definida por los 2 puntos del polígono:

d=((y0-y1)x+(x1-x0)y+(x0y1-x1y0))/sqrt((x1-x0)^2+(y1-y0)^2) ( razonamiento aquí )

  1. Si el punto ESTÁ DENTRO de sus polígonos entonces las distancias calculadas desde los lados del polígono tendrán el mismo signo (dependiendo de la dirección de los anillos todos positivos o todos negativos)
  2. Si tu polígono tiene agujeros tienes que iterar sobre todos los anillos interiores y tu punto tiene que estar NO DENTRO de los anillos interiores sino DENTRO del anillo exterior.

Espero que esto ayude. Esto no funcionará para polígonos erróneos como las "pajaritas" (lados que se cruzan).

Estoy seguro de que puede haber toneladas de otros algo para estas tareas. Esto sólo salió de la parte superior de mi cabeza como algo que puede ser codificado simplemente en JS.

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