He importado un archivo CSV que contiene la información espacial en el área varchar, luego se convierten los valores varchar (max) a varbinary (max) mediante la adición de 0x a varchar (max) los valores antes de la conversión. Para entonces, aparte de la 0x al principio, los datos varbinary (max) columna se ve exactamente el mismo que el varchar (max) uno de cada convierte en texto. Ahora funciono con la siguiente secuencia de comandos: donde WKB es la columna varbinary (max). Ejecutar el script anterior arroja este error: La entrada binaria convencional (WKB) no es válida La fuente de los datos es de Open Street Map así que no hay duda de que son correctos los datos del área. Así que supongo que debe haber algo mal en lo que estoy haciendo o me falta algún momento de convertir a la geometría WKB tipo de datos. Podría alguien ayudar por favor Supongo que el problema es cuando la conversión de los datos varchar a varbinary que está convirtiendo la representación de caracteres real de los datos binarios, en lugar de cambiar el tipo de binario. Por ejemplo, si tiene los datos 0xLOQUESEA en su columna varchar, a continuación, haciendo convert (varbinary (max), DEADBEEF) convertirá las representaciones de caracteres ASCII a binario. Lo que se quiere hacer en su lugar es convertir la cadena hexadecimal en binario, lo cual es posible mediante el parámetro estilo de conversión. convertido SELECT (varbinary (max), DEADBEEF, 2) debe hacer lo que quiera convertir sus datos varchar WKB al compañero de trabajo reales binary. My dio cuenta de la Línea de la ESRI WKB es incorrecto contiene datos no especificados se arrastran, y puesto que el no activa el SIG. SE, he publicado sus comentarios como una respuesta. Enfermo espere unos días para las críticas antes de aceptarla en caso de que alguien haya una reacción más definitiva. Mientras tanto, puedo recrear la excepción entre ESRI geometría línea WKB y SqlServer. Types haciendo una nueva clase de entidad de marca, lo que supone una sola geometría de la línea, y el bingo --- su repetible. Cada vez. Pero busqué en Google esto todo el día de ayer y no encontrar ninguna confirmación de esto. Debo ser un mal empleado de Google Cuando intento convertir un esriPolylineGeometry a IWkb, y luego ir a través de los movimientos de exportación a wkbBytes y consumirlo en SqlServer. Types. SqlGeometry. STGeomFromWKB () la conversión siempre se produce el error binaria convencional (WKB ) de entrada no es válida. Sin embargo, si uso el mismo método para obtener wkbBytes, funciona bien cuando lo envío a través de convertidores SharpMap. He hecho todo lo que puedo imaginar para descartar una geometrías pobres, y estoy pensando seguramente alguien se ha topado con esto antes. Por el lado de ESRI, He intentado utilizar para llevar a cabo ITopologyOperator. Simplify () y. Buffer (0). y tampoco lo hace la diferencia. También he intentado añadir. MakeValid () detrás STGeomFromWKB () para ningún uso. Y tampoco hay diferencia con respecto a cualquiera de IWkb. ExportToWkb () o la IGeometryFactory. CreateWkbVariantFromGeometry alternativa (). Así que mi pregunta es: ¿Es la WKB realmente no válido Si es así, entonces ¿por qué está convirtiendo adecuadamente en SharpMap El WKB que sale de ESRI es así: A continuación, el primer bloque de código se muestra el enfoque en su defecto cuando intento para consumir utilizando SqlGeometrys método estático STGeomFromWKB (). El segundo bloque muestra el enfoque SharpMap, que funciona cuando se consumen los mismos datos wkbBytes. Este enfoque utilizando SqlServer. Types falla .. Pero este enfoque utilizando convertidores SharpMap funciona. Ambos enfoques aceptan geometrías de polígono, pero estoy esperando que alguien sabe cómo conseguir el enfoque SqlServer. Types para trabajar en geometrías de línea, ya que tenemos otros proyectos que ya están utilizando esa biblioteca. Me planteo duda en utilizar convertidores SharpMap si esa es la respuesta, pero me molesta que una condición desconocida está causando SqlServer. Types fallen en el contexto de las geometrías de línea. / Pedido Jul 12 12 de la 22:09 Sin ofender, pero, en realidad, las conclusiones de su compañero de trabajo acerca de cómo algo que cree que debería hacer no funciona de la manera oficial que debería funcionar. Por eso, nos referimos a las especificaciones del OGC. Si se hace referencia a las páginas 66-70 se encuentra la especificación para el documento más antiguo, o las páginas 65 a 72 para la nueva especificación. En resumen si fuera poco, no hay ninguna parte que prohíbe el wkb de tener los datos finales. De hecho, la especificación incluye contadores para cada elemento, para saber exactamente cuánto del blob binario que debería estar análisis. Baja hasta incluso incluyendo un byte de orden de bytes para que pueda cambiar entre el orden de bits de la representación binaria de cada elemento de la geometría interna a medida que analizarlo Mi punto es que siempre sabe exactamente cuánto de lo que debe ser la lectura y cómo debe ser interpretarlo. Microsoft ha elegido, en su programa de análisis, para continuar consumiendo el contenido binario a pesar de que no hay nada en la especificación OGC dice que debería. A continuación, se optó por considerar que la condición no válida. Son mal Bueno, así es como lo interpretaron a pesar de la misma nota binaria sí satisface la especificación. Diciendo que el WKB proporcionado por ESRI no es válida, para este caso en particular, es incorrecta. Por cierto, cada una de las demás analizador WKB por ahí (GEOS, PostGIS, GDALs, ESRIs, SharpMaps, Autodesks, etc) acepta esta condición como OK. Aquí está su ejemplo usando PostGIS: Ahora voy a agregar cualquier dato binario al azar al final de su geometría: El error está en realidad en el analizador de Microsoft. En el espíritu de buen debate, sin embargo, tienes que admitir esas son 039s bastante inútil al final de esa corriente ESRI WKB. Si utilizo el mismo enfoque para convertir la geometría poligonal ESRI, devuelve una corriente limpia (al menos, en los ojos del analizador MS). Pero estoy totalmente de acuerdo en que es válida en los momentos importantes. En un intento por alcanzar la mejor paz, considero que ESRI tiene una corriente sucia, pero MS tiene un analizador tiránico. It39s siempre interesante cuando dos delanteros de poder se unen en el centro del hielo. je ndash elrobis Jul 14 de las 12 de la 22:39 Tienes razón acerca de esos bytes siendo bastante inútil. No sabe dónde están viniendo (algún detalle de implementación interna probablemente). Si quieres ser quisquilloso, yo en realidad decir que cada byte único utilizado para describir el orden de bits en cada elemento de geometría simple es bastante tonto, también. Puedo ver cómo un blob binario puede venir de diferentes sistemas y, por tanto serializar diferente. pero creo que la adición a cada elemento es de residuos. Puedo ver cómo se tendría una al principio sin embargo. Yo entiendo por qué está allí, pero eso sería un tema para una discusión completamente diferente. ndash Ragi Yaser Burhum Jul 14 de las 12 de la 23:59 Básicamente mi compañero de trabajo respondió a mis preguntas principales, así que estoy a la perforación de aquí en aras de responder a la rosca. Esperemos que algunas personas van a votar a-ella, dándole algo de credibilidad añadido. P1: ¿Es la geometría línea ESRI como WKB realmente no válida Sí. El wkb dice que hay 9 puntos en la línea, y luego el analizador debe decir 9 puntos. MS (con razón) detecta más datos (siendo el 10 0s) y le dice a su mal estado. Los 10 son 0s 5 bytes de la matriz original. Eliminar los últimos 10 0s, y su buena, al igual .. P2: Si el WKB es realmente válido, ¿por qué es la biblioteca SharpMap capaz de convertirlo estoy seguro de por qué sharplib 100 no falla: el formato dicta que hay 9 puntos. si no eres delicado, que acaba de dejar de leer y todo parece excelente. Y. ¿por qué en realidad validar que no existen más bytes. Así que estoy bastante seguro de que SharpLib no maneja de manera específica. simplemente dejan de leer después de los 9 puntos, y todo parece funcionar. Gracias a la EM no sólo para dejar Bits Bytes amp dando vueltas. En cuanto a por qué el WKB ESRI está mal formado que me dieron unas cuantas conjeturas: Se asignan x cantidad de bytes a la vez, y no son precisos sobre el cierre de la matriz de bytes. O. ellos. al contar el número de bytes, toman la longitud del cuerpo y añade la longitud de la cabecera también (1 byte encodinginfo, 1 byte de tipo geom, 8 bytes de número de puntos de la línea), y de alguna manera al contar el cuerpo, que incluye la longitud de la cabecera. causando tamaño doble cabecera. De todos modos, eso es sólo especulaciones y no estoy seguro de lo que la información es buena para que no podemos hacer nada al respecto de todos modos :-) contestado 13 de Jul 12 el 15: 51When se especifica un archivo de formas como fuente de datos espaciales y que se encuentra en su equipo local, los datos espaciales se incorpora automáticamente en el informe. Para utilizar los datos espaciales desde un archivo ESRI dinámicamente, debe hacer lo siguiente: Sube tanto el archivo. shp y el archivo. dbf en la misma carpeta en un servidor de informes, y luego enlazar con el archivo. shp como el origen de datos espaciales. Para obtener más información sobre el tema, consulte el siguiente artículo, Mapas (Generador de informes 3.0): msdn. microsoft/en-us/library/ee240845(SQL.105).aspx Si usted tiene alguna pregunta, por favor no dude en Házmelo saber. Marcado como respuesta por Eileen Zhao domingo por, 17 de de julio de, 2011 4:38 PM de lunes, 11 de julio de, 2011 7:20 Todas las respuestas cuando se especifica un archivo de formas como fuente de datos espaciales y que se encuentra en el equipo local, lo espacial los datos se insertan automáticamente en el informe. Para utilizar los datos espaciales desde un archivo ESRI dinámicamente, debe hacer lo siguiente: Sube tanto el archivo. shp y el archivo. dbf en la misma carpeta en un servidor de informes, y luego enlazar con el archivo. shp como el origen de datos espaciales. Para obtener más información sobre el tema, consulte el siguiente artículo, Mapas (Generador de informes 3.0): msdn. microsoft/en-us/library/ee240845(SQL.105).aspx Si usted tiene alguna pregunta, por favor no dude en Házmelo saber. Marcado como respuesta por Eileen Zhao Domingo, 17 de julio 2011 4:38 pm del lunes, 11 de julio de, 2011 7:20 He experimentado este error, incluso cuando los datos locales se incrusta en el informe. La causa potencial citada no puede ser el único. Domingo, 08 de enero 2012 18:18 Algunos archivos SHP grandes han causado este error cuando el control del mapa se ajusta para que ocupen menos espacio. Curiosamente, el problema puede desaparecer si se elige un título ligeramente diferente del ahorro de espacio. Al parecer, al igual que el algoritmo utilizado para comprimir los datos de los mapas pueden producir datos binarios válidos en algunos entornos, pero producir datos correctos con ajustes ligeramente diferentes. Propuesto como respuesta de Stefan Granath Domingo, 06 de diciembre 2015 04:19 Por la mañana Jueves, 12 de enero de, 2012 15:47 Microsoft está realizando una encuesta en línea para comprender su opinión del sitio web de MSDN. Si decide participar, la encuesta en línea será presentado a usted cuando salga del sitio web de MSDN. ¿Le gustaría participar 2016 Microsoft. Todos los derechos reserved. Jonathan Bailey, SpatialBridge en Mon, 20 Aug 2012 20:02:45 Tratando de ejecutar la siguiente consulta: Da por resultado el siguiente error: La definición para P1 fue tomada directamente de la columna de la forma de la otra tabla (América) en el base de datos. Además, esta es la misma definición que eso es WKB utilizados por una aplicación cliente (ArcMap) para ejecutar esta consulta con éxito. ¿Puede alguien decirme lo que podría ser mal aquí Respuestas Bob Beauchemin el Lun 20 Agos 2012 23:44:03 No estoy seguro si esto va a solucionar completamente el problema, pero estoy mirando su sentencia La definición para P1 fue tomada directamente de la Forma la columna de otra tabla (estados) en la base de datos. Si se refiere a que copie / ha pegado, cuenta el formato binario servidores SQL Server interno no es lo mismo que WKB. SQL Server utiliza un formato binario de propietario internamente el formato propietario es el youd formato de conseguir si ha emitido la consulta: SELECT forma con alguna_tabla Para obtener binario conocido, es necesario ejecutar: Ver otros importadores de datos SHP diferentes últimas postsIm en espacial de SQL Server base de datos. Para esto tengo una consulta de inserción con params y el código como: Todo funciona bien, aunque un datos de la forma (WKB) es válida. Si no, entonces me sale formato de excepción al constructor y no puedo crear el objeto SqlGeometry. También no puede construir una geometría a través de la adición de una geometría SqlGeometryBuilder manualmente. Mi pregunta es cómo crear una geometría (tienda en la base de datos) que no es válido y dejar que el servidor espacial (o CLR) para ajustarla a través MakeValid (). Me gustaría hacer algo como: ¿Es posible en el sitio del cliente (en la solicitud de importación CLR) Viernes 11 de diciembre de, 2009 6:21 PM Respuestas En términos generales, me parece que SQL Server puede aceptar y corregir geometrías quotinvalidquot si se pueden hacer válida cambiando el tipo de geometría o haciendo malabarismos con los puntos alrededor pero todavía contiene exactamente los mismos puntos que se define en la instancia original. Se trata de una geometría no válida, pero será aceptada, ya que puede hacerse válido mediante la representación de estos puntos como una multilínea en lugar MULTILINESTRING: ((10 10, 10 0), (0 0, 0 10, 10 -5)) o, en su otro ejemplo: Esto también es una geometría no válida porque el anillo interior toca el aro exterior, pero se puede hacer válida la siguiente manera: GEOMETRYCOLLECTION (polígono ((5 0, 10 0, 10 10, 0 10, 0 5, 5 5, 5 0)), LINESTRING (0 5, 0 0, 5 0)) En el caso de una cadena lineal que contiene solamente un punto, sin embargo, no hay manera de hacer que la geometría válida sin más información (es decir, ¿de dónde viene el segmento de línea vaya a ) - en Ivors terminología del grado relativo de invalidez, es quotinvaliderquot que los ejemplos dados aquí) Empezando espacial con SQL Server www. apress / libro / view / 1430218290 Marcado como respuesta por Alex Feng (SQL) Moderador Martes, 22 de diciembre de 2009 05:29 Por la mañana Viernes, 11 de diciembre de, 2009 21:19 tengo su libro (a partir espacial con SQL Server) y esta información debería estar allí. Gracias por los comentarios. Estoy pensando en escribir un libro quotProquot espacial, en cuyo caso estoy ciertamente la intención de cubrir algunos de los posibles errores encontrados en el trato con los malos datos espaciales, y proporcionar más información sobre los métodos para solucionarlos. Mientras tanto, adjunto una lista de todas las posibles condiciones de error para los tipos de datos de la geometría / geografía en la parte inferior de este post. En cuanto a la forma en quotcorrectquot tratar con datos no válidos. eso es realmente depende de ti. Al igual que con cualquier otro tipo de datos erróneos, no hay forma automática para corregir los errores espaciales sin alguna forma de masaje, lo que podría alterar los valores de las coordenadas poco, cambiar el tipo de geometría, o insertar / borrar puntos (como el ejemplo que usted dio por encima de cómo podría solucionar Shape2Sql cadenas de líneas). ¿Ha pensado en qué se está encontrando tantos datos malos en el primer lugar: - ¿Es esta información que usted ha comprado a un proveedor (en cuyo caso, es posible que desee considerar un nuevo proveedor de datos de mejor calidad) - Estos son los datos que has recogido a ti mismo (es posible que necesite para revisar sus propios mecanismos de recaudación) El identificador de referencia espacial (SRID) no es válido. SRID debe estar entre 0 y 999999. El parámetro de distancia () para STBuffer no es válido. Las distancias no pueden ser infinito o no un número (NaN). El índice de punto de n () pasa a STPointN es inferior a 1. Este número debe ser mayor que o igual a 1 y menor o igual al número de puntos devueltos por STNumPoints. El índice de geometría n () pasa a STGeometryN es menor que 1. El número debe ser mayor que o igual a 1 y debe ser menor o igual que el número de instancias devueltos por STNumGeometries. El índice de anillo n () pasa a STInteriorRingN es menor que 1. El número debe ser mayor que o igual a 1 y debe ser menor o igual que el número de anillos devueltos por STNumInteriorRing. El argumento GeometryType a InstanceOf () no es válido. Este argumento debe contener uno de los siguientes tipos: Geometría, punto, cadena lineal, Curva, Polígono, de superficie, multipunto, MultiLineString, MultiPolygon, MultiCurva, MultiSurface o GeometryCollection. Por desgracia, no funciona. Me sale: Una primera excepción del tipo System. FormatException ocurrió en Microsoft. SqlServer. Types. dll Información adicional: 24117: La entrada de cadena de línea no es válido porque no tiene suficientes puntos distintos. Una cadena de línea debe tener al menos dos puntos distintos. El error depende de la geometría de error pero todos son una especie de FormatException. De esta manera Im incapaz de crear una geometría no válida y que sea válida. Más ideas viernes 11 de diciembre, 2009 19:40 veo. El constructor de SqlGeometry fue diseñado para aceptar geometrías no válidos, sino a un cierto grado de quotinvalidnessquot, si hay una tal palabra. En este caso se está tratando de crear una línea, pero sólo tiene un punto. Le sugiero que use try-catch, detecta esta excepción y crear una geometría alternativa, tal vez un punto. Propuesto como respuesta por Ivor Sargoytchev viernes por, 11 de diciembre de, 2009 8:27 PM Viernes, 11 de diciembre de, 2009 20:26 En términos generales, me parece que SQL Server puede aceptar y corregir geometrías quotinvalidquot si se pueden hacer válida cambiando la geometría escribir o hacer malabarismos con los puntos alrededor pero todavía contiene exactamente los mismos puntos que se define en la instancia original. Se trata de una geometría no válida, pero será aceptada, ya que puede hacerse válido mediante la representación de estos puntos como una multilínea en lugar MULTILINESTRING: ((10 10, 10 0), (0 0, 0 10, 10 -5)) o, en su otro ejemplo: Esto también es una geometría no válida porque el anillo interior toca el aro exterior, pero se puede hacer válida la siguiente manera: GEOMETRYCOLLECTION (polígono ((5 0, 10 0, 10 10, 0 10, 0 5, 5 5, 5 0)), LINESTRING (0 5, 0 0, 5 0)) En el caso de una cadena lineal que contiene solamente un punto, sin embargo, no hay manera de hacer que la geometría válida sin más información (es decir, ¿de dónde viene el segmento de línea vaya a ) - en Ivors terminología del grado relativo de invalidez, es quotinvaliderquot que los ejemplos dados aquí) Empezando espacial con SQL Server www. apress / libro / view / 1430218290 Marcado como respuesta por Alex Feng (SQL) Moderador Martes, 22 de diciembre de 2009 05:29 Por la mañana Viernes, 11 de diciembre de, 2009 21:19 Gracias. Que borra la mayoría de mis dudas. Tengo su libro (A partir espacial con SQL Server) y esta información debería estar allí. También sería bueno tener una lista de errores y posibles casos de tipos de geometrías no válidas que son aceptados por un constructor geometría, por lo que un usuario puede coger otras excepciones y cuidar de estos casos. Probé herramienta Shape2Sql con mis datos no válidos y cuando yo estaba de acuerdo para fijar geometría no válida encontrado, en caso de no tener suficientes puntos distintos, el importador añadido un segundo punto muy cerca de la primera. Si yo no estoy de acuerdo reparar el fallo entonces no se ha insertado de esas características. Es este un enfoque válido para el problema de tratar con geometría no válida Im pregunto porque si un usuario permite insertar la geometría no válida o vacía, entonces las consultas espaciales tendrán problemas con él. Por ejemplo las consultas a los datos de la ventana espaciales con STIntersects () devolverá errores que algunas geometrías no son válidos. Luego, utilizando filtro () ayuda, pero lo que otros casos creo que el importador debe hacer todo lo que los datos guardados son válidos (pero no distorsionadas). A continuación, un índice espacial y métodos espaciales pueden ser utilizados correctamente. Sábado por la, 12 de diciembre de 2009 11:59 Tengo su libro (A partir espacial con SQL Server) y esta información debería estar allí. Gracias por los comentarios. Estoy pensando en escribir un libro quotProquot espacial, en cuyo caso estoy ciertamente la intención de cubrir algunos de los posibles errores encontrados en el trato con los malos datos espaciales, y proporcionar más información sobre los métodos para solucionarlos. Mientras tanto, adjunto una lista de todas las posibles condiciones de error para los tipos de datos de la geometría / geografía en la parte inferior de este post. En cuanto a la forma en quotcorrectquot tratar con datos no válidos. eso es realmente depende de ti. Al igual que con cualquier otro tipo de datos erróneos, no hay forma automática para corregir los errores espaciales sin alguna forma de masaje, lo que podría alterar los valores de las coordenadas poco, cambiar el tipo de geometría, o insertar / borrar puntos (como el ejemplo que usted dio por encima de cómo podría solucionar Shape2Sql cadenas de líneas). ¿Ha pensado en qué se está encontrando tantos datos malos en el primer lugar: - ¿Es esta información que usted ha comprado a un proveedor (en cuyo caso, es posible que desee considerar un nuevo proveedor de datos de mejor calidad) - Estos son los datos que has recogido a ti mismo (es posible que necesite para revisar sus propios mecanismos de recaudación) El identificador de referencia espacial (SRID) no es válido. SRID debe estar entre 0 y 999999. El parámetro de distancia () para STBuffer no es válido. Las distancias no pueden ser infinito o no un número (NaN). El índice de punto de n () pasa a STPointN es inferior a 1. Este número debe ser mayor que o igual a 1 y menor o igual al número de puntos devueltos por STNumPoints. El índice de geometría n () pasa a STGeometryN es menor que 1. El número debe ser mayor que o igual a 1 y debe ser menor o igual que el número de instancias devueltos por STNumGeometries. El índice de anillo n () pasa a STInteriorRingN es menor que 1. El número debe ser mayor que o igual a 1 y debe ser menor o igual que el número de anillos devueltos por STNumInteriorRing. El argumento GeometryType a InstanceOf () no es válido. Este argumento debe contener uno de los siguientes tipos: Geometría, punto, cadena lineal, Curva, Polígono, de superficie, multipunto, MultiLineString, MultiPolygon, MultiCurva, MultiSurface o GeometryCollection.
No comments:
Post a Comment