Calcular coordenadas geográficas de un punto en Delphi utilizando objetos de Geomedia
Hace poco tiempo, estuvimos trabajando en un aplicación Web que formaba parte de un SIG, en la que al hacer click sobre una entidad gráfica, teníamos que mostrar las coordenadas geográficas de la ubicación de dicha entidad (edificios).
El Sistema estaba formado por la propia aplicación Web en ASP, por una capa de servicios programada en Delphi (encargada de comunicarse con el servidor de mapas Geomedia WebMap), y por una base de datos SQL Server, cuyos datos espaciales estaban almacenados usando el datum ED50 (con lo que necesitábamos realizar una transformación al datum WGS84).
Para calcular y mostrar al usuario las coordenadas de la geometría seleccionada, decidimos calcular primero el centroide de la feature para simplificar el problema, ya que la diferencia entre el punto seleccionado y el centro de la geometría resultaba irrelevante a nivel de decimales.
A continuación, muestro un fragmento de código Delphi encargado de hacer el cálculo haciendo uso de objetos Geomedia:
inicializaServidor();
Servidor.mapServer.SetCoordinateSystem (datafolder+'\wgs84.csf');
objAFP:=Servidor.mapServer.CreateObject('GeoMedia.AttributeFilterPipe');
Servidor.mapserver.addQuery('queryG',edificios,tablaG);
Servidor.mapserver.queries.Item['queryG'].RequiredFieldNames:='*';
objAFP.InputRecordset := Servidor.mapserver.queries.Item['queryG'].recordset;
objAFP.filter:=filter;
objCPP:=Servidor.mapServer.CreateObject('GeoMedia.CenterPointPipe');
objCPP.InputRecordset:= objAFP.OutputRecordset;
objCPP.InputGeometryFieldName:='Geometry';
objCPP.OutputGeometryFieldName:= 'GeometryOut';
objCH := Servidor.mapServer.CreateObject('GWEUtility.GeometryUtility');
objCH.InputRecordset := objCPP.OutputRecordSet;
objCPP.outputRecordSet.MoveFirst;
objCH.GeometryFieldName := 'GeometryOut';
longitud:=objCH.OutputGeometry.Origin.x;
latitud:=objCH.OutputGeometry.Origin.y;
Servidor.mapServer:=Unassigned; //Liberación del MapServer
Servidor.mapServerManager:= Unassigned;