Чтение шейп-файла с ColdFusion - PullRequest
1 голос
/ 16 сентября 2010

Я пытаюсь прочитать двоичный файл и проанализировать байты. У меня есть спецификация для Shapefiles, чтобы узнать, как анализировать файл, однако я не могу найти правильные функции в ColdFusion для обработки читаемых байтов и принятия решения о том, что делать.делать с ними.

<cffile action="READBINARY"
   file="mypath/www/_Dev/tl_2009_25_place.shp"   
   variable="infile" >

PDF-файл со спецификацией: http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf

Например, у меня есть спецификация:

Положение Поле Значение Тип Порядок
Байт 0 Код файла 9994 Целое число большое
Байт 4 Не используется 0 Целое число большое
Байт 8 Не используется 0 Целое число большое
Байт 12 Не используется 0 Целое число большое
Байт 16 Не используется 0 Целое число большое
Байт 20 Не используется 0Целое число Большое
Байт 24 Длина файла Длина файла Целое число Большое
Байт 28 Версия 1000 Целое число Маленькое
Байт 32 Тип формы Тип формы Целое число Маленькое
Байт 36 Ограничивающая рамка Xmin Двойная маленькая
Байт 44 Ограничивающая рамкаYmin Double Little
Байт 52 Ограничительная коробка Xmax Double Little
Байт 60 Ограничительная коробка Ymax Double Little
Байт 68 * Ограничительная коробка Zmin Double Маленькая
Байт 76 * Ограничительная коробка Zmax Double Little
Байт 84* Ограничивающий прямоугольник Mmin Double Little
Байт 92 * Ограничивающий прямоугольник Mmax Double Little

Если бы это был простой текстовый файл, я бы использовал функцию mid для считывания своих позиций.Можно ли это сделать в ColdFusion и с помощью каких функций можно достичь моей цели?

Я нашел эту функцию внутри FarStream.as, который находится по адресу http://code.google.com/p/vanrijkom-flashlibs/wiki/SHP, который является файлом Actionscript3, но он представляет собой тип задачи, которую мне нужно выполнить.

private function readHeader(e: ProgressEvent): void {
    // check header:
    if  (!  (   readByte()==0x46
            &&  readByte()==0x41
            &&  readByte()==0x52
            ))  
    {
        dispatchEvent(new IOErrorEvent
            ( IOErrorEvent.IO_ERROR
            , false,false
            , "File is not FAR formatted")
        );
        close();
        return;
    }
    // version:
    vMajor = readByte();
    vMinor = readByte();
    if (vMajor>VMAJOR) {
        dispatchEvent(new IOErrorEvent
            ( IOErrorEvent.IO_ERROR
            , false,false
            , "Unsupported archive version  (v."+vMajor+"."+vMinor+")")                 
        );
        close();
        return;
    }                   
    // table size:
    tableSize = readUnsignedInt();      
    // done processing header:          
    gotHeader= true;
}

И вот окончательное решение

<cfset shapeFile = createObject("java","com.bbn.openmap.layer.shape.ShapeFile").init('/www/_Dev/tl_2009_25_place.shp')>
<cfdump var="#shapeFile.getFileLength()#"> 

1 Ответ

4 голосов
/ 16 сентября 2010
<cffile action="READBINARY" file="mypath/www/_Dev/tl_2009_25_place.shp" variable="infile" >
<cfset shapeFile = createObject("java","com.bbn.openmap.layer.shape.ShapeFile").init(infile)>
<cfdump var="#shapeFile#">

Может быть, как-то так?

...