Más

¿Convertir un conjunto de puntos a polígono usando C #?

¿Convertir un conjunto de puntos a polígono usando C #?


Quiero convertir un conjunto de ponints gps a polígono. Usé un bucle simple para convertirlo en un WKT y luego usé makevalid () en el servidor SQL y lo guardé en una columna de gemetría en la base de datos. algo. por ejemplo tengo estos puntos

,,,

Usé un bucle para crear una cadena como

Geometry :: STFromText ('Polígono (x1 y1, x2 y2, x3 y3, x4 y4, x1 y1)', 4326) .Makevalid ()

¿Es correcto este método? ¿Necesito convertir en puntos?


Dado que los está construyendo en C #, la mejor manera es probablemente usar las clases de construcción SQLGeography / SQLGeometry.

Se puede acceder a ellos desde la biblioteca Microsoft.SqlServer.Types. Algunos ejemplos de su uso se encuentran aquí.

Dado que está utilizando puntos GPS, es probable que sean Lat / Lons. En ese caso, usaría el tipo de datos Geografía en lugar de Geometría. Si necesita reproyectar las coordenadas, esta pregunta puede ayudar. Además, este sitio puede proporcionar algo de ayuda.

Si usa Geografía, asegúrese de que su polígono esté construido en sentido antihorario. En SQL Server 2008 obtendrá un error. En SQL Server 2012+, terminará con un gran polígono (tierra entera) con un pequeño agujero.


James en código

Gestionar una gran cantidad de entidades con interdependencias suele ser más fácil cuando tienes algún tipo de representación visual.

Recientemente me enfrenté a este desafío con los scripts QlikView. Un cliente tiene una implementación de QlikView particularmente grande, con cientos de QVD, QVW y varias fuentes de datos.

Necesitaba algún tipo de representación visual de qué QVW estaban leyendo qué fuentes de datos, leyendo y escribiendo en qué QVD, etc., para ayudarme a mantener una estructura lógica. Por el bien de la velocidad, recurrí a mis habilidades básicas de codificación: C #.

Después de crear una nueva aplicación de consola en Visual Studio, lo primero fue hacerse con algunos archivos:

Usé un archivo app.config para almacenar el directorio de origen de los archivos para analizar y recuperé todos los archivos .qvw:

Luego extraiga los scripts del cargador de los archivos QVW:

Después de agregar QlikView.exe a las referencias del proyecto, podemos obtener el Interop.QlikView.dll incrustado, que proporciona una envoltura .NET alrededor de QlikView:

Luego, quiero analizar los scripts del cargador y extraer una lista de nodos y vértices, que representan QVW, QVD y fuentes de datos dependientes.

Nota: Lo siento si intercambio aleatoriamente la palabra & # 8216node & # 8217 con & # 8216vertex & # 8217, y & # 8216edge & # 8217 con & # 8216arc & # 8217 a lo largo & # 8211 son sinónimos, y & # 8217 nunca he decidido cuál prefiero !

Por ejemplo, los nodos podrían representar:

  • Un QVW
  • Un QVD
  • Una tabla de base de datos
  • Una hoja de cálculo de Excel
  • Un servicio web

Los arcos representan la dependencia entre ellos. Por ejemplo, si un QVW se carga desde un QVD, hay un arco dirigido desde el QVW al QVD.

Quería que una clase de nodo representara una relación: ella misma, que contiene un arco a otro nodo:

Decidí usar expresiones regulares para extraer dependencias de los scripts del cargador. Así que creé la siguiente clase para hacer diferentes tipos de coincidencia de RegEx para detectar una dependencia (nodo y arco):

Lo difícil fue crear las expresiones regulares para que coincidan con varias dependencias. Soy un verdadero aficionado cuando se trata de RegEx. Se me ocurrió lo siguiente, que estoy seguro de que será ofensivo para los profesionales de RegEx:

Nota: Estos RegExes son sencillos y aún están en desarrollo & # 8211 ¡esto es solo una etapa de prueba de concepto!

Extraer nodos y arcos de scripts es solo una cuestión de:

Ahora tenemos una lista de nodos (QVW y QVD) con arcos. Genial, pero no sirve de mucho hasta que podamos ver & # 8217em! Entonces, mapeémoslos:

Usé QuickGraph para crear un archivo & # 8216dot & # 8217, que puede ser consumido por el muy útil GraphViz. Entonces, después de agregar QuickGraph.dll y QuickGraph.Graphviz.dll:

¡Eh voilá! Se produce un archivo .dot, que cuando se abre en GraphViz, le permite renderizar en .gif, .svg o lo que quiera, su gráfico de dependencia en forma visual.


Luego tengo una clase responsable de crear el contexto NHibernate y dárselo al administrador de sesiones. Tenga en cuenta que el objeto de base de datos auxiliar proporcionado por NHibernate.Spatial se agrega a la configuración & # 8211 esto proporciona información a NHibernate sobre cómo interpretar los tipos de datos espaciales.

Para probar el proveedor de sesión y la configuración de NHibernate, tengo una base de prueba (utilizada en todas las pruebas) para configurar el contenedor Castle Windsor IoC:

Una base de prueba de base de datos además de eso para las pruebas de integración de la base de datos (pero que no es específica del proveedor de la base de datos), que crea una instancia de un administrador de sesión y proporciona una forma de generar el esquema de la base de datos:

Y una base de prueba específica de SQL Server además de eso, para completar la configuración del contexto de prueba para SQL Server.

Tenga en cuenta que cuando uso Castle Windsor para resolver IInitialiseNhibernate, estoy usando el método de resolución sobrecargado que acepta un nombre de servicio. Esto me permite especificar dos implementaciones de IInitialiseNhibernate que toman diferentes argumentos de cadena de conexión, una para pruebas y otra para producción. Elijo usar Binsor para configurar el contenedor, por lo que mi windsor.boo se parece a esto:


Implementación de .NET en C #

En el momento de escribir este artículo, tenía que seguir algunos pasos manuales para poner en marcha un ejemplo funcional. La primera fue ejecutar el archivo init_spatialite-2.3.sql que viene con SpatiaLite para crear una base de datos con las tablas del sistema necesarias y los datos SRID para soportar el procesamiento espacial.

Luego, necesitamos inicializar la extensión libspatialite (incluida en la descarga de SpatiaLite) llamando a SELECT load_extension (& # 8216libspatialite-2.dll & # 8217). Descubrí que tenía que tener el dll en mi PATH de la clase de Windows. En C # podemos hacer esto, por ejemplo, así:


Business Intelligence & # 8211 Día 1 lección 1

12 de julio de 2009

Fue hace unos años, recién salido de la Universidad, trabajando con un empleador que recientemente había comprado una máquina que alimentaba varios tipos de documentos en papel a alta velocidad. El problema era que en numerosas ocasiones la máquina se atascaba varias veces, lo que reducía el beneficio de esta máquina monstruosa superrápida.

Entonces, mi empleador tenía que tomar decisiones para ayudar a maximizar el rendimiento y, por lo tanto, las ganancias & # 8211, qué trabajos eran más susceptibles a atascos y, en cambio, deberían procesarse en las máquinas más lentas pero más confiables, manteniendo la alta velocidad a toda velocidad.

La respuesta estaba en las bases de datos y la información # 8211 sobre tipos de documentos, atascos, etc. Solo necesitaba procesarse para dar una medida para cada trabajo & # 8211 el número promedio de atascos por tipo de documento.

Como desarrollador novato con pocas herramientas en mi cinturón, recurrí a mi Maslow de uso múltiple & # 8217s hammer & # 8211 Java. Una elección terrible, pero podría hacer el trabajo rápidamente de esa manera. Así que ataqué el siguiente esquema de base de datos con bucles intensivos en el procesador, uniendo tablas y agregando todo en el código:

Esquema relacional OLTP (normalizado)

Atascos por documento para 3 tipos de documentos

Operador Doc A:
Tamaño 30 & # 21527
Tipo: Factura
Medio: papel
Doc B:
Tamaño: 4 & # 2159
Tipo: Factura
Medio: Tarjeta
Doc C:
Tamaño: 50 & # 21537
Tipo: Diagrama
Medio: papel
Beto 0.01 0.15 0.05 0.07
Salida 0.005 0.17 0.06 0.078
Zoe 0.011 0.15 0.055 0.072
0.00866 0.156 0.055

Esta tabla es muy valiosa para la empresa & # 8211 muestra que el documento B no debe usarse en la máquina de alta velocidad, porque causa más atascos que A o C. En otras palabras, permitió tomar decisiones comerciales informadas basadas en datos históricos. para mejorar la eficiencia futura de su empresa. Ahora sé que esto se llama Inteligencia de negocios o BI.

Ahora también sé que este es un método terriblemente ineficiente: cada vez que se llama al informe, hay miles de combinaciones de tablas en curso, cálculos sobre la marcha, lo que significa informes lentos y carga de la base de datos.

El problema aquí es cómo se almacenan los datos: una base de datos relacional normalizada OLTP, con muchas tablas pequeñas, que está optimizada para un espacio de almacenamiento consumido mínimo, soporte para procesos transaccionales seguros e inserciones y actualizaciones rápidas de datos. Esto suele ser ideal (si no sabe por qué, lea sobre la normalización de la base de datos).

Una forma mucho más eficiente de hacer que este BI esté disponible para un análisis histórico rápido de grandes calidades de datos es preprocesar los datos en un esquema en estrella desnormalizado y posiblemente en un cubo de análisis (es decir, un almacén de datos). Muchas palabras grandes y esponjosas, en realidad un concepto realmente simple.

La idea es reestructurar los datos para centrarse en una medida clave (en este caso, la tasa de atascos) y las dimensiones con las que estamos interesados ​​en comparar la medida (en este caso, el tipo de documento). Podemos calcular previamente las tasas de atascos como atascos en comparación con el número de documentos para cada tipo de documento y cargarlos en un esquema que consta de una tabla de medidas rodeada de tablas de dimensiones (de ahí & # 8216star esquema & # 8217):

Ahora, puedo obtener la tasa de atascos para documentos con características particulares con una consulta simple y rápida:

Si necesita trabajar con más dimensiones, puede facilitar aún más la consulta de su esquema en estrella construyendo un cubo OLAP (o análisis). Un cubo expone una forma más natural de obtener medidas cortadas y segmentadas por múltiples dimensiones desde el esquema en estrella a través del lenguaje de consulta MDX (Multi-Dimensional eXpression). Por ejemplo, para ver las tasas de atascos en función del tamaño, tipo, medio, operador y año:

El proceso de carga desde el esquema relacional de origen al esquema en estrella a menudo se denomina ETL (extraer, transformar y cargar) y se puede realizar cada noche, cada hora o incluso en tiempo real sobre la marcha (lo que plantea problemas únicos) dependiendo de qué tan avanzado sea. -hasta la fecha necesita sus datos.

Ahora, BI es un gran negocio, con algunas herramientas de BI de gran alcance promocionadas como lo único que resolverá sus necesidades de BI & # 8211 Microsoft lo tiene & # 8217s SSIS y SSAS, Oracle también es un actor importante. Hay muchos otros, incluido el nuevo chico en ascenso en el bloque QlikView. Dependiendo del tamaño de la empresa, algunos scripts SQL bien diseñados pueden ser suficientes para su proceso ETL, o puede considerar algo como Rhino ETL como una herramienta ETL de código abierto. Un cubo de análisis es útil, pero las imágenes y los gráficos bien diseñados pueden funcionar muy bien con solo un esquema en estrella para su interfaz. Quizás Excel es lo que realmente necesita y la mayoría de los usuarios de oficina que no son expertos en tecnología ya saben cómo usar Excel.

Moraleja de la historia: comprenda lo que significa BI y qué tan fácil puede ser hacerlo antes de exagerar con las soluciones. A veces, es posible que necesite gastar un presupuesto de 5 dígitos en un sistema monolítico para una gran organización con necesidades de datos complejas, pero a veces no lo hace.


Ver el vídeo: Διαδικτυακός προγραμματισμός με σε C# - Μέρος 4