Este artículo proviene de un motor de traducción automática.

SQL Server y MapPoint

Cómo lograr que MapPoint 2010 y SQL Server Spatial trabajen juntos

Eric Frost

Descargar el ejemplo de código

Después de mapas de Bing, dos de las tecnologías de geoespaciales más visibles de Microsoft son Microsoft MapPoint 2010 y la funcionalidad espacial en SQL Server 2008 R2. Sin embargo, aunque SQL Server es un almacén ideal para datos geoespaciales y MapPoint hace que un visor geoespaciales buena, comunicación entre los dos es no casi tan sencilla como debiera.

En este artículo demostrará cómo leer los objetos de punto y el polígono de SQL Server y representarlos en MapPoint. También le mostramos cómo volver a escribir letras y polígonos en SQL Server mediante la 4.0 de Framework entidad incluida con Visual Studio de 2010.

Con fines ilustrativos, utilizaremos el “ de la carne ” basado en Chicago del restaurante ubicaciones de la compañía y áreas comerciales hipotético. En el modelado y análisis de venta por menor, áreas comerciales pueden definirse mediante diversos parámetros y pueden utilizarse para objetivos distintos. Normalmente, están definidos como la región más pequeña alrededor de un almacén que contiene las áreas que cumplen un determinado umbral, por ejemplo, donde el 50 por ciento o un 75 por ciento de los clientes en directo o trabajo. Todas las áreas comerciales utilizadas en este artículo se han generado utilizando la característica de creación de MapPoint Drivetime zona, por lo que representan un área de comercio hipotético basado en tiempos de conducción.

Como una cadena con menos de dos docenas ubicaciones, carne al es un negocio pequeño, pero los mismos conceptos y técnicas que pueden aplicarse a los minoristas grandes con miles de ubicaciones y en otros sectores y aplicaciones.

El código de ejemplo y el conjunto de datos “ de la carne ” (como una secuencia de comandos SQL) están disponibles para su descarga en code.msdn.microsoft.com/mag201009Spatial de .

Mientras no se trata de un artículo técnico demasiado a misterioso aspectos del lenguaje o la tecnología más reciente, actúa como un temas de procedimientos prácticos para un matrimonio útil de las tecnologías comunes de Microsoft. Un par de obstáculos de incluir la incapacidad de Entity Framework para comprender directamente los objetos de la ubicación geográfica y el requisito de SQL Server espacial para los polígonos que a la izquierda, que no es necesaria para MapPoint. Con suerte, en este artículo le ayudará a programadores veteranos incluso que pueden ser reacios a saltar en el ámbito de geoespaciales por falta de experiencia previa y mostrar a los desarrolladores de MapPoint cómo aprovechar correctamente de SQL Server 2008 R2 al mismo tiempo.

Configurar la base de datos

Para poder seguir los ejemplos de código incluidos a continuación, descargue la secuencia de comandos SQL y ejecutarla en SQL Server para configurar la base de datos y objetos. Los datos se almacenan en una base de datos de SQL Server denominada “ organización ” e incluye una tabla, una vista y un procedimiento almacenado. Ubicaciones de carne al que se almacenan en una tabla denominada “ ubicaciones ” (consulte de figura 1).

image: The Table and View Included in the Sample Database

Figura 1 de la tabla y Vista incluyen en la base de datos de ejemplo

Esto incluye las direcciones de los almacenes de ’, los atributos (por ejemplo, resulta un drive-in?) y un tipo de datos de ubicación geográfica de punto de ubicación. Los polígonos de área de comercio hipotético también se almacenan en la tabla de ubicaciones de “ ”, en un campo denominado TradeArea utilizando el tipo de datos de zona geográfica.

La vista vLocations expone los campos de geografía de punto y el polígono en tipos de datos que se pueden entender y leer en Entity Framework.

El campo de ubicación geográfica del punto se descomponen en los campos de latitud y longitud y se pasa al cliente como un campo de varbinary. Esto es debido a que Entity Framework no trata directamente con los tipos de datos geography, pero pueden controlar los campos de varbinary. La aplicación más adelante puede convertir estos servicios en objetos de la ubicación geográfica.

