jueves, 17 de octubre de 2013

Programa en MapBasic para convertir distancia euclidiana a distancia Manhattan

En muchas ocasiones en problemas de cartografía numérica, tenemos un archivo con líneas. Pueden referirse por ejemplo a líneas de deseo de una encuesta origen destino. La apariencia es esta:


Es muy probable que estemos interesados no en conocer la distancia euclidiana o la loxodrómica sino la distancia Manhattan. A veces por la contabilidad cartográfica no es posible conocer el trayecto exacto de un objeto, pero si puntos origen destino. Entonces la distancia entre estos puntos es una aproximación al recorrido real. En la figura de abajo se muestra como representamos normalmente el recorrido entre dos puntos. 


Sin embargo el recorrido real puede ser como el que se muestra abajo. Cabe mencionar que entre más cercanos sean los puntos se tenderá a mayor tensión de línea, es decir, a tener una línea más  cercana a la recta euclidiana.


Una aproximación que no refleja el recorrido exacto pero tampoco es tan generalizado como el euclidiano, es la distancia Manhattan, que por definición es la distancia resultante entre dos puntos de sumar los lados que resultan del tríángulo que tiene esa distancia por hipotenusa en un ángulo recto con lados paralelos a los ejes cartesianos.



Además esta distancia tiene la propiedad de que será igual en cualquier trayecto a base de ángulos rectos que se haga. Tal como se muestra en la figura de abajo. Será lo mismo caminar del punto superior al inferior con cualquier combinación, siempre y cuando el trayecto forme ángulos rectos.


Bien, ahora, como se cálcula la distancia?. Simplemente hay que extraer el objeto, estimar las coordenadas del punto origen (X1,Y1) y las del punto destino (X2,Y2) , y estimar las ditancias de los lados.

Si tenemos un archivo en MapInfo de rectas, llamado "Lineas" con una columna llamada Manhhatan, solamente vamos extrayendo cada recta. Y obtenemos la distancia del punto X1,Y1 al punto X2,Y1 que es el lado paralelo a las X, y luego, de X1,Y1 a X1,Y2. Y se suman.

He aquí el programa para correr en MapBasic:

Dim Fin,N As Integer
Dim X1,X2,Y1,Y2,DistH,DistV,Hipo,Manhatan As Float
Dim Tp As String
Dim MyLine As Object
Dim Tabla As String
Tabla="Lineas"
Fin=TableInfo(Tabla,8)

For N=1 To Fin
Select Obj From Tabla Where RowId=N Into Provi
MyLine=Provi.Obj

X1=ObjectGeography(MyLine,1)
X2=ObjectGeography(MyLine,3)
Y1=ObjectGeography(MyLine,2)
Y2=ObjectGeography(MyLine,4)

DistH=Distance(X1,Y1,X2,Y1,"km")
DistV=Distance(X1,Y1,X1,Y2,"km")
Hipo=Sqr(DistH*DistH+DistV*DistV)
Manhatan=DistH+DistV
Print N
Print Manhatan

UpDate Tabla
Set DistanciaManhattan=Manhatan
Where RowId=N


Next


No hay comentarios:

Publicar un comentario