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).