Éste es el uspAddLocation del procedimiento almacenado, que, como el nombre sugiere, se utiliza para insertar nuevas ubicaciones de MapPoint en SQL Server:

CREATE VIEW [dbo].[vLocations] AS SELECT LocID,Location.Long As Longitude, Location.Lat As Latitude, CAST(Location AS VARBINARY(MAX)) AS Location, Locations.TradeArea.STAsText() As TradeAreaWKT, CAST(TradeArea AS VARBINARY(MAX)) AS TradeArea FROM Locations

Volveremos a esto más adelante.

Configuración de la aplicación.

Nuestro proyecto es una aplicación de Windows Forms de C# que incorpora el control de MapPoint. El control se incluye con MapPoint 2010, y la versión completa de MapPoint 2010 debe estar instalada para que esté disponible. Es posible desplazarse registros con botones para recorrer los registros y mostrar el almacén y su área de comercio. Almacenes también se pueden seleccionar, haga clic en icono de chincheta del almacén. El formulario tiene también una casilla de verificación para mostrar el área comercial como un casco convexo y un botón para agregar nuevas ubicaciones. De forma predeterminada, la aplicación muestra el polígono tal y como aparece en la base de datos (vea de figura 2).

image: The Al’s Beef App, Showing the Chicago Heights Store and Territory as Defined in the Database

La figura 2 de carne de de la aplicación, que muestra el almacén de niveles de Chicago y de la zona de ventas como está definido en la base de datos

If the View Trade Area As Convex Hull checkbox is set, a line (the convex hull) is wrapped around the trade area similar to wrapping a rubber band around the polygon (see Figure 3).

image: The Chicago Heights Store, with a Convex Hull Wrapped Around the Territory Shown in Figure 2

La figura 3 de La tienda de alto de Chicago, con un casco convexo ajustado alrededor de la zona de ventas que se muestra en la figura 2

Antes de que se puede implementar la visualización de la asignación, es necesario agregar objetos de datos de la entidad que señalan a la base de datos de tabla o vista. Para establecer los objetos de datos de entidad, con el botón secundario en la aplicación en el Explorador de soluciones de Visual Studio y vaya a agregar | nuevo elemento | elementos de Visual C# | Entity Data Model de ADO.NET. Haga clic en Agregar y elija Generar desde la base de datos. En el cuadro de diálogo Elija los objetos de base de datos, seleccione la ubicación de la tabla y la vLocations de vista. Después de hacer clic en Finalizar, el asistente crea los objetos y generar el código necesario para conectarse a la base de datos.

Para agregar el control de 2010 MapPoint para el formulario Windows Forms, es necesario agregar el componente de control de COM de MapPoint en el cuadro de herramientas de Visual Studio. COM no es la tecnología más moderno, pero sigue siendo una parte importante del ecosistema de Windows. Muchas aplicaciones, incluyendo MapPoint, sólo implementan una API a través de una interfaz COM, y compatibilidad con COM de Visual Studio no se sitúa directamente en cualquier momento antes.

Abra el cuadro de herramientas de Visual Studio y en la sección general, con el botón secundario y seleccione Elegir elementos. Vaya a la ficha componentes COM y seleccione Microsoft MapPoint 17 pulg. Control. El control de MapPoint 17 pulg hace referencia para MapPoint 2010 (Estados Unidos o en Europa). También se pueden utilizar las versiones más antiguas de MapPoint (adelante 2002), pero se requerirá cambios de nombre secundario (por ejemplo, la barra de herramientas y el símbolo de nombre de identificador).

En los ensamblados de los AxInterop.MapPoint y Interop.MapPoint, establezca la propiedad tipo de interoperabilidad de incrustar en false y la copia local de control de MapPoint True.The ahora se puede arrastrar hasta el formulario y usa la aplicación.

Al inicializar el formulario de asignación: Carga de MapPoint

El formato de mapa de declara varias variables de miembro, incluyendo la conexión de base de datos, Entity Framework, una lista de la información de almacén y una lista paralela de la información geográfica de los almacenes de ’ que se van a leer de la vista. La variable curLoc realiza un seguimiento de los ID de almacén actual dentro de la aplicación y objMap se utiliza para hacer referencia a objeto de mapa del control de MapPoint, tal como se muestra aquí:

namespace AlsBeef { public partial class Map : Form { CorporateEntities db; List<Location> locationList; List<vLocation> vlocationList; int curLoc = -1;    // <0 indicates 'not set' MapPoint.Map objMap; MapPoint.Symbol objSymb; ...

Cuando se crea el formulario, se llama al método CreateNewMapObject para inicializar el control de mapa y abrir una nueva asignación mediante la plantilla de mapa de América del Norte. Se establecen las barras de herramientas, objMap se define y se activa el punto de interés apagado por lo tanto, no para sea más clara el mapa (consulte de figura 4). “ Los puntos de interés ” son que MapPoint predefinidos lugares, restaurantes y teatros, por ejemplo.

La figura 4 de la creación de un formulario

public Map() { InitializeComponent(); CreateNewMapObject(); }


private void CreateNewMapObject() { MPctrl.NewMap(GeoMapRegion.geoMapNorthAmerica); object barObj = "advanced"; MPctrl.Toolbars.get_Item(refbarObj).Visible = true; MPctrl.Toolbars.LargeToolbarButtons = false; objMap = MPctrl.ActiveMap; // Make sure all points of interest are turned off objMap.PlaceCategories.Visible = MapPoint.GeoTriState.geoFalse; }

Método de carga del formulario rellena las dos listas de almacén de información. El locationList contiene toda la información no geográfica regular y vloc ­ ationList lee los campos geográficos, tal como se transforma por la vista de base de datos:

private void Map_Load(object sender, EventArgs e) { db = new CorporateEntities(); locationList = new List<Location>(); vlocationList = new List<vLocation>();

 ObjectQuery<Location> locationQuery = db.Locations; ObjectQuery<vLocation> vlocationQuery = db.vLocations;

 locationList = locationQuery.ToList(); vlocationList = vlocationQuery.ToList();

 InitMapSymb(); InitMapPins(); SetLocation(0); }

Las dos últimas líneas eficazmente iniciar la aplicación mediante la inicialización de la asignación. Agrega un marcador para cada ubicación de almacén (InitMapPins) y coloque los controles de formulario y de mapa para que señale a los datos de la primera ubicación de almacén (SetLocation).

Agregar marcadores a Map

Se convierten en las cosas más interesantes en el método InitMapPins:

private void InitMapPins() { MapPoint.Pushpin objPin = null; for (int i = 0; i < locationList.Count; i++) { MapPoint.Location objLoc = objMap.GetLocation(vlocationList[i].
Latitude.Value, vlocationList[i].Longitude.Value); objPin = objMap.AddPushpin(objLoc, locationList[i].Name); objPin.Symbol = 145; // Red fork and knife // (food, restaurant) } }

Recorrer el locationList, se recuperan los valores de latitud y longitud que se han calculado y expuestas por la vista. Se utilizan para crear objetos de la ubicación de MapPoint, que, a continuación, se utilizan para crear el mapa de chinchetas (objetos de marcador de MapPoint). El nombre del almacén se utiliza para la propiedad PushpinName, que se utilizará posteriormente para buscar y posicione el mapa. Los marcadores se representan con el símbolo de marcador de MapPoint integrados restaurante rojo (símbolo # 145). Una lista completa de símbolos de MapPoint 2010 integradas se puede encontrar en mapping-tools.com/info/pushpins/pushpins_2010.shtml de . Esta página también contiene vínculos a listados de tachuela redonda en versiones anteriores de MapPoint.

Posición para el registro actual y la adición de polígonos para el mapa

Nuevos registros se seleccionan y muestran el uso de los métodos IncDecLocation y SetLocation. IncDecLocation simplemente se aplica un incremento (cnt) a la posición actual (curLoc) y pasa esta nueva posición de registro para SetLocation:

private void IncDecLocation(int cnt = 0) { // Apply the increment/decrement, wrapping around if necessary int newLoc = (curLoc + cnt + locationList.Count) % locationList.Count;

 SetLocation(newLoc); }

La rutina SetLocation es la base de la aplicación. SetLocation selecciona una posición de registro nuevo y lo muestra en el mapa. SetLocation también quita el resalte del marcador anterior (si existe) y borra todos los polígonos de área comercial anterior de la asignación (vea de figura 5).

La figura 5 de rutina TheSetLocation constituye la base de aplicación

private void SetLocation(int newLoc) { MapPoint.Pushpin objPin = null;

  // Unhighlight previous pushpin If (curLoc>= 0) { objPin = (MapPoint.Pushpin) objMap.FindPushpin(locationList[curLoc].Name); objPin.Highlight = false; }

  // Clear all previous shapes while(objMap.Shapes.Count> 0) { objMap.Shapes[1].Delete(); }
 

  // Set the new location curLoc = Math.Min( Math.Max(newLoc,0), locationList.Count-1);

  objPin = (MapPoint.Pushpin) objMap.FindPushpin(locationList[curLoc].Name); objMap.Location = objPin.Location;

...

En la sección siguiente se convierte en un poco complicada. First, the application checks the status of the View Trade Area As Convex Hull checkbox. Si no se ha establecido, toma la cadena de Known Text (WKT) que define el polígono y lo pasa al método RenderPolygon personalizado se analiza y se procesa como un polígono en el mapa.

Si la casilla de verificación se ha establecido, extrae el objeto de varbinary de territorio del polígono y lo convierte en un objeto de ubicación geográfica, utilizando la clase System.IO.MemoryStream y BinaryReader método. STConvexHull es uno de los métodos que se incluye con SQL Server 2008, le permite modificar las instancias de los datos de geometría o ubicación geográfica. En particular, STConvexHull, sólo funciona con tipos de datos de geometría. Las diferencias entre la geometría de SQL Server y los tipos de datos geography se trata extensamente en otra parte, pero por ahora, tenga en cuenta que los datos de la geometría se definen en una instalación plana (2D Euclidean) plano cartesiano, mientras que los datos geography se proyectan sobre la superficie de tierra spheroidal mediante un sistema de coordenadas Esférico (datos de referencia, proyección, meridiano y unidad de medida).

El área comercial se almacena en la base de datos con un tipo de campo de ubicación geográfica y, a continuación, se convierte en un varbinary por la vista. Esto debe leerse en un objeto de la ubicación geográfica, que, a continuación, se puede convertir en un objeto de geometría para ejecutar el método STConvexHull.

Debido a las áreas de pequeñas que se trata de los cálculos realizados por STConvexHull en el objeto de geometría (plana) son prácticamente los mismos Would have produjo tenía el casco convexo ha calculado para el objeto de geografía spheroidal real.

En la siguiente parte de SetLocation, el área comercial original se dibuja como una línea fina de color negra y el casco convexo se representa como una línea más gruesa de color roja. El código se muestra en de figura 6.

La figura 6 de dibujar el área original de comercio y el casco convexo

...
// Draw trade area if (checkBox1.Checked == false) { RenderPolygon(vlocationList[curLoc].TradeAreaWKT); } else { // Need to add C:\Program Files\Microsoft SQL // Server\100\SDK\Assemblies\Microsoft.SqlServer.Types.dl // to references SqlGeographyTradeAreaGeog = new SqlGeography(); using (var stream = new System.IO.MemoryStream(vlocationList[curLoc].TradeArea)) { using (var rdr = new System.IO.BinaryReader(stream)) { TradeAreaGeog.Read(rdr); } } SqlGeometry TAConvexHullGeom = new SqlGeometry(); TAConvexHullGeom = SqlGeometry.STPolyFromText(TradeAreaGeog.STAsText(), 4326); TAConvexHullGeom = TAConvexHullGeom.STConvexHull(); RenderPolygon(TradeAreaGeom.ToString(), 3355443, 0); // Gray80 RenderPolygon(TAConvexHullGeog.ToString()); } ...

Por lo que esta cadena WKT aspecto y ¿qué hace RenderPolygon con ella? Ya ha visto los resultados (en las figuras 2 de y 3). Let’s profundizar en la parte interna.

WKT es un formato estándar de Open Geospatial Consortium (OGC) para dar formato a datos de vector geoespaciales en forma de texto. Una cadena de polígono WKT aspecto (abreviado mucho):

POLYGON ((-111.918823979795 33.6180476378649, -111.91810682416 33.6096635553986, -111.911686453968 33.6078672297299, -111.907403888181 33.599476357922, -111.907403888181 33.6060674674809, -111.903121406212 33.6060674674809))

La palabra “ POLYGON ” precede a una lista de las coordenadas que están rodeados por dos conjuntos de paréntesis. Pares de coordenadas individuales están separados por comas. Utilizamos el método MapPoint AddPolyLine para dibujar el polígono en el mapa y agregarlo a la colección Shapes de MapPoint. Esto toma una matriz de objetos de la ubicación de MapPoint como parámetro. Convertir la cadena WKT en una matriz de objetos de la ubicación, requiere la mitad una docenas de líneas de código. RenderPolygon realiza esto mediante la eliminación de los paréntesis y prefijo “ POLYGON ” antes de la división de la cadena en las coordenadas que se utiliza el separador de coma. Coordenadas individuales, a continuación, se analizan en pares de valores Double (longitud, latitud) que se utiliza para crear objetos de la ubicación de MapPoint. La matriz resultante de objetos de la ubicación, a continuación, se pasa a AddPolyline para crear el nuevo polígono.

RenderPolygon toma parámetros adicionales para el grosor de línea y de color (consulte de figura 7).

La figura 7 del Método TheRenderPolygon

private void RenderPolygon(string polystring, int forecolor = 128, int weight = 3) { polystring = polystring.Replace("POLYGON ((", ""); polystring = polystring.Replace("))", ""); string[] stringList = polystring.Split(','); MapPoint.Location[] objLoc = new MapPoint.Location[stringList.Count()]; for (int i = 0; i <stringList.Count(); i++) { string[] coords = stringList[i].Trim().Split(' '); objLoc[i] = objMap.GetLocation(Convert.ToDouble(coords[1]), Convert.ToDouble(coords[0]), 0); } MapPoint.Shape objShape; objShape = objMap.Shapes.AddPolyline(objLoc); objShape.Line.ForeColor = forecolor; objShape.Line.Weight = weight; }

Un RenderPolygon más completo podría tomar parámetros adicionales o no se rellena la forma, el color de relleno, un nombre de la forma (una cadena interna se puede asignar a las formas) y el zOrder (para colocar la forma delante o detrás de las carreteras y otras formas).

Dibujo y anotaciones se pueden colocar en un mapa de MapPoint por el usuario y un programa. MapPoint es compatible con un total de 40 colores diferentes para esta anotación. Aunque la compatibilidad con los colores RGB (16.777.216 diferente) estándar de 3 bytes, en realidad, que estos números simplemente proporcionan una forma útil de especificar el color que se utiliza la interfaz de programación. Los 40 colores compatibles con MapPoint pueden verse en mapping-tools.com/info/pushpins/colors.shtml de .

Históricamente, esta limitación ha ayudado a con la eficacia de la actualización de imagen, pero hoy en día ayuda principalmente mapa claridad al ayudar a garantizar que los colores son diferentes.

Ahora llegamos a la parte final de SetLocation (consulte de figura 8).

La figura 8 de la parte final de SetLocation

...
// Reset zoom level objMap.Altitude = 30; objPin.Highlight = true;

   Double distance; distance = NearestLocation(curLoc) * 0.000621371192; //convert to miles

   label1.Text = "ID: " + locationList[curLoc].LocID.ToString(); label2.Text = locationList[curLoc].Name + " - " + locationList[curLoc].Format; label3.Text = locationList[curLoc].Address + ", " + locationList[curLoc].City + ", " + locationList[curLoc].State; label4.Text = "Distance to next closest store: " + String.Format("{0:#,0.0}", distance) + " miles";

  }

private double NearestLocation(int curLoc) {

 SqlGeography AllLocations = new SqlGeography(); SqlGeography CurLocation = new SqlGeography(); for (int i = 0; i <locationList.Count; i++) { SqlGeography TempLocation = new SqlGeography(); using (var stream = new System.IO.MemoryStream(vlocationList[i].Location)) { using (var rdr = new System.IO.BinaryReader(stream)) { TempLocation.Read(rdr); } } if (i == curLoc) { CurLocation = TempLocation; } else { AllLocations = AllLocations.STUnion(TempLocation); } } return (Double)AllLocations.STDistance(CurLocation); //meters }

Esto resalta el nuevo PIN, establece el nivel de zoom (utilizando la propiedad de la altitud del objeto de mapa), informa de la información de almacén (a partir de la matriz locationList) y calcula la distancia a la ubicación de almacén más cercana.

Esta distancia se calcula por NearestLocation. Esto se repite a través de las ubicaciones y utiliza el método STUnion espacial de SQL Server para combinar los puntos de ubicación geográfica de la ubicación en una instancia MultiPoint de geography. La excepción es la ubicación del almacén actual, que se omite; en caso contrario, la distancia siempre será cero millas! La aplicación, a continuación, utiliza el método STDistance para calcular la distancia en metros entre la ubicación del almacén actual y la instancia MultiPoint de geography. STDistance indica la distancia de hasta un punto como la distancia más corta a cualquier punto del componente en el punto.

El botón para agregar una nueva ubicación del sitio quita los polígonos de área de comercio de la asignación y, a continuación, cambie simplemente el puntero del mouse (ratón) para una forma de cruz:

private void button1_Click(object sender, EventArgs e) { // Clear all previous shapes while(objMap.Shapes.Count > 0) { objMap.Shapes[1].Delete(); } MPctrl.MousePointer = MapPoint.GeoPointer.geoPointerCrosshair; }

Para poder trabajar con los eventos de MapPoint, el formulario requiere un controlador de eventos definido en el Diseñador de formularios. Los eventos se pueden agregar mediante el formulario en el diseñador o agregar manualmente a Map.Designer.cs. Los controladores se agregan dos de los eventos de MapPoint: SelectionChange y BeforeClick, tal como se muestra en de figura 9.

La figura 9 de Agregar controladores de eventos de MapPoint

// // MPctrl // this.MPctrl.Enabled = true; this.MPctrl.Location = new System.Drawing.Point(13, 13); this.MPctrl.Name = "MPctrl"; this.MPctrl.OcxState = ((System.Windows.Forms.AxHost.State) (resources.GetObject("MPctrl.OcxState"))); this.MPctrl.Size = new System.Drawing.Size(674, 389); this.MPctrl.TabIndex = 0; this.MPctrl.SelectionChange += new AxMapPoint._IMappointCtrlEvents_SelectionChangeEventHandler (this.MPctrl_SelectionChange); this.MPctrl.BeforeClick += new AxMapPoint._IMappointCtrlEvents_BeforeClickEventHandler (this.MPctrl_BeforeClick);

Este evento se utiliza para detectar si el usuario ha seleccionado una chincheta. A continuación, se utiliza para mover el registro actual a registro del este marcador. La figura 10 muestra la implementación del controlador de eventos.

La figura 10 de la implementación de un controlador de evento SelectionChange

private void MPctrl_SelectionChange(object sender, AxMapPoint._IMappointCtrlEvents_SelectionChangeEvent e)

{ // Has the user just selected a pushpin?
if (e.pNewSelection is MapPoint.Pushpin) { MapPoint.Pushpin ppin = e.pNewSelection as MapPoint.Pushpin;

    // Find the corresponding location object, and select it for (int iloc = 0; iloc < locationList.Count; iloc++) { if (locationList[iloc].Name == ppin.Name) { // Found it: select, and move to it SetLocation(iloc); break; } } } }

Esto comprueba que el objeto recién seleccionado, de hecho, un marcador. A continuación, se realiza una búsqueda simple a través de la locationList local para un registro coincidente. Marcadores de MapPoint pueden tener nombres duplicados, por lo que este código supone que todos los registros de ubicación (y por lo tanto, marcadores) tienen nombres únicos. También debe comparar las coordenadas geográficas para situaciones donde esto no puede utilizarse.

Controlador de eventos de BeforeClick de la asignación se utiliza la funcionalidad de “ agregar la nueva ubicación de almacén ”. El controlador se comprueba si el puntero del mouse (ratón) es una forma de cruz, es decir, el usuario está intentando insertar una nueva ubicación de sitio. MapPoint le permite controlar el evento click si el puntero no es una forma de cruz. Si el puntero del mouse (ratón) es una forma de cruz, el sistema aplica reventado a la acción de clic y agrega un nuevo marcador en la ubicación del puntero del mouse mediante el símbolo rojo restaurante. En este momento, para simplificar las cosas, en lugar de tener las tablas de usuario del área de comercio, el programa utiliza el método de MapPoint AddDrivetimeZone para generar un área hipotético comerciales (viaje de hora-base) alrededor del nuevo sitio.

En aras de en SQL Server, puede obtener acceso a esta forma, la forma en primer lugar se descomponen en los vértices, que, a continuación, se convierten en un polígono definición WKT (texto). A continuación, se escribirá en SQL Server.

Para pasar el polígono y el punto de nuevo en SQL Server y actualizar las columnas de la ubicación geográfica, podemos utilizar los procedimientos almacenados compatibles con Entity Framework normales, ya que no se admite el tipo de datos de zona geográfica. Sin embargo, debido a que la ejecución de procedimientos almacenados arbitrarios ahora es compatible con Entity Framework 4.0, es posible importar el procedimiento almacenado y lo ejecutará como si fuera una función normal.

Este código establece los parámetros y, a continuación, ejecuta el usp ­ AddLocation almacenado procedimiento:

object[] parameters = { new SqlParameter("Latitude",objLoc.Latitude), new SqlParameter("Longitude",objLoc.Longitude), new SqlParameter("PolyWKT",PolyWKT) };

var retValue = db.uspAddLocation(objLoc.Longitude, objLoc.Latitude, PolyWKT);

Por último, esta rutina restablece el mapa (CreateNewMapObject), vuelve a consultar la lista de ubicaciones de la base de datos (InitMapPins) y selecciona el nuevo almacén de que el registro actual (SetLocation):

// Re-query and re-initialize map ObjectQuery<Location> locationQuery = db.Locations; ObjectQuery<vLocation> vlocationQuery = db.vLocations; locationList = locationQuery.ToList(); vlocationList = vlocationQuery.ToList(); objMap.Saved = true; CreateNewMapObject(); InitMapSymb(); InitMapPins(); SetLocation( locationList.Count – 1 ); e.cancel = true; }

La línea e.cancel=true; impide que el evento click de procesamiento posterior MapPoint. El procedimiento almacenado de uspAddLocation sigue (consulte de figura 11).

La figura 11 de la uspAddLocation Stored Procedure

CREATE PROCEDURE [dbo].[uspAddLocation] @Longitude FLOAT, @Latitude FLOAT, @PolyWKT NVARCHAR(MAX) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements.
SET NOCOUNT ON;

DECLARE @NewLocID int = 0 SELECT @NewLocID = MAX(LocID)+1 FROM Locations

DECLARE @NewPoly geography SET @NewPoly = geography::STPolyFromText(@PolyWKT,4326)

INSERT INTO Locations(LocID,Name,Address,City,State,Format,Location,TradeArea) VALUES(@NewLocID, 'New Location ' + CAST(@NewLocID As varchar(3)), '123 Main', 'Anywhere', 'ST', 'Food', geography::Point(@Latitude,@Longitude,4326), @NewPoly)

SELECT @NewLocID AS NewLocID

END

Puede ver una nueva instancia de la ubicación geográfica y la variable que se crea para el polígono antes de la instrucción INSERT, mientras que la ubicación del punto se crea mediante el método de punto en el método INSERT. Cualquiera de los enfoques es válido.

El código de control de eventos en de figura 12 controla los botones de “ anteriores ” y “ siguiente ”, la casilla de verificación casco convexo y el cierre del formulario, éste finaliza la aplicación.

La figura 12 de finalización de la aplicación.

private void prev_Click(object sender, EventArgs e) { IncDecLocation(-1); }

private void next_Click(object sender, EventArgs e) { IncDecLocation(1); }

private void checkBox1_CheckedChanged(object sender, EventArgs e) { IncDecLocation(); }

private void Map_FormClosing(object sender, FormClosingEventArgs e) { db.Dispose(); MPctrl.ActiveMap.Saved = true; }

Ver y editar visualmente los datos geoespaciales de SQL Server

En este artículo trata de mucha información, pero muestra una aplicación completa de extremo a extremo con SQL Server, que se muestra cómo pasar datos de entrada y salida mediante espacial de SQL Server y los métodos de MapPoint para presentar y editar la información real.

Los principios que se muestra a continuación se pueden obtener aún más.Guardar una copia local de los datos garantiza que las actualizaciones de asignación rápida, pero no sería práctico para grandes conjuntos de datos.En estos casos, los datos se deben obtener de forma de registro a registro, lo ideal es que con un mecanismo de almacenamiento en caché.

MapPoint es capaz de algunas operaciones útiles geoespaciales (por ejemplo, el cálculo de la zona horaria de la unidad), pero carece de muchas de las operaciones de geoespaciales esperadas de una completa GIS.Aquí, aprovechamos dos estas operaciones, STConvexHull y STDistance, desde las extensiones de SQL Server espacial.Otras funciones avanzadas disponibles en las extensiones de espaciales incluyen la capacidad para medir la longitud y el alcance de las características geográficas, así como buscar uniones e intersecciones de polígonos.Estas funciones podrían utilizarse para crear una aplicación de administración sofisticadas de territorio.Esto se puede combinar zonas de ventas o buscar superposiciones en un almacén es cannibalizing el negocio de la otra.

Del mismo modo, se podrían aprovechar puntos fuertes de MapPoint.MapPoint es capaz de geocoding sin conexión.Este ejemplo utiliza dinates de ­ coor existente, pero el geocoder MapPoint podría utilizarse para buscar direcciones en su lugar.MapPoint también incluye un número de bases de datos demográficos en la provincia, código postal y los niveles de censos digestivo.Estos datos podrían representarse en un mapa de almacén, lo que permite comparar fácilmente, por ejemplo, cómo se comparan las ventas de almacén con las poblaciones locales y los niveles de ingresos.

Mirando hacia adelante, SQL Server espacial es probable que tenga un gran avance generaciones con la siguiente versión de SQL Server, el producto MapPoint ha estado disfrutando un renaissance de desarrollo de nuevas y las características de las dos últimas versiones y está establecido para continuar.Además, Entity Framework es probable que seguir agregar compatibilidad con nuevos tipos de campo, incluidos los tipos de datos espaciales, lo que deben mejorar la comunicación entre SQL Server y de MapPoint.Juntas, estas tecnologías que forman una plataforma en desarrollo robusta y eficaz para la asignación de desarrollo de aplicaciones.

Eric Frost es un MVP de Microsoft y el desarrollador de aplicaciones de negocio especializada en GIS/asignación de aplicaciones. He manages the active Microsoft mapping technology forum mapforums.com and can be reached at eric.frost@mp2kmag.com.

Richard Marsden es un MVP de Microsoft y el desarrollador de software autónomo. He sells a number of MapPoint extensions at mapping-tools.com and operates the GeoWeb Guru Web site at geowebguru.com.

Gracias a los siguientes expertos técnicos de este artículo:Bob Beauchemin,Ed KatibahyAmar Nityananda