3 votos

¿Cómo obtener marcadores de millas precisos de DOT ShapeFile?

Estoy teniendo problemas para obtener marcadores de millas precisos a través de la travesía de la ruta utilizando PostGIS.

Sobre la base de la discusión en ¿Geocodificación de marcador de millas/punto kilométrico a latitud/longitud? He descargado el ShapeFile oficial del Departamento de Transporte de Texas ( enlace , ver Carreteras de TxDOT 2010 a la derecha).

Primero importé el ShapeFile en Postgres usando shp2pgsql . Luego, con un programa en C#, utilicé el programa de PostGIS ST_Line_Interpolate_Point como la carne de mi código que atraviesa cada línea un kilómetro a la vez. Aquí está la parte principal del código:

        public SortedDictionary<int, string> GenerateMileMarkers()
    {
        // make the sorted dictionary
        SortedDictionary<int, string> dict = new SortedDictionary<int,string>();

        // get length of route
        double length = (double)(new NpgsqlCommand(
            "SELECT ST_Length('" + geometry + "')",
            connection)).ExecuteScalar();

        // find each mile marker
        // note that "increment" is 1/69.17, the reciprocal of miles/degree
        for (int i = 0; i <= length/increment; i++)
        {
            double segmentLength = (i * increment)/length;

            string mileMarkerPosition = (string)(new NpgsqlCommand(
                // have to use ST_Linemerge to get from MULTILINESTRING to LINESTRING
                // since ST_Line_Interpolate_Point requires LINESTRING
                "SELECT ST_AsEWKT(ST_Line_Interpolate_Point(ST_Linemerge('" + geometry + "'), " + segmentLength + ")) As foo;",
                connection)).ExecuteScalar();

            dict.Add(i, mileMarkerPosition);
        }

        return dict;
    }

Creo que la medida de referencia del SHP es un grado de latitud, así que hice cálculos y supuse que un grado tiene 69,17 millas, aunque gracias al comentario de Nicklas Avén más abajo, ahora me doy cuenta de que esto no es correcto ya que las líneas longitudinales están más juntas cuanto más al norte se va.

Resumiendo, he generado puntos numerados en serie para cada ruta que representan marcadores de millas. El problema es que me encuentro con errores significativos.

Encontré el error comparando los marcadores de millas indicados por Google Maps con los de una muestra de intersecciones de autopistas interestatales (IH) o intersecciones IH con fronteras estatales. He encontrado errores entre el ~4% y el ~22%. La mayoría de los errores son de aproximadamente ~15% +/- 1%. Este es un ejemplo del error: donde La I-30 llega a la frontera entre Texas y Arkansas es oficialmente el punto kilométrico 223 (según Google Maps), pero mediante este método obtuve el 260. Eso es un error de alrededor del 16,6%. Además, donde La I-30 llega a la I-635 en Mesquite es alrededor del punto kilométrico 56, pero he calculado el 67. Eso es un error del 19,6%.

Este error variable me preocupa mucho. Dado que los errores son inconsistentes, incluso dentro de la misma carretera, no es como si pudiera aplicar un factor de escala a todo.

Esto es un problema porque estoy intentando hacer un análisis de unos cuantos millones de eventos, y estos eventos se expresan como ocurridos en el punto kilométrico X de la carretera Y.

A continuación, un usuario cuestionó con razón la proyección. Parece que el archivo puede tener, de hecho, una proyección, ya que tiene un archivo PRJ:

GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]

¿Es posible realizar mediciones precisas a partir de este SHP emitido por TxDOT?

(NOTA: Antes he utilizado la "referenciación lineal", pero no creo que se trate de una verdadera referenciación lineal porque no estoy correlacionando un punto con una ubicación a lo largo de una ruta. El ST_Line_Interpolate_Point La función PostGIS resulta estar en el Sección de referencia lineal de la Referencia PostGIS).

2voto

Lars Mæhlum Puntos 4569

Sin mirar todos los detalles de tu problema, hay un error importante que estás cometiendo. Dices que un grado es 69.17 millas. eso no es correcto. un grado en dirección este-oeste es diferente en diferentes lugares. En el ecuador un grado es 1/360 * longitud del ecuador. en los polos un grado es cero longitud. Pero las longitudes son constantes. Supongo que es por eso que crees que obtienes errores incinsistentes.

si no está trabajando en un área demasiado grande, debería transformar sus datos a alguna proyección más plana usando millas o metros.

HTH

Nicklas

0voto

Niall C. Puntos 1234

No sólo la distancia lat lon cambia con cada grado, sino que no está diseñado como un sistema de medición geodésico.

Debe utilizar un sistema de coordenadas local aunque se proyecte sobre la marcha.

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