tipos tierra son sistema sirven resueltos que para niños longitud leer latitud las importancia geográfica geograficas ejercicios ejemplos definicion coordenadas como aplicaciones java gis geocoding

java - tierra - sistema de coordenadas geográfica



Coordenadas geográficas al azar(en tierra, evitar el océano) (16)

  1. Descargue un camión cargado de archivos KML que contengan ubicaciones solo terrestres.
  2. Extraiga todas las coordenadas de ellos, esto podría ayudar aquí .
  3. Escoja al azar.

¿Alguna idea inteligente sobre cómo generar coordenadas aleatorias (latitud / longitud) de lugares en la Tierra? Latitud longitud. Precisión a 5 puntos y evitar cuerpos de agua.

double minLat = -90.00; double maxLat = 90.00; double latitude = minLat + (double)(Math.random() * ((maxLat - minLat) + 1)); double minLon = 0.00; double maxLon = 180.00; double longitude = minLon + (double)(Math.random() * ((maxLon - minLon) + 1)); DecimalFormat df = new DecimalFormat("#.#####"); log.info("latitude:longitude --> " + df.format(latitude) + "," + df.format(longitude));

Tal vez estoy viviendo en un mundo de sueños y el tema del agua es inevitable ... pero espero que haya una forma más agradable, limpia y eficiente de hacerlo.

EDITAR

Algunas respuestas / ideas fantásticas, sin embargo, a escala, digamos que necesito generar 25,000 coordenadas. Ir a un proveedor de servicios externo puede no ser la mejor opción debido a la latencia, el costo y algunos otros factores.



¿Los puntos aleatorios deben distribuirse uniformemente en todo el mundo? Si pudiera conformarse con una distribución aparentemente uniforme, puede hacer esto:

Abra su servicio de mapas favorito, dibuje un rectángulo dentro de los Estados Unidos, Rusia, China, Europa occidental y definitivamente la parte norte de África, asegurándose de que no haya grandes lagos o mares del Caspio dentro de los rectángulos. Tome las coordenadas de la esquina de cada rectángulo y luego seleccione las coordenadas al azar dentro de esos rectángulos.

Usted tiene la garantía de que ninguno de estos puntos estará en ningún mar o lago. Es posible que encuentre un río ocasional, pero no estoy seguro de cuántos geoservicios van a ser lo suficientemente precisos para eso de todos modos.


A modo de complemento a lo que dijo sobre la excavación en los servicios GeoNames, aquí hay un atajo:
tienen un servicio web dedicado para solicitar un nombre de océano .

(Soy consciente de la limitación de OP para no usar servicios web públicos debido a la cantidad de solicitudes. Sin embargo, me topé con la misma pregunta básica y considero útil).

Vaya a http://www.geonames.org/export/web-services.html#astergdem y eche un vistazo a " Ocean / reverse geocoding ". Está disponible como XML y JSON. Cree una cuenta de usuario gratuita para evitar límites diarios en la cuenta de demostración.

Solicite un ejemplo en el área del océano (Mar Báltico, JSON-URL):

http://api.geonames.org/oceanJSON?lat=54.049889&lng=10.851388&username=demo

resultados en

{ "ocean": { "distance": "0", "name": "Baltic Sea" } }

mientras que algunas coordenadas en tierra resultan en

{ "status": { "message": "we are afraid we could not find an ocean for latitude and longitude :53.0,9.0", "value": 15 } }


Aquí hay una biblioteca y puedes usar su método .random () para obtener una coordenada aleatoria. Luego, puede usar los servicios web de GeoNames para determinar si está en tierra o no. Tienen una lista de servicios web y solo tendrás que usar el correcto. GeoNames es gratis y confiable.


Como plan B, tal vez pueda elegir un país aleatorio y luego elegir una coordenada aleatoria dentro de este país. Para ser justos al elegir un país, puede usar su área como peso.


Definitivamente debes tener un mapa como recurso. Puedes llevarlo aquí: http://www.naturalearthdata.com/

Luego prepararía un recurso de mapa de bits en blanco y negro de 1 bit con 1s marcando el terreno y 0x marcando el agua.

El tamaño del mapa de bits depende de la precisión requerida. Si necesita 5 grados, su mapa de bits será 360/5 x 180/5 = 72x36 píxeles = 2592 bits.

Luego cargaría este mapa de bits en Java, generaría un entero aleatorio dentro del rango anterior, leería un bit y se regeneraría si fuera cero.

PS También puede buscar aquí Geotools para encontrar algunas soluciones listas para usar.


Esta es una pregunta extremadamente interesante, tanto desde una perspectiva teórica como práctica. La solución más adecuada dependerá en gran medida de sus requisitos exactos. ¿Necesita tener en cuenta cada masa de agua, o solo los mares y océanos principales? Cuán críticos son la exactitud y la corrección; ¿La identificación del mar como tierra o viceversa será un fracaso catastrófico?

Creo que las técnicas de aprendizaje automático serían una excelente solución a este problema, siempre que no te importe la probabilidad (con suerte pequeña) de que un punto de agua se clasifique incorrectamente como tierra. Si eso no es un problema, entonces este enfoque debería tener una serie de ventajas frente a otras técnicas.

Usar un mapa de bits es una buena solución, simple y elegante. Se puede producir con una precisión específica y se garantiza que la clasificación es correcta (o, al menos, tan correcta como la que hizo el mapa de bits). Pero su practicidad depende de la precisión con la que necesite la solución. Usted menciona que desea que la precisión de las coordenadas sea de 5 lugares decimales (lo que sería equivalente a mapear toda la superficie del planeta a aproximadamente el metro más cercano). Usando 1 bit por elemento, el bitmap pesaría ~ 73.6 terabytes!

Sin embargo, no necesitamos almacenar todos estos datos; Solo necesitamos saber dónde están las costas. Solo al saber dónde se encuentra un punto en relación con la costa, podemos determinar si está en tierra o mar. Como estimación aproximada, el libro de hechos del mundo de la CIA informa que hay 22498 km de costa en la Tierra. Si tuviéramos que almacenar coordenadas por cada metro de línea costera, usando una palabra de 32 bits para cada latitud y longitud, esto tomaría menos de 1.35 GB para almacenar. Todavía es mucho si esto es para una aplicación trivial, pero algunos órdenes de magnitud menos que usar un mapa de bits. Sin embargo, si no es necesario tener un grado de precisión tan alto, estos números disminuirían considerablemente. Reducir la asignación a solo el kilómetro más cercano haría que el mapa de bits sea de ~ 75 GB y que las coordenadas de la línea de costa del mundo puedan caber en un disquete.

Lo que propongo es usar un algoritmo de agrupamiento para decidir si un punto está en tierra o no. Primero necesitaríamos un número suficientemente grande de coordenadas que ya sabemos que están en tierra o mar. Las bases de datos GIS existentes serían adecuadas para esto. Luego podemos analizar los puntos para determinar grupos de tierra y mar. El límite de decisión entre los grupos debe caer en las líneas costeras, y todos los puntos que no determinan el límite de decisión pueden eliminarse. Este proceso se puede iterar para dar un límite progresivamente más preciso.

Solo los puntos que determinan el límite de decisión / la línea de costa deben almacenarse, y al usar una métrica de distancia simple, podemos decidir rápida y fácilmente si un conjunto de coordenadas está en tierra o mar. Se necesitaría una gran cantidad de recursos para entrenar el sistema, pero una vez completado, el clasificador requerirá muy poco espacio o tiempo.


Esto se ha pedido hace mucho tiempo y ahora tengo una necesidad similar. Hay dos posibilidades que estoy considerando:

1. Defina los rangos de superficie para el generador aleatorio.

Aquí es importante identificar el nivel de precisión que está buscando. La forma más fácil sería tener un enfoque muy relajado y aproximado. En este caso puedes dividir el mapa del mundo en "cuadros":

Cada caja tiene su propio rango de lat lon. Luego, primero aleatoriza para obtener un cuadro aleatorio, luego aleatoriza para obtener un lat aleatorio y aleatorio largo dentro de los límites de ese cuadro.

Por supuesto, las precisiones no son las mejores aquí ... Aunque depende :) Si hace bien su tarea y define muchas cajas que cubren la mayoría de las formas de superficies complejas, puede que esté bastante bien con la precisión.

2. elemento de la lista

Alguna API para devolver el nombre del continente desde coordenadas O dirección O país O distrito = algo que WATER no tiene. La API de Google Maps puede ayudar aquí. No investigué esto más a fondo, pero creo que es posible, aunque tendrá que ejecutar la comprobación de cada par de coordenadas generado y volver a ejecutar SI está mal. Así que puedes atascarte un poco si un generador aleatorio te tira al océano.

Además, algo de agua pertenece a países, distritos ... así que sí, no es muy preciso.

Para mis necesidades: voy con "cajas" porque también quiero controlar las áreas exactas de las que se toman las coordenadas al azar y no me importa si aterriza en un lago o río, simplemente no en el océano :)


Generar es fácil, el problema es que no deben estar en el agua. Yo importaría el "Mapa de calles abierto", por ejemplo aquí http://ftp.ecki-netz.de/osm/ e importarlo a una base de datos (verry estructura de datos fácil). Sugeriría PostgreSQL, viene con algunas funciones geográficas http://www.postgresql.org/docs/8.2/static/functions-geometry.html . Para eso tiene que guardar los puntos en una columna "polígono", luego puede consultar con el operador "&&" si está en un polígono de agua. Para los atributos de una entrada de OpenStreetmap Way, debe consultar http://wiki.openstreetmap.org/wiki/Category:En:Keys


Hay otra forma de abordar esto utilizando la Api de Google Earth. Sé que es javascript, pero pensé que era una forma novedosa de resolver el problema.

De todos modos, he reunido una solución de trabajo completa aquí: note que también funciona para los ríos: http://www.msa.mmu.ac.uk/~fraser/ge/coord/

La idea básica que he usado es implementar el método hiTest del objeto GEView en la API de Google Earth .

Echa un vistazo al siguiente ejemplo de los más exitosos de Google. http://earth-api-samples.googlecode.com/svn/trunk/examples/hittest.html

El método hitTest recibe un punto aleatorio en la pantalla en (coordenadas de píxeles) para el que devuelve un objeto GEHitTestResult que contiene información sobre la ubicación geográfica correspondiente al punto. Si se usa el modo GEPlugin.HIT_TEST_TERRAIN con el método, se pueden limitar los resultados solo a tierra (terreno) siempre que los resultados se muestren en puntos con una altitud> 1m

Esta es la función que uso que implementa el hitTest:

var hitTestTerrain = function() { var x = getRandomInt(0, 200); // same pixel size as the map3d div height var y = getRandomInt(0, 200); // ditto for width var result = ge.getView().hitTest(x, ge.UNITS_PIXELS, y, ge.UNITS_PIXELS, ge.HIT_TEST_TERRAIN); var success = result && (result.getAltitude() > 1); return { success: success, result: result }; };

Obviamente, también desea tener resultados aleatorios desde cualquier lugar del mundo (no solo puntos al azar visibles desde un solo punto de vista). Para hacer esto, muevo la vista de la Tierra después de cada llamada exitosa hitTestTerrain . Esto se logra utilizando una pequeña función auxiliar.

var flyTo = function(lat, lng, rng) { lookAt.setLatitude(lat); lookAt.setLongitude(lng); lookAt.setRange(rng); ge.getView().setAbstractView(lookAt); };

Finalmente, aquí hay una versión simplificada del bloque de código principal que llama a estos dos métodos.

var getRandomLandCoordinates = function() { var test = hitTestTerrain(); if (test.success) { coords[coords.length] = { lat: test.result.getLatitude(), lng: test.result.getLongitude() }; } if (coords.length <= number) { getRandomLandCoordinates(); } else { displayResults(); } };

Entonces, la tierra se mueve aleatoriamente a una posición

Las otras funciones allí son simplemente ayudantes para generar los números aleatorios x, y, y aleatorios, para obtener los resultados y también para alternar los controles, etc.

He probado el código bastante y los resultados no son 100% perfectos, ajustando la altitude a algo más alto, como 50m resuelve esto, pero obviamente está disminuyendo el área de posibles coordenadas seleccionadas.

Obviamente podrías adaptar la idea a tus necesidades. Tal vez ejecutar el código varias veces para llenar una base de datos o algo así.


Para lidiar con el problema del cuerpo de agua será en gran medida un problema de datos, por ejemplo, ¿simplemente quiere perderse los océanos o también necesita perderse pequeñas corrientes? O necesita usar un servicio con la calidad de los datos que necesita, o bien, necesita obtener los datos y ejecutarlos localmente. Desde su edición, parece que quiere ir a la ruta de datos local, así que me centraré en la forma de hacerlo.

Un método es obtener un shapefile para áreas de tierra o de agua. Luego, puede generar un punto aleatorio y determinar si se cruza con un área de terreno (o, alternativamente, no se interseca con un área de agua).

Para comenzar, puede obtener algunos datos de baja resolución here y luego obtener datos de mayor resolución here para cuando desee obtener mejores respuestas en las líneas costeras o con lagos / ríos / etc. Mencionó que desea precisión en sus puntos con 5 decimales, que es un poco más de 1 m. Tenga en cuenta que si obtiene datos que coincidan con esa precisión, tendrá un conjunto de datos gigante. Y, si quiere datos realmente buenos, prepárese para pagarlos.

Una vez que tenga sus datos de formas, necesita algunas herramientas que lo ayuden a determinar la intersección de sus puntos aleatorios. Geotools es un gran lugar para comenzar y probablemente funcionará para tus necesidades. También terminará mirando el código de opengis (documentos en el sitio de geotools - no estoy seguro si los consumieron o qué) y JTS para el manejo de la geometría. Usando esto, puede abrir rápidamente el shapefile y comenzar a hacer algunas consultas de intersección.

File f = new File ( "world.shp" ); ShapefileDataStore dataStore = new ShapefileDataStore ( f.toURI ().toURL () ); FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = dataStore.getFeatureSource (); String geomAttrName = featureSource.getSchema () .getGeometryDescriptor ().getLocalName (); ResourceInfo resourceInfo = featureSource.getInfo (); CoordinateReferenceSystem crs = resourceInfo.getCRS (); Hints hints = GeoTools.getDefaultHints (); hints.put ( Hints.JTS_SRID, 4326 ); hints.put ( Hints.CRS, crs ); FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2 ( hints ); GeometryFactory gf = JTSFactoryFinder.getGeometryFactory ( hints ); Coordinate land = new Coordinate ( -122.0087, 47.54650 ); Point pointLand = gf.createPoint ( land ); Coordinate water = new Coordinate ( 0, 0 ); Point pointWater = gf.createPoint ( water ); Intersects filter = ff.intersects ( ff.property ( geomAttrName ), ff.literal ( pointLand ) ); FeatureCollection<SimpleFeatureType, SimpleFeature> features = featureSource .getFeatures ( filter ); filter = ff.intersects ( ff.property ( geomAttrName ), ff.literal ( pointWater ) ); features = featureSource.getFeatures ( filter );

Explicaciones rápidas:

  1. Esto supone que el archivo de forma que tienes son datos de polígono. Intersección en líneas o puntos no te va a dar lo que quieres.
  2. Primera sección abre el shapefile - nada interesante
  3. tienes que buscar el nombre de la propiedad de geometría para el archivo dado
  4. sistema de coordenadas: especificaste la latitud / duración en tu publicación, pero GIS puede ser un poco más complicado. En general, los datos a los que les señalé son geográficos, wgs84 , y eso es lo que configuré aquí. Sin embargo, si este no es el caso para usted, entonces debe asegurarse de estar tratando con sus datos en el sistema de coordenadas correcto. Si todo esto suena como una tontería, busque un tutorial sobre SIG / sistemas de coordenadas / datum / elipsoide.
  5. la generación de las geometrías de coordenadas y los filtros son bastante autoexplicativos. El conjunto resultante de características estará vacío, lo que significa que la coordenada está en el agua si sus datos son cobertura del suelo, o no está vacía, lo que significa lo contrario.

Nota: si haces esto con un conjunto de puntos realmente aleatorio, vas a golpear el agua con bastante frecuencia y te puede llevar un tiempo llegar a los 25k puntos. Es posible que desee tratar de definir su generación de puntos mejor que realmente aleatoria (como eliminar grandes trozos de los océanos Atlántico / Pacífico / Índico).

Además, es posible que las consultas de intersección sean demasiado lentas. Si es así, es posible que desee crear un índice de quadtree (qix) con una herramienta como GDAL . Sin embargo, no recuerdo qué tipos de índice son compatibles con geotools.


Para obtener una buena distribución uniforme en latitudes y longitudes, debe hacer algo como esto para obtener los ángulos correctos:

double longitude = Math.random() * Math.PI * 2; double latitude = Math.acos(Math.random() * 2 - 1);

En cuanto a evitar cuerpos de agua, ¿tiene los datos de dónde está el agua? Bueno, solo vuelve a muestrear hasta que tengas un éxito! Si todavía no tienes estos datos, parece que otras personas tienen mejores sugerencias que yo para eso ...

Espero que esto ayude, saludos.


Supongo que podría usar un mapa del mundo, definir algunos puntos para delimitar la mayoría de los cuerpos de agua como usted dice y usar un método de polígono. Contiene validar las coordenadas.

Un algoritmo más rápido sería usar este mapa, tomar un punto aleatorio y verificar el color debajo, si es azul, luego agua ... cuando tienes las coordenadas, las conviertes a latitud / longitud.


Suponiendo que Atlantis no esté en la base de datos, podría seleccionar ciudades al azar. Esto también proporciona una distribución de puntos más realista si pretende imitar la actividad humana: https://simplemaps.com/data/world-cities

Sólo hay 7.300 ciudades en la versión gratuita.


También puede hacer la cosa verde azul, y luego almacenar todos los puntos verdes para buscar más tarde. Esto tiene el beneficio de ser refinado "paso a paso". A medida que descubras una mejor manera de hacer tu lista de puntos, puedes simplemente apuntar a un grupo de puntos cada vez más preciso.

Quizás un proveedor de servicios ya tenga una respuesta a su pregunta: por ejemplo, https://www.google.com/enterprise/marketplace/viewListing?productListingId=3030+17310026046429031496&pli=1

Elevacion api? http://code.google.com/apis/maps/documentation/elevation/ sobre el nivel del mar o debajo? (No hay puntos holandeses para ti!)