Eu tenho importado um arquivo csv contendo informações de área espacial em varchar, em seguida, convertidos valores varchar (max) para varbinary (max), adicionando 0x aos valores varchar (max) antes da conversão. Até então, além do 0x no início, os dados na coluna varbinary (max) são exatamente iguais ao varchar (max) um em convertido para texto. Agora eu executo o seguinte script: onde WKB é a coluna varbinary (max). Executando o script acima lança este erro: A entrada binária bem conhecida (WKB) não é válida A fonte de dados é de Open Street Map, sem dúvida, eles são dados de área correta. Então eu suponho que deve haver algo errado no que estou fazendo ou estou faltando algum ponto para converter WKB para o tipo de dados de geometria. Alguém poderia ajudar por favor Suponho que o problema é quando a conversão de dados varchar para varbinary você está convertendo a representação de caracteres reais dos dados binários, em vez de apenas mudar o tipo de binário. Por exemplo, se você tem os dados 0xDEADBEEF em sua coluna varchar, então convert (varbinary (max), DEADBEEF) converterá as representações de caracteres ascii em binário. O que você quer fazer em vez disso é converter a seqüência hexadecimal em binário, o que é possível usando o parâmetro de estilo de converter. SELECT convert (varbinary (max), DEADBEEF, 2) deve fazer o que você deseja converter seus dados varchar wkb em binário real. Meu colega de trabalho percebeu que a ESRI Line WKB está malformada contém dados de fuga não especificados e, uma vez que não está ativo no GIS. SE, coloquei suas observações como resposta. Espero alguns dias para críticas antes de aceitá-lo caso alguém tenha uma reação mais definitiva. Enquanto isso, eu posso recriar a exceção entre ESRI Geometria de Linha WKB e SqlServer. Types, fazendo uma nova classe de recurso, dando-lhe uma geometria de linha única, e bingo --- é repetível. Toda vez. Mas eu gritei isso durante todo o dia ontem e não encontrei nenhuma confirmação disso. Eu devo ser um Googler ruim Quando eu tento converter uma geometria esriPolyline para IWkb, então vá pelos movimentos de exportar para wkbBytes e consumindo-o em SqlServer. Types. SqlGeometry. STGeomFromWKB () a conversão sempre falha com o erro bem conhecido binário (WKB ) Não é válida. No entanto, se eu usar a mesma abordagem para obter wkbBytes, isso funciona bem quando eu enviá-lo através de conversores SharpMap. Fiz tudo o que posso imaginar para descartar geometrias pobres, e penso que certamente alguém já encontrou isso antes. No lado ESRI, tentei usar o ITopologyOperator para executar. Simplify () e. Buffer (0). E nem faz a diferença. Eu também tentei adicionar. MakeValid () por trás de STGeomFromWKB () para não usar. E também não há diferença entre IWkb. ExportToWkb () ou o IGeometryFactory. CreateWkbVariantFromGeometry () alternativo. Então, minha pergunta é: o WKB é realmente inválido. Se assim for, então, por que ele está se convertendo corretamente no SharpMap. O WKB que sai do ESRI parece assim: Abaixo, o primeiro bloco de código mostra a abordagem falha quando eu tento consumir usando o método estático SqlGeometrys STGeomFromWKB (). O segundo bloco mostra a abordagem SharpMap, que funciona ao consumir os mesmos dados wkbBytes. Esta abordagem usando SqlServer. Types falha .. Mas essa abordagem usando conversores SharpMap funciona. Ambas as abordagens aceitam geometrias Polygon, mas Im esperando alguém sabe como obter a abordagem SqlServer. Types para trabalhar em geometrias Line, como temos outros projetos já usando essa biblioteca. Eu não vou hesitar em usar conversores SharpMap se essa é a resposta, mas me incomoda que uma condição desconhecida está causando SqlServer. Types para falhar no contexto de geometrias de linha. Perguntou Jul 12 12 at 22:09 Sem ofensa, mas, na verdade, as conclusões do seu colega de trabalho sobre como algo que ele acha que deve funcionar não faz com que seja a maneira oficial que deve funcionar. Para isso, nos referimos às especificações do OGC. Se você se refere às páginas 66-70, você encontrará a especificação para o documento antigo ou as páginas 65-72 para a especificação mais recente. Para resumir, não há nenhuma parte que proíbe o wkb de ter dados à direita. Na verdade, a especificação inclui contadores para cada elemento para que você saiba exatamente quanto do blob binário você deve analisar. Ele vai até mesmo incluindo um byte para ordenação de bytes para que você possa alternar entre endianness da representação binária de cada elemento de geometria interna como você analisá-lo Meu ponto é que você sempre sabe exatamente o quanto você deve estar lendo e como você deve ser Interpretando-o. A Microsoft escolheu, em seu analisador, continuar a consumir o conteúdo binário, mesmo que nada na especificação OGC diga que deveria. Então eles escolheram considerar essa condição inválida. Eles estão errados Bem, é assim que eles o interpretaram, mesmo que a própria gota binária satisfaça as especificações. Dizer que o WKB fornecido pela ESRI é inválido, para este caso específico, está incorreto. By the way, todos os outros analisadores WKB lá fora (GEOS, PostGIS, GDALs, ESRIs, SharpMaps, Autodesks, etc) aceita esta condição como OK. Aqui está o seu exemplo usando o PostGIS: agora vou adicionar quaisquer dados binários aleatórios no final da sua geometria: o bug está realmente no analisador da Microsoft. No espírito do bom debate, entretanto, você deve admitir que são muito inúteis no final desse fluxo ESRI WKB. Se eu usar a mesma abordagem para converter geometria de polígono ESRI, ele retorna um fluxo limpo (pelo menos, nos olhos do analisador de MS). Mas eu concordo plenamente que é válido onde ele conta. Na tentativa de alcançar a melhor paz, eu afirmo que ESRI tem um fluxo sujo, mas o MS tem um analisador tirânico. Isso sempre é interessante quando dois avanços avançam juntos no centro do gelo. Heh ndash elrobis 14 de julho 12 às 22:39 Você está certo sobre esses bytes serem bastante inúteis. Não tem certeza de onde eles estão vindo (alguns detalhes internos de implementação provavelmente). Se você quiser nitpick, eu realmente diria que cada único byte usado para descrever o endianness em cada elemento de geometria é bastante burro, também. Eu posso ver como um blob binário pode vir de diferentes sistemas e assim serializar de forma diferente. Mas acho que adicioná-lo a cada elemento é o desperdício. Posso ver como você teria um no início, no entanto. Eu entendo por que está lá, mas esse seria um tópico para uma discussão diferente. Ndash Ragi Yaser Burhum Jul 14 12 at 23:59 Basicamente o meu colega de trabalho respondeu às minhas principais perguntas, por isso Im perfurando-los aqui por uma questão de responder a discussão. Felizmente, algumas pessoas vão votar, dando-lhe uma credibilidade adicional. Q1: o ESRI Line Geometry como WKB realmente inválido sim. O wkb diz que há 9 pontos na linha e, em seguida, o analisador deve ler 9 pontos. MS (com razão) detecta mais dados (sendo os 10 0s) e diz a sua confuso. Os 10 0s são 5 bytes na matriz original. Remova os últimos 10 0s, e é bom, como ... Q2: Se o WKB é realmente inválido, por que a biblioteca SharpMap é capaz de convertê-lo. Tenho 100 certeza de por que o sharplib não falha: o formato dita que existem 9 pontos. Se você não é exigente, você simplesmente pára de ler e tudo parece simbólico. E. Por que você realmente validaria que não há mais bytes. Portanto, tenho certeza de que SharpLib não lida com isso especificamente. Eles simplesmente parar de ler após os 9 pontos, e tudo parece funcionar. Graças a MS para não apenas deixar Bits amp Bytes pendurado ao redor. Quanto a POR QUE o ESRI WKB está mal formado, recebi algumas suposições: alocam x quantidade de bytes de cada vez e não são precisos sobre o fechamento da matriz de bytes. OU. eles. Ao contar o número de bytes, eles tomam o comprimento do corpo e adiciona o comprimento do cabeçalho também (1 byte encodinginfo, 1 byte geom tipo, 8 bytes de número de pontos na linha), e de alguma forma ao contar o corpo, eles incluem o comprimento Do cabeçalho. Causando tamanho de cabeçalho duplo. De qualquer forma, isso é apenas especulações e não tenho certeza que a informação é boa, pois não podemos fazer nada sobre isso de qualquer maneira :-) respondeu 13 de julho às 15: 51Quando você especifica um arquivo de forma como uma fonte de dados espaciais e está localizado no seu Computador local, os dados espaciais são incorporados automaticamente no relatório. Para usar dados espaciais de um arquivo ESRI dinamicamente, você deve fazer o seguinte: Carregar o arquivo. shp eo arquivo. dbf para a mesma pasta em um servidor de relatório e, em seguida, vincular ao arquivo. shp como a fonte de dados espaciais. Para obter mais informações sobre o tópico, consulte o seguinte artigo, Mapas (Report Builder 3.0 e SSRS): msdn. microsoften-uslibraryee240845 (SQL.105).aspx Se você tiver alguma dúvida, sinta-se à vontade para me informar. Marcado como resposta por Eileen Zhao Todas as respostas Quando você especifica um arquivo de forma como uma fonte de dados espaciais e está localizado no seu computador local, o espaço Os dados são incorporados automaticamente no relatório. Para usar dados espaciais de um arquivo ESRI dinamicamente, você deve fazer o seguinte: Carregar o arquivo. shp eo arquivo. dbf para a mesma pasta em um servidor de relatório e, em seguida, vincular ao arquivo. shp como a fonte de dados espaciais. Para obter mais informações sobre o tópico, consulte o seguinte artigo, Mapas (Report Builder 3.0 e SSRS): msdn. microsoften-uslibraryee240845 (SQL.105).aspx Se você tiver alguma dúvida, sinta-se à vontade para me informar. Marcado como resposta por Eileen Zhao Domingo, 17 de julho de 2011 16:38 Segunda-feira, 11 de julho de 2011 7:20 AM Eu experimentei esse erro mesmo quando os dados locais estão incorporados no relatório. A causa potencial citada não pode ser a única. Sunday, January 08, 2012 6:18 PM Alguns grandes arquivos shp causaram esse erro quando o controle do mapa foi ajustado para ocupar menos espaço. Curiosamente, o problema pode desaparecer se um grau ligeiramente diferente de economia de espaço é escolhido. Parece que o algoritmo usado para comprimir os dados do mapa pode render dados binários inválidos em algumas configurações, mas produzem dados corretos com configurações ligeiramente diferentes. Proposta como resposta por Stefan Granath Domingo, 06 de dezembro de 2015 4:19 AM quinta-feira, 12 de janeiro de 2012 15:47 A Microsoft está realizando uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada a você quando você deixar o site Msdn. Gostaria de participar 2017 Microsoft. Todos os direitos reservados. É novo em dados espaciais. Ive importado alguns arquivos ESRI em meu banco de dados usando o aplicativo OSGeo4W. Agora eu quero implantar esses mapas para alguns dos nossos servidores clientes sem usar o aplicativo OSGeo4W. Como eu só tenho 9 mapas, eu estava esperando para simplesmente inserir os dados como este. Msg 6522, nível 16, estado 1, linha 2 Um erro de estrutura ocorreu durante a execução da rotina definida pelo usuário ou agregado quotgeometryquot: System. FormatException: 24115: a entrada binária bem conhecida (WKB) não é válida. No Microsoft. SqlServer. Types. WellKnownBinaryReader. ParseWkb (tipo OpenGisType) no Microsoft. SqlServer. Types. WellKnownBinaryReader. Read (tipo OpenGisType, Int32 srid) no Microsoft. SqlServer. Types. SqlGeometry. GeometryFromBinary (tipo OpenGisType, SqlBytes binário, Int32 srid ) Nota - Eu tive que truncar os dados binários para ficar dentro do limite de postagem. Tente gerar as seqüências de caracteres de inserção usando SSMS. Eu suspeito que sua grade ou saída de texto está ficando truncada nos resultados da consulta, clique com o botão direito do mouse no banco de dados no objeto explorer em ssms selecione scripts de tarefas geradas. Selecione objetos de banco de dados específicos amp seleciona sua tabela. Clique no próximo clique avançado e certifique-se de que o tipo de dados para o script (última opção em geral) esteja configurado para os dados, apenas pressione OK, selecione salvar a saída para a janela de consulta e continue clicando até obter o seu script. Acabei de testá-lo com um polígono de 30.00043 pontos que possui um comprimento de cordão WKT de 1,2 milhão de caracteres. Editado por jakubk terça-feira, 17 de setembro de 2013 5:30 AM Marcado como resposta por clay123123123 terça-feira, 17 de setembro de 2013 10:13 AM terça-feira , 17 de setembro de 2013 5:28 AM Jakubk, que é o problema. Eu escrevi isso de acordo com sua sugestão e o arquivo script. sql gerado é 120MB. Para apenas 9 registros, preciso repensar minha estratégia de implantação ou encontrar alguns mapas de resolução mais baixa. Os mapas que estou usando são de estados australianos 43 1 outros territórios. O arquivo de forma original que eu importei foi de 30MB. Marcado como resposta por clay123123123 Terça-feira, 17 de setembro de 2013 10:12 Terça-feira, 17 de setembro de 2013 6:39 AM Todas as respostas tentam gerar as cordas de inserção usando o SSMS. Eu suspeito que sua grade ou saída de texto está ficando truncada nos resultados da consulta, clique com o botão direito do mouse no banco de dados no objeto explorer em ssms selecione scripts de tarefas geradas. Selecione objetos de banco de dados específicos Selecione sua tabela. Clique no próximo clique avançado e certifique-se de que o tipo de dados para o script (última opção em geral) esteja configurado para os dados, apenas pressione OK, selecione salvar a saída para a janela de consulta e continue clicando até obter o seu script. Acabei de testá-lo com um polígono de 30.00043 pontos que possui um comprimento de cordão WKT de 1,2 milhão de caracteres. Editado por jakubk terça-feira, 17 de setembro de 2013 5:30 AM Marcado como resposta por clay123123123 terça-feira, 17 de setembro de 2013 10:13 AM terça-feira , 17 de setembro de 2013 5:28 AM Jakubk, que é o problema. Eu escrevi isso de acordo com sua sugestão e o arquivo script. sql gerado é 120MB. Para apenas 9 registros, preciso repensar minha estratégia de implantação ou encontrar alguns mapas de resolução mais baixa. Os mapas que estou usando são de estados australianos 43 1 outros territórios. O arquivo de forma original que eu importei foi de 30 MB. Marcado como resposta Clay123123123 terça-feira, 17 de setembro de 2013 10:12 Terça-feira, 17 de setembro de 2013 6:39 AM Obrigado pela resposta Olaf - Eu peguei os dados binários copiando da grade de resultados da consulta em SSMS. Não percebi o quão enorme são as minhas colunas de geometria. Terça-feira, 17 de setembro de 2013 às 6: 42h deve comprimir ok, então sua implantação pode ser empacotada como um arquivo zip. Ou se for um tipo setup. exe implantar, então, descompacte automaticamente o. sql em um diretório temporário, execute-o e exclua o arquivo temporário. Sua outra opção seria executar. Reduce () sobre os polígonos primeiro para reduzir o número de pontos, mas não acho que reduzir a resolução vale a pena salvar alguns meg .. Terça-feira, 17 de setembro de 2013 7:21 AM Acabei Usando. Reduce () - isso precisa ser implantado como parte de nosso processo de atualização padrão que inclui um lote para executar no SSMS (a consulta de 120MB caiu SSMS algumas vezes na minha máquina). De qualquer forma, os mapas ainda têm muita resolução para os meus propósitos. Obrigado. Terça-feira, 17 de setembro de 2013 10:12 AM A Microsoft está realizando uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você deixar o site Msdn. Gostaria de participar Ajude-nos a melhorar o MSDN. Visite nossa Página UserVoice para enviar e votar em idéias Centros de desenvolvimento Recursos de aprendizagem
No comments:
Post a Comment