gmb2bmp-ohjelmalla ja MapCal II-ohjelmalla käännetyissä sinisissä merikartoissa koordinaatisto heittää! Vaihtamalla kartan koordinaatistoksi suomalaisen virhe lähes puoliutuu, mutta heittää silti pahasti. Pitääkö kartat kalibroida manuaalisesti?
uudet merikartat eivät käänny!
Ozi...
629135
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 62
Vanhimmat
Kalibroikaa karttojanne aivan himoonne saakka, olette ihan pöhköjä, käytätte teknologiaa väärin. Mutta omapa on niskanne!
Tosi typerä viesti! Jos tarkoitat, ettei tietotekniikkaa tarvita veneessä, niin olet aivan oikeassa: ilmankin pärjää.Mutta meille monelle tietotekniikka on harrastus ja hauskaa myös veneillessä. Kaverilla on harrastuksensa parissa ongelma. Turha sinun on siihen tulla maailmaa parantamaan.
Siirsin MeriCD:n uutta sinistä karttaa seacleariin ja törmäsin samaan ongelmaan, että automaattisiirrossa kalibrointi ei toiminut, se siirsi kartan KKJ-koordinaatistossa. Kartan Upper left ja lower right -kalibrointipisteet olivat väärin. Ongelma liittynee siihen, että MeriCD:n kalibrointidata on KKJ-muodossa myös uusissa sinisissä kartoissa, tästä oli mielestäni kirjoitus Vene-lehden lukijan kirjeissä taannoin. Selvitin MeriCD:n avulla mitkä ovat ko. kartan kulmakalibrointipisteet WGS-datumissa ja siirsin ne manuaalisesti seacleariin, niin sain mielestäni koordinaatit kohdilleen.
Opetus on se, että jos tekee näitä karttasiirtoja, JOKAINEN KARTTA ON ERIKSEEN TARKISTETTAVA, että kalibrointi on oikein.
Tärkeää on, että kalibrointi on oikein suhteessa GPS:n datumiin.
Koska CD-kartat käsitellään KKJ:ssä, niin anna niiden olla edellenkin KKJ:ssä. Älä siis edes yritä muuttaa niitä WGS84:ään
Lopputuloksen voit varmistaa itse karttaohjelman puolella viemällä lang/lat viivojen risteykseen. Viivat ovat just tasalukemissa, kun taas vihreillä ne eivät olleet.
Mitä ihmettä te oikein puhutte?
"Koska CD-merikartat käsitellään KKJ:ssä". Mitä hemmetin roskaa. Ei uusien sinisten CD-merikarttojen karttasisältö tiedä KKJ:stä yhtään mitään. Ne ovat EUREF (WGS84) koordinaattijärjestelmässä. Vertausellipsoidi on erilainen kuin KKJ:ssä. Jos niitä jollain ihmeen "kalibroinnilla" ryhdytään pakottamaan Hayfordin ellipsoidille, ja yhdistelemään laajoiksi yhtenäisiksi aimeistoiksi, niin varmasti alkaa reunat irvistelemään. Kun noita teidän "kalibrointijuttujanne" lueskelee, niin mieleen tulee lähinnä pikkupojat tulitikkuleikeissä bensavarastossa. Ette taatusti tiedä mitä olette tekemässä.
Käyhän se tietysti KKJ:lläkin, mutta jos on rinnalla paperikartta (jossa datum on kiinteästi WGS) ja haluan GPS:ssä pitää WGS:n datumina, en näe mitä haittaa on kalibroida kartta WGS-koordinaateilla. Pisteitähän ne vaan on ;-)
Jos kerran tiedät, mitä pitäisi tehdä, jotta virhe korjaantuisi, niin miksi et neuvo? Tollasesta irvailusta ei ole kenellekään hyötyä.
Uusia karttoja en ole kääntänyt, mutta oletan, että niiden hakemistossa on kalibrointitiedot mukana, kuten oli vanhoissakin. Jos käännöksen teki Seaclearin omalla softalla, kopioituivat kalibrointitiedotkin aivan oikein. Itselläni on asetuksissa gps-koordinaatistona WGS84 ja kartta pitää paikansa muutaman (kymmenen) metrin tarkkuudella hieman satelliittien sijainnista riippuen. Kuitenkin riittävän tarkasti väylälläajoon. Mikäli valintana on "Finnish Nautical Cards" on heitto n. 100 metriä länteen. Käännöksissä oli sikäli ongelmia, että kaikki kartat eivät kääntyneet käännettäessä kansio kerrallaan, joten puuttuneet piti kääntää yksitellen. Mitään kalibrointeja ei tarvinnut tehdä erikseen.
Itse en taas ole siirtänyt vanhoja vihreitä karttoja,vain uusia. Ja niille löytyy IN8-filet samasta hakemistosta.
Kun vaihdoin kalibrointipisteet wgs-pisteiksi, koordinaatit olivat samat sekä sc:ssä että meriCD:ssä.
Voisiko joku sekä vanhoja että uusia karttoja siirtänyt selventää, onko siirrossa eroa?
Kysymyshän lienee siitä, että tämä kyseinen irvailija ei suostu ymmärtämään, mitä termillä "kalibrointi" tässä yhteydessä tarkoitetaan. Sehän ei tarkoita mitään vääristymien poistoa tai kompensointia vaan yksinkertaisesti tunnettujen pisteiden koordinaattien kertomista karttaohjelmalle, jotta se pystyy laskemaan kartan alueen muut koordinaatit. Tästä käytiin joskus vuosi sitten perinpohjainen keskustelu, mutta joko viesti ei mennyt perille tai sitten kyseessä on toinen henkilö. Irvailijalle kehoittaisin tutustumaan näinde sinänsä mainioiden PC-karttaohjelmien käyttöön ja ennen kaikkea siihen mitä kalibroinnilla näissä ohjelmissa oikein tarkoitetaan. Valitettaasti näihin halpakarttaohjelmiin liittyy aina jonkin verran teknistä puuhastelua, mutta ei nämä asiat niin hoirveän vaikeita ole ja huolellisella työllä aineistoista saa ihan riittävän tarkkoja ja käyttökelpoisia vapaa-ajan veneilyyn.
Varsinaiseen ongelmaan en varsinaisesti pysty ratkaisua kertomaan, koska en ole noiden sinisten karttasarjojen kanssa ollut tekemisissä. gmb2bmpc.exe sinänsä on tuttu, koska se on minun kirjoittamani ohjelman pätkä (siis tuo C-kielellä tehty toteutus). Muistaakseni ohjelma kirjoittaa Ozille map-tiedoston, jossa on siis karttalehden nurkkapisteiden koordinaattitiedot eli nämä paljon puhutut kalibrointitiedot. Virhe voi aiheutua siitä, että vihreissä merikartoissa koordinaattien datum on MeriCD:ssä KKJ:ssä (.in8-tiedostossa), sinisissä arvaisin niiden olevan WGS84:ssa. Datum kirjoitetaan myös Ozin map-tiedostoon eli sinne menee rivi, jossa on teksti "Finland Hayford". Rivin voisi yrittää muuttaa käsin muotoon "WGS84" ja kokeilla toimivuutta vaikkapa tekemällä waypointteja kartan koordinaattiviivojen risteyksiin ja katsomalla tulevatko koordinaatit oikein. Karttaohjelmassa pitää tietenkin valita näytettäväksi datumiksi myös WGS84.
Itse muunnosohjelmaan tuskin tulee päivityksiä ellei sitten joku ohjelmointitaitoinen ystävällisesti muuta jaossa olevaa C-koodia ja käännä siitä uuden exen. Itse en ohjelmaa enää ylläpidä, koska aikanaan laskettuani ohjelman levitykseen sain kimppuuni Merenkulkulaitoksen tarkastajat ja asianajajat. Yksityishenkilönä ei ole kovin suurta halua lähteä tappelemaan tälläistä valtion laitosta vastaan vaikka ei sinänsä tuntisi mitään vääryyttää tehneensäkään.
Kiitoksia hyvästä vastauksesta. Yritin muutella noita KKJ/WGS84 - kenttiä myös ASCII-faileista, eri yhdistelmillä saa tuon länsi-itä -suuntaisen pienen siirron aikaiseksi. Pohjois-etelä -suuntainen virhe pysyy luonnollisesti samana.
Todennäköisesti kyseessä on tarkoituksellinen virhe jolla yritetään estää karttamateriaalin käyttö vieraissa, vaikka laillisissa, ohjelmissa. Todella ikävää. Ainakin sotkee käytännöllisen ohjelmasi nykyversion käytön.
Pitänee kommentoida Ozin suuntaan, jos saavat ohjelman lukemaan suoraan uutta GMB:tä niin uusia käyttäjiä löytyy varmasti.
Ozi:n kämmentietokoneversion hinta on 25e. Siihen hintaan ei tietenkään kuulu karttoja, mutta avoimeen ohjelmaan voi ladata omia karttoja. Taidanpa ladata mökkini ympäristön 1:20 000 maastokarttana. Pienen kalaveneen kanssa pikkusaarien ja luotojen keskellä maastokartta toimii hyvin!
IN8 file aukeaa Wordpadilla ja teksti on siis luettavassa muodossa kuten missä tahansa ini-tiedostossa. Karttana minulla on Läntinen Suomenlahti 2003, taitaa olla ensimmäinen rannikkokartoista 18-22 tehty sininen CD-merikartta. Jos olen tulkinnut in8 filessä olevat kartan M18 kulmapisteet oikein, ne ovat nimenomaan KKJ-koordinaatteja.
Asiassa ilmeisesti joitakin hämää se, että uudet siniset kartat on mainostettu olevan WGS84 mukaisia karttoja, mutta CD-versiossa voi lennossa määritellä, kumpaa datumia käyttää, KKJ:tä vai WGS:ää. Kartta-aineiston INx-kalibrointitiedostoihin sillä ei ole vaikutusta. Kun sitten pelkkää kartta-aineistoa siirretään johonkin muuhun järjestelmään, saattaa mukana olla edelleen ajatus, että siirretään WGS-mukaista karttaa. Mielestäni näin asia ei ole. Siirrossa on todella tiedettävä, mikä on lopputulos.
Sorry vaan, että en pysty tämän enempää asiaa valaisemaan, toivottavasti Ozi tai muut jaksavat vielä asiaa tutkia.
Missäs tuo koodi on jaossa? Joskus kun sitä yritin etsiä, löysin vain jonkun Pascal-version, ja Pascal ei minulta oikein suju.
Tässä vaiheessa kannattaisi ehkä tehdä Ozin kalibrointi (käytän tätä termiä, kun se on kerta Ozissakin toimenpiteelle valittu) käsin eli tehdä ensin gmb2bpc:llä aineisto ilman map-tiedostoa. Ozissa on tälle toimelle oma valikkovalinta ja sen taitaa pystyä tekemään, vaikka map-tiedosto on jo olemassa. Kalibrointi sinänsä on yksittäiselle kartalle helppo toimenpide: tarvitaa 3-4 tunnettua pistettä, joiden paikka valitaan kartalta ja annetaan niiden koordinaatit valitussa datumissa (sinisissä siis WGS84, koska koordinaattiviivasto on sen mukainen). Lisäksi ohjelmalle kerrotaan karttaprojektio, jonka jälkeen syntyy map-tiedosto. Sitten vaan varmistus, että myös välipisteiden (esim. koordinaattiviivaston risteykset) ovat oikein. map-tiedostoa voi katsella vaikkapa notapadilla ja verrata sitä gmb2bmpc:n tuottamaan (tosin tässä tiedostossa käytetään in8:sta saatuja neljää kulmapistettä).
Muunnos KKJ:N (Finland Hayford) ja WGS84:n välillä on puhdasta matematiikkaa, ainakin rajatulla (karttalehden) alueella. Jos heittoa syntyy GPS-paikannuksessa eli GPS:stä luetun sijainnin täppä kartalla näkyy väärässä paikassa, niin silloin syynä on yleensä ristiriita GPS:ssä valitussa ja karttaohjelman käyttämässä datumissa. Kalibrointivirheet näkyvät jo ohjelman käytössä eli koordinateissa on heittoa kalibrointipisteiden välisellä alueella. Koordinaattivivvaston risteykset ovat hyviä tarkistuspisteitä, niissä jo muutaman kymmenen metrin virhe tulee kyllä näkyviin. Huolellisesti tehdyllä työllä pitäisi päästä muutaman metrin tarkkuuteen, absoluuttiseen tarkuuteen ei monestakaan syystä varmasti pääse eikä se ole tarpeenkaan.
Kuvauksesi rasteriaineiston asemoinnista Oziin oli selkeä. Huomioni kiinnittyi kuitenkin sanoihin "kalibroinriin tarvitaan 3-4 pistettä". Ei asemointiin tarvita kuin 2 pistettä, tai oikeammin 1 piste ja suunta.
Jos kerran kerrotaan asemoitavan aineiston täydelliset karttaprojektioon liittyvät tiedot, niin se määrää täydellisesti kuvan muodon ja koon. Tämä jäykkä kappale pitää vain naulata oikeaan kohtaan.
Ajatellaan isoa puista levyä joka tulee naulata seinälle oikeaan kohtaan ja oikeaan asentoon. Kuinka sen teet. Lyöt levyn vain yhden naulalla seinään täsmälleen oikeaan kohtaan. Sitten kierrät levyä, että se tulee oikeaan suuntaan. Ja siinä se on kohdallaan. No se, miten varmistat, että se pysyy seinällä on sitten eri asia.
Mutta jos yrität ensin huonolla sabluunalla porata neljä reikää levyyn ja neljä reikää seinään, niin eiväthän ne ole kohdallaan. Ja sitten saat survoa väkisin ruuvit reikiinsä ja yhteen tai kahteen reikään ei ruuvi mene ehkä lainkaan. Ja levy on vinossa seinällä. Vastaava väkivalta voi tulla eteen, jos yrität asemoida karttaa 3-4 pisteen avulla. Ja jos ohjelma taas päästetään tekemään epämääräisiä "kalibrointikorjauksia" aineistoon, niin silloin ollaan siinä tilanteessa, jota vastaan olen protestoinut.
/*------------------------------------------------------------------*/
/* Konversio-ohjelma CD Merikartta .gmb -> .bmp ja .in8 -> .map
Käyttö : gmb2bmpC lähde[.gmb] kohde[.bmp] [-c] [-o]
Ohjelma tehty GMB2BMP ver 0.2 Copyright (C) 2000 Peter Andersson [email protected]
gmb2bmp.pas Pascal kielisen lähdekoodin perusteella.
---------------------------------------------------------------
HUOM! struct byte alignment oltava 1 byte kääntäjän asetuksissa
---------------------------------------------------------------
XX 20021119 v.0.8c
- korjattu 256 värin paletin käsittely, korvattu funkkari
ConvBData() uudella ConvWData():lla. Aiempi BYTE * paluuarvo
vaihdettu WORD *, koska arvon 256 palauttaminen ei onnistunut.
XX 20021004 v.0.7c
- tiedoston koko meni bmp-headeriin väärin, koska tiedoston
koko palautui sen vielä avoinna ollessa vääränä. Lisätty
flushall() ennen tiedoston koon kyselyä
XX 20021002 v.0.6c
- korjattu ongelma >128 väristen tiedostojen väripalettien
käsittelyssä: staattinen BYTE acGmbHeader[] aiheutti 16-bittisessä
koodissa pino-ongelmia, muutettu tilan varaus dynaamiseksi
malloc():lla tehtäväksi
XX 20020916 v.0.5c
- Korjattu 256 värin tiedoston käsittely
- ST_ARGS struktien kenttien tietotyyppien hiplausta
- Tiedostojen nimien käsittelyssä korjattu bugi funkkarissa sWriteMapFile
- Karsittu pois varoituksia castauksilla, alustuksilla yms.
art 20000731 v.0.4c
Korjattu sama virhe funkkarissa RLE8 kuin aiemmin RLE4:ssa
art 20000612 v.0.3c
Korjattu RLE4 funkkarissa virhe, joka aiheutti sen, että
osa datasta jäi käsittelemättä, koska funkkaria lGetData
kutsuttiin, vaikka käsiteltäviä tavuja oli jäljellä 0 kpl
-> RLE4:sta poistuttiin kesken suorituksen.
Lisäsin datapuskurin täytön ehdoksi vielä && lBytesToProcess
Ari Torpström - 30.05.2000 */
/*------------------------------------------------------------------*/
#include
#include
#include
#include
#include
#include
#include
#include
typedef unsigned short WORD;
typedef unsigned char BYTE;
typedef struct tagBITMAPFILEHEADER {
char bfType0; /* 00h */
char bfType1; /* 01h */
long bfSize; /* 02h */
WORD bfReserved1; /* 06h */
WORD bfReserved2; /* 08h */
long bfOffBits; /* 0Ah */
} ST_BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER {
long biSize; /* 0Eh */
long biWidth; /* 12h */
long biHeight; /* 16h */
WORD biPlanes; /* 1Ah */
WORD biBitCount; /* 1Ch */
long biCompression; /* 1Eh */
long biSizeImage; /* 22h */
long biXPelsPerMeter; /* 26h */
long biYPelsPerMeter; /* 2Ah */
long biClrUsed; /* 2Eh */
long biClrImportant; /* 32h */
} ST_BITMAPINFOHEADER;
typedef struct tagRGBQUAD {
BYTE rgbBlue; /* 36h */
BYTE rgbGreen; /* 37h */
BYTE rgbRed; /* 38h */
BYTE rgbReserverd; /* 39h */
} ST_RGBQUAD;
#define FILE_NAME_LEN 255
typedef struct tagST_ARGS {
char szSourceFile[FILE_NAME_LEN];
char szDestFile[FILE_NAME_LEN];
BYTE bConvert;
BYTE bCalibrate;
char szDatumCode[6];
char szFilterCode[6];
} ST_ARGS;
#define TRUE 1
#define FALSE 0
#define COUNT_ARGS_MIN 3
#define ERROR_OK 0
#define ERROR_GENERAL 1
#define ERROR_TOO_FEW_PARAMETERS -1
#define ERROR_SOURCE_FILE -2
#define ERROR_DEST_FILE -3
#define ERROR_MAP_FILE -4
#define ERROR_IN8_FILE -5
#define FILE_TYPE_GMB 0
#define FILE_TYPE_GMP 1
#define GMB_HEAD_SIZE 0x0FB2 /* GmbcSize = $0FB2; */
#define GMB_WIDTH_START 0x007E /* GmbWidthStart = $07E; */
#define GMB_HEIGHT_START 0x0092 /* GmbHeightStart = $092; */
#define GMB_B_START 0x00B5 /* GmbbStart = $0b5; */
#define GMB_N_COLOR_START 0x00B0 /* NcolorStart = $0B0; */
#define GMB_N_USED_COLORS 0x00A6 /* NusedColors = $0A6; */
#define GMB_DATA_BUFFER_SIZE 1024
#define SIZE_IO_BUFFER 12800
#define INFO_BGND 177
#define INFO_FGND '>' /*219*/
void copyFileNameLowercase (char *pszDest, char *pszSrc, unsigned int iSizeOfDest);
void ConvLData(long *plBmpData, BYTE *pcGmbData, WORD wGmbInd, int iCount);
void ConvWData(WORD *pwBmpData, BYTE *pcGmbData, WORD wGmbInd, int iCount);
long lGetData(BYTE *pabDataBuffer, int iMaxSize, long lSourcePos, long lSourceSize, FILE *pfSource);
int RLE4(FILE *pfSource, FILE *pfDest, long lSourcePos, long lSourceSize, BYTE bF, ST_BITMAPINFOHEADER *pstBmih);
int RLE8(FILE *pfSource, FILE *pfDest, long lSourcePos, long lSourceSize, ST_BITMAPINFOHEADER *pstBmih);
int sWriteBMPHeader(FILE *pfDest, ST_BITMAPFILEHEADER *pstBmpFileHeader, ST_BITMAPINFOHEADER *pstBmpInfoHeader, ST_RGBQUAD *pastColors, WORD wBufferP);
int sWriteMapFile(char *pszSourceFile, char *pszDestFile, long lBmpWidth, long lBmpHeight);
/* -------------------------------------------------------------------- */
int main(int argc , char *argv[])
/* -------------------------------------------------------------------- */
{
char *pszCopyright = "GMB2BMPC v.0.8c Copyright (C) 2000 Peter Andersson [email protected],\n C-implementation by [email protected]";
char *pszUsage = "GMB2BMPC source[.gmb] destin[.bmp] [-C [-O]]\n -C -> Convert .gmb file to .bmp\n -O -> convert .in8 file to OziExplorer .map";
ST_ARGS stArgs;
int iArgInd;
int status = ERROR_OK;
FILE *pfSource = NULL;
FILE *pfDest = NULL;
long lSourceFileSize = 0;
long lLinestop;
long lPaddr, lBaddr = 0;
long lQ;
WORD wJ;
BYTE bF, bI;
/*BYTE bFilter;*/
/*BYTE acGmbHeader[GMB_HEAD_SIZE];*/
BYTE *acGmbHeader = NULL;
BYTE acGmbData[GMB_DATA_BUFFER_SIZE];
unsigned char cFileType = FILE_TYPE_GMB;
WORD bNcolor = 0;
WORD bUcolor = 0;
BYTE c0 = 0;
BYTE c1 = 1;
ST_RGBQUAD astColors[256];
WORD wBufferP;
ST_BITMAPFILEHEADER stBmpFileHeader = {0}; /* bmfh */
ST_BITMAPINFOHEADER stBmpInfoHeader = {0}; /* bmih */
long sInfoUnitSize;
int sInfoLineLen = 25 ;
long lCount;
int iColorInd, iColorCount;
/* ------------------------------ */
/* Handle command line parameters */
/* ------------------------------ */
printf("\n%s\n", pszCopyright);
if (argc < COUNT_ARGS_MIN) {
printf("\nToo few parameters!\n");
printf("\nUsage: %s\n", pszUsage);
status = ERROR_TOO_FEW_PARAMETERS;
goto MainEnd;
}
memset(&stArgs, '\0', sizeof(stArgs));
copyFileNameLowercase(stArgs.szSourceFile, argv[1], sizeof(stArgs.szSourceFile)-4);
copyFileNameLowercase(stArgs.szDestFile, argv[2], sizeof(stArgs.szDestFile)-4);
cFileType = FILE_TYPE_GMB;
if (!strstr(stArgs.szSourceFile, ".gmb")) {
if (strstr(stArgs.szSourceFile, ".gmp")) {
cFileType = FILE_TYPE_GMP;
printf("\nSorry, conversion of .gmp files not yet implemented...\n");
printf("\nUsage: %s\n", pszUsage);
goto MainEnd;
}
else {
strcat(stArgs.szSourceFile, ".gmb");
}
}
if (!strstr(stArgs.szDestFile, ".bmp")) {
strcat (stArgs.szDestFile, ".bmp");
}
for (iArgInd = 3; iArgInd < argc; iArgInd++) {
if ( *(argv[iArgInd]) != '-') {
printf("\n[%s]Incorrect parameter ignored: %s\n", argv[0], argv[iArgInd]);
continue;
}
switch ( tolower(*(argv[iArgInd]+1)) ) {
case 'c':
stArgs.bConvert = TRUE;
break;
case 'o':
stArgs.bCalibrate = TRUE;
break;
case 'f':
if(*(argv[iArgInd]+2)) {
strncpy(stArgs.szFilterCode, argv[iArgInd]+2, sizeof(stArgs.szFilterCode));
}
break;
case 'w':
if(*(argv[iArgInd]+2)) {
strncpy(stArgs.szDatumCode, argv[iArgInd]+2, sizeof(stArgs.szDatumCode));
}
break;
default:
printf("\n[%s]Incorrect parameter ignored: %s\n", argv[0], argv[iArgInd]);
break;
} /* end switch */
} /* end for iArgInd < argc */
/*----------------------------------------------------*/
/* Open source file (.gmb) for reading in binary mode */
/*----------------------------------------------------*/
pfSource = fopen ( stArgs.szSourceFile , "rb" ) ;
if ( pfSource == NULL )
{
printf("\nError opening file %s\n" , stArgs.szSourceFile);
status = ERROR_SOURCE_FILE;
goto MainEnd;
}
lSourceFileSize = filelength(fileno(pfSource));
if (!stArgs.bConvert && stArgs.bCalibrate) {
printf("\nSorry, can not do calibration (-o) without conversion (-c)!\n");
status = ERROR_TOO_FEW_PARAMETERS;
goto MainEnd;
/*goto DoCalibration;*/
}
if (!stArgs.bConvert) {
printf("\nNothing to do!\n");
printf("\nUsage: %s\n", pszUsage);
goto DoCalibration;
}
/*---------------------------------------------------------*/
/* Open destination file (.bmp) for writing in binary mode */
/*---------------------------------------------------------*/
pfDest = fopen ( stArgs.szDestFile , "wb" ) ;
if ( pfDest == NULL )
{
printf("\nError opening file %s\n" , stArgs.szSourceFile);
status = ERROR_DEST_FILE;
goto MainEnd;
}
printf("\n%s -> %s", stArgs.szSourceFile, stArgs.szDestFile);
/* set input buffers to optimize file handling */
/*
setvbuf ( pfSource , NULL , _IOFBF , SIZE_IO_BUFFER );
setvbuf ( pfDest , NULL , _IOFBF , SIZE_IO_BUFFER );
*/
/* ---------------------------------*/
/* Get header info from source file */
/* ---------------------------------*/
/* handle gmb/gmp file header */
acGmbHeader = malloc(GMB_HEAD_SIZE);
if (!acGmbHeader) {
printf("\nMemory allocation error\n");
status = ERROR_GENERAL;
goto MainEnd;
}
memset(acGmbHeader, '\0', GMB_HEAD_SIZE);
memset(&stBmpInfoHeader, '\0', sizeof(stBmpInfoHeader));
memset(&stBmpFileHeader, '\0', sizeof(stBmpFileHeader));
if ( fread(acGmbHeader, GMB_HEAD_SIZE, 1, pfSource) ) {
if (cFileType == FILE_TYPE_GMB) {
/* BlockRead( gmbu, gmbc, SizeOf( gmbc ), NumberRead );
ConvLData(bmih.biWidth, gmbWidthStart,5);
ConvLData(bmih.biHeight, gmbHeightStart,5);
ConvBData(bNcolor,NcolorStart,3);
ConvBData(bUcolor,NusedColors,3); */
ConvLData(&stBmpInfoHeader.biWidth, acGmbHeader, GMB_WIDTH_START, 5);
ConvLData(&stBmpInfoHeader.biHeight, acGmbHeader, GMB_HEIGHT_START, 5);
ConvWData(&bNcolor, acGmbHeader, GMB_N_COLOR_START, 3);
ConvWData(&bUcolor, acGmbHeader, GMB_N_USED_COLORS, 3);
} /* end if cFileType == FILE_TYPE_GMB */
if (cFileType == FILE_TYPE_GMP) {
/* KESKEN */
ConvLData(&stBmpInfoHeader.biWidth, acGmbHeader, GMB_WIDTH_START, 5);
ConvLData(&stBmpInfoHeader.biHeight, acGmbHeader, GMB_HEIGHT_START, 5);
ConvWData(&bNcolor, acGmbHeader, GMB_N_COLOR_START, 3);
ConvWData(&bUcolor, acGmbHeader, GMB_N_USED_COLORS, 3);
} /* end if cFileType == FILE_TYPE_GMB */
} /* end if fread() */
else {
printf("\nError reading sourcefile %s\n" , stArgs.szSourceFile);
status = ERROR_SOURCE_FILE;
goto MainEnd;
}
/* -------------------- */
/* init bmp file header */
/* -------------------- */
stBmpFileHeader.bfType0 = 'B';
stBmpFileHeader.bfType1 = 'M';
stBmpFileHeader.bfReserved1 = 0;
stBmpFileHeader.bfReserved2 = 0;
stBmpInfoHeader.biSize = sizeof(stBmpInfoHeader);
stBmpInfoHeader.biSizeImage = 0;
wBufferP = (WORD)(bNcolor == 16 ? sizeof(astColors) / 16 : sizeof(astColors));
stBmpFileHeader.bfOffBits = sizeof(stBmpFileHeader) + sizeof(stBmpInfoHeader) + wBufferP;
/* lPaddr := $26D7 + 4 * (bmih.biHeight - 1);
lLinestop := FileSize( gmb ); */
lPaddr = 0x26D7 + 4 * (stBmpInfoHeader.biHeight - 1);
lLinestop = lSourceFileSize;
bF = 0xFF;
/* if not(Filter = $0FF) then bF := Filter SHL 4; */
/* write an empty headers into bmp file to be modified and rewritten later */
status = sWriteBMPHeader(pfDest, &stBmpFileHeader, &stBmpInfoHeader, astColors, wBufferP);
/* -------------------------------------------------------- */
/* process source file and convert data to destination file */
/* -------------------------------------------------------- */
sInfoUnitSize = stBmpInfoHeader.biHeight / sInfoLineLen;
printf ("\n"); /*
for ( i = 0 ; i < sInfoLineLen ; i++) printf ("%c" , INFO_BGND);
gotoxy ( 1 , wherey() ) ; */
lCount = 0;
rewind(pfSource);
for (wJ = 0; wJ < (WORD)stBmpInfoHeader.biHeight; wJ++, lCount++) {
if (lCount >= sInfoUnitSize) {
printf("%c" , INFO_FGND); /* 219 */
lCount = 0;
}
if (cFileType == FILE_TYPE_GMP) {
/* KESKEN */
/*
if gmp then begin
if not (FilePos( idx ) = FileSize( idx )) then begin
lBaddr := lLineStop;
lLineStop := 0;
lQ := 1;
for bI := 1 to 4 do begin
Read( idx, bK );
lLineStop := lLineStop + bK * lQ;
lQ := lQ * 256;
end;
end;
end
*/
} /* end if cFileType == FILE_TYPE_GMP */
if (cFileType == FILE_TYPE_GMB) {
/* Seek( gmb, lPaddr );
lBaddr := 0;
lQ := 1;
for bI := 1 to 4 do begin
Read( gmb, bK );
lBaddr := lBaddr + bK * lQ;
lQ := lQ * 256;
end; */
fseek(pfSource, lPaddr, SEEK_SET);
memset(acGmbData, '\0', sizeof(acGmbData));
status = fread(acGmbData, 4, 1, pfSource);
for(lBaddr = 0, lQ = 1, bI = 0; bI < 4; bI++) {
lBaddr = lBaddr + acGmbData[bI] * lQ;
lQ *= 256;
}
} /* end if cFileType == FILE_TYPE_GMB */
/* Seek( gmb, lBaddr );
lN := lBaddr;
wO := 0;
if bNcolor = 16 then RLE4 else RLE8; */
fseek(pfSource, lBaddr, SEEK_SET);
/*lN = lBaddr;*/
if (bNcolor == 16) {
status = RLE4(pfSource, pfDest, lBaddr, lLinestop, bF, &stBmpInfoHeader);
}
else {
status = RLE8(pfSource, pfDest, lBaddr, lSourceFileSize, &stBmpInfoHeader);
}
/* write( bmp,c0,c0 );
bmih.biSizeImage := bmih.biSizeImage + 2;
if not gmp then begin
lLinestop := lBaddr;
lPaddr := lPaddr - 4;
end; */
status = fwrite( &c0, sizeof(c0), 1, pfDest );
status = fwrite( &c0, sizeof(c0), 1, pfDest );
stBmpInfoHeader.biSizeImage += 2;
if (cFileType == FILE_TYPE_GMB) {
lLinestop = lBaddr;
lPaddr = lPaddr - 4;
}
} /* end for wJ < stBmpInfoHeader.biHeight */
/* write( bmp,c0,c1 );
bmih.biSizeImage := bmih.biSizeImage + 2; */
status = fwrite( &c0, sizeof(c0), 1, pfDest );
status = fwrite( &c1, sizeof(c1), 1, pfDest );
stBmpInfoHeader.biSizeImage += 2;
/* -------------------------------------------------- */
/* create and rewrite bmp header with concurrent data */
/* -------------------------------------------------- */
flushall();
stBmpInfoHeader.biPlanes = 1;
stBmpInfoHeader.biPlanes = 1;
stBmpInfoHeader.biBitCount = (WORD)(bNcolor == 16 ? 4 : 8);
stBmpInfoHeader.biCompression = (WORD)(bNcolor == 16 ? 2 : 1);
stBmpInfoHeader.biXPelsPerMeter = 0;
stBmpInfoHeader.biYPelsPerMeter = 0;
stBmpInfoHeader.biClrUsed = bNcolor;
stBmpInfoHeader.biClrImportant = bNcolor;
stBmpFileHeader.bfSize = filelength(fileno(pfDest));
if (cFileType == FILE_TYPE_GMP) {
/* KESKEN */
/*
close( idx )
*/
} /* end if cFileType == FILE_TYPE_GMP */
if (cFileType == FILE_TYPE_GMB) {
/* if gmp then close( idx )
else begin
wJ := 0;
for bK := 0 to bNcolor-1 do begin
ConvBData(aColors[bK].rgbRed, gmbbStart + wJ, 4);
wJ:=wJ+4;
ConvBData(aColors[bK].rgbGreen, gmbbStart + wJ, 4);
wJ:=wJ+4;
ConvBData(aColors[bK].rgbBlue, gmbbStart + wJ, 4);
wJ:=wJ+7;
end;
end; */
memset(astColors, '\0', sizeof(astColors));
iColorCount = (bNcolor?bNcolor:bUcolor);
for (iColorInd = 0, wJ = GMB_B_START; iColorInd < iColorCount; iColorInd++) {
WORD wTemp;
ConvWData(&wTemp, acGmbHeader, wJ, 4);
astColors[iColorInd].rgbRed = (BYTE)(wTemp>0xFF?0xFF:wTemp);
wJ += 4;
ConvWData(&wTemp, acGmbHeader, wJ, 4);
astColors[iColorInd].rgbGreen = (BYTE)(wTemp>0xFF?0xFF:wTemp);
wJ += 4;
ConvWData(&wTemp, acGmbHeader, wJ, 4);
astColors[iColorInd].rgbBlue = (BYTE)(wTemp>0xFF?0xFF:wTemp);
wJ += 7;
}
} /* end if cFileType == FILE_TYPE_GMB */
/*.. wJ = 0;
memset(astColors, '\0', sizeof(astColors));
* for (bI = 0; bI < (bNcolor?bNcolor:bUcolor); bI++) { 20020916 *
for (bI = 0; bI out of while art 20000612 */
bI = abDataBuffer[iByteInd++]; lBytesToProcess--;
bK = (BYTE)(bI & 0x0F);
if (iByteInd >= lBytesRead && lBytesToProcess) {
/* get more data GMB_DATA_BUFFER_SIZE bytes */
lBytesRead = lGetData(abDataBuffer, GMB_DATA_BUFFER_SIZE, lSourcePos, lSourceSize, pfSource);
if (lBytesRead = lBytesRead && lBytesToProcess) {
/* get more data GMB_DATA_BUFFER_SIZE bytes */
lBytesRead = lGetData(abDataBuffer, GMB_DATA_BUFFER_SIZE, lSourcePos, lSourceSize, pfSource);
if (lBytesRead = lBytesRead && lBytesToProcess) {
/* get more data GMB_DATA_BUFFER_SIZE bytes */
lBytesRead = lGetData(abDataBuffer, GMB_DATA_BUFFER_SIZE, lSourcePos, lSourceSize, pfSource);
if (lBytesRead > 4);
bI = (BYTE)(bI | bShr4); /*(bI >> 4));*/
while (wO > 255) {
status = fwrite( &c255, sizeof(c255), 1, pfDest );
if (status == 1) status = ERROR_OK; else goto RLE4End;
status = fwrite( &bI, sizeof(bI), 1, pfDest );
if (status == 1) status = ERROR_OK; else goto RLE4End;
pstBmih->biSizeImage += 2;
wO = wO - 255;
}
bK = (BYTE)wO;
status = fwrite( &bK, sizeof(bK), 1, pfDest );
if (status == 1) status = ERROR_OK; else goto RLE4End;
status = fwrite( &bI, sizeof(bI), 1, pfDest );
if (status == 1) status = ERROR_OK; else goto RLE4End;
pstBmih->biSizeImage += 2;
wO = 0; /* art 20000612 */
} /* end if bI != bF */
} /* while(lBytesToProcess) */
RLE4End:
if (status != ERROR_OK) printf("\nConversion error in function RLE4(...)\n");
return status;
} /* end RLE4 */
/* -------------------------------------------------------------------- */
int RLE8(FILE *pfSource, FILE *pfDest, long lSourcePos, long lSourceSize, ST_BITMAPINFOHEADER *pstBmih)
/* -------------------------------------------------------------------- */
{
BYTE abDataBuffer[GMB_DATA_BUFFER_SIZE];
long lBytesRead = 0;
long lA = 0;
unsigned int wO = 0;
BYTE bI, bK;
BYTE c255 = 255;
int status = ERROR_OK;
int iByteInd;
/* repeat
Read( gmb,bI );
inc( lN );
Read( gmb,bK );
inc( lN );
wO := (bK AND $7F);
if (bK AND $080) = $080 then begin
Read( gmb,bK );
wO := wO * 256 + bK;
inc(lN);
end;
lA:=lA+wO;
while wO > 255 do begin
write( bmp,c255,bI );
wO := wO - 255;
bmih.biSizeImage := bmih.biSizeImage + 2;
end;
bK := wO;
write( bmp,bK,bI );
bmih.biSizeImage := bmih.biSizeImage + 2;
until lA >= bmih.biwidth; */
lBytesRead = lGetData(abDataBuffer, GMB_DATA_BUFFER_SIZE, lSourcePos, lSourceSize, pfSource);
if (lBytesRead biWidth) {
/* art 20000731 */
if (iByteInd >= lBytesRead) {
/* get more data GMB_DATA_BUFFER_SIZE bytes */
lBytesRead = lGetData(abDataBuffer, GMB_DATA_BUFFER_SIZE, lSourcePos, lSourceSize, pfSource);
if (lBytesRead = lBytesRead) {
/* get more data GMB_DATA_BUFFER_SIZE bytes */
lBytesRead = lGetData(abDataBuffer, GMB_DATA_BUFFER_SIZE, lSourcePos, lSourceSize, pfSource);
if (lBytesRead = lBytesRead) {
/* get more data GMB_DATA_BUFFER_SIZE bytes */
lBytesRead = lGetData(abDataBuffer, GMB_DATA_BUFFER_SIZE, lSourcePos, lSourceSize, pfSource);
if (lBytesRead 255) {
status = fwrite( &c255, sizeof(c255), 1, pfDest );
if (status == 1) status = ERROR_OK; else goto RLE8End;
status = fwrite( &bI, sizeof(bI), 1, pfDest );
if (status == 1) status = ERROR_OK; else goto RLE8End;
pstBmih->biSizeImage += 2;
wO = wO - 255;
}
bK = (BYTE)wO;
status = fwrite( &bK, sizeof(bK), 1, pfDest );
if (status == 1) status = ERROR_OK; else goto RLE8End;
status = fwrite( &bI, sizeof(bI), 1, pfDest );
if (status == 1) status = ERROR_OK; else goto RLE8End;
pstBmih->biSizeImage += 2;
} /* while(lA < pstBmih->biWidth) */
RLE8End:
if (status != ERROR_OK) printf("\nConversion error in function RLE8(...)\n");
return status;
} /* end RLE8 */
/* -------------------------------------------------------------------- */
long lGetData(BYTE *pabDataBuffer, int iMaxSize, long lSourcePos, long lSourceSize, FILE *pfSource)
/* -------------------------------------------------------------------- */
{
long lBytesRead = 0;
long lItemsRead = 0;
long lBytesToRead = 0;
lBytesToRead = lSourceSize - lSourcePos > iMaxSize ? iMaxSize : lSourceSize - lSourcePos;
memset(pabDataBuffer, '\0', iMaxSize);
lItemsRead = fread(pabDataBuffer, (int)lBytesToRead, 1, pfSource);
if (lItemsRead == 1) lBytesRead = lBytesToRead;
return lBytesRead;
} /* end lGetData */
/* -------------------------------------------------------------------- */
void ConvWData(WORD *pwBmpData, BYTE *pcGmbData, WORD wGmbInd, int iCount)
/* -------------------------------------------------------------------- */
{
int i, j;
*pwBmpData = 0;
for (i = iCount-1, j = 1; i >= 0; i--) {
if ( (*(pcGmbData+wGmbInd+i) & 0xF0) == 0x30 ) {
*pwBmpData += ( (*(pcGmbData+wGmbInd+i) & 0x0F ) * j );
j *= 10;
}
}
} /* end ConvWData */
/* -------------------------------------------------------------------- */
void ConvLData(long *plBmpData, BYTE *pcGmbData, WORD wGmbInd, int iCount)
/* -------------------------------------------------------------------- */
{
int i, j;
*plBmpData = 0;
for (i = iCount-1, j = 1; i >= 0; i--) {
if ( (*(pcGmbData+wGmbInd+i) & 0x00F0) == 0x0030 ) {
*plBmpData += ( (*(pcGmbData+wGmbInd+i) & 0x000F ) * j );
j *= 10;
}
}
} /* end ConvLData */
/* -------------------------------------------------------------------- */
void copyFileNameLowercase (char *pszDest, char *pszSrc, unsigned int iSizeOfDest)
/* -------------------------------------------------------------------- */
{
unsigned int iInd;
memset(pszDest, '\0', iSizeOfDest);
for (iInd = 0; iInd < strlen(pszSrc); iInd++) {
if (iInd < iSizeOfDest-1) *(pszDest+iInd) = (char)tolower(*(pszSrc+iInd));
}
} /* end copyFileNameLowercase */
/* -------------------------------------------------------------------- */
int sWriteMapFile(char *pszSourceFile, char *pszDestFile, long lBmpWidth, long lBmpHeight)
/* -------------------------------------------------------------------- */
{
char *paszOziMap[] = {
"OziExplorer Map Data File Version 2.0\n", /* [0] */
"no converted file (yet) \n", /* [1] */
"no converted path and file (yet) \n", /* [2] */
"1 TIFF scale factor\n", /* [3] */
"Finland Hayford\n", /* [4] */
"Reserved 1\n", /* [5] */
"Reserved 2\n", /* [6] */
"Magnetic Variation,5,30,E\n", /* [7] */
"Map Projection,Mercator\n", /* [8] */
"Point01,xy, 0, 0,in, deg, 60, 05.550,N, 24, 06.000,E, grid, , , ,N\n", /* [09] */
"Point02,xy, 6104, 8355,in, deg, 59, 54.180,N, 24, 22.583,E, grid, , , ,N\n", /* [10] */
"Point03,xy, , ,in, deg, , ,N, , ,E, grid, , , ,N\n",
"Point04,xy, , ,in, deg, , ,N, , ,E, grid, , , ,N\n",
"Point05,xy, , ,in, deg, , ,N, , ,E, grid, , , ,N\n",
"Point06,xy, , ,in, deg, , ,N, , ,E, grid, , , ,N\n",
"Point07,xy, , ,in, deg, , ,N, , ,E, grid, , , ,N\n",
"Point08,xy, , ,in, deg, , ,N, , ,E, grid, , , ,N\n",
"Point09,xy, , ,in, deg, , ,N, , ,E, grid, , , ,N\n",
"Point10,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point11,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point12,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point13,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point14,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point15,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point16,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point17,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point18,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point19,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point20,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point21,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point22,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point23,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point24,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point25,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point26,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point27,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point28,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point29,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Point30,xy, , ,in, deg, , ,, , ,, grid, , , ,\n",
"Projection Setup,,,,,,,\n",
"Map Feature = MF ; Map Comment = MC These follow if they exist\n",
"Track File = TF These follow if they exist\n",
"Moving Map Stuff = MM? These follow if they exist\n",
" \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n",
" \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n",
" \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n",
" \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n",
NULL
}; /* end of paszOziMap[] */
int status = ERROR_OK;
FILE *pfMap = NULL;
FILE *pfIn8 = NULL;
char szMapFileName[FILE_NAME_LEN] = {'\0'};
char szIn8FileName[FILE_NAME_LEN] = {'\0'};
char szMapName[128] = {'\0'};
char szIn8Line[128];
char szMapLine10[128];
char szMapLine11[128];
char *pszToken;
char *pszPeriod;
int iToken, iPos;
double dLon01 = 0, dLat01 = 0, dLon02 = 0, dLat02 = 0;
long lLon01 = 0, lLat01 = 0, lLon02 = 0, lLat02 = 0;
char *pszCalibFormat = "Point%02d,xy,%5ld,%5ld,in, deg,%4ld,%8.3lf,N,%4ld,%8.3lf,E, grid, , , ,N,\n";
/*
;[NMEARECT] 2735.700,6248.520,2753.810,6300.350
Point01,xy, 0, 0,in, deg, 63, 00.350,N, 27, 35.700,E, grid, , , ,N
Point02,xy, 7816,11196,in, deg, 62, 48.520,N, 27, 53.810,E, grid, , , ,N
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
1 2 3 4 5 6 7 8 9 0
*/
/* open .in8 for reading */
strncpy(szIn8FileName, pszSourceFile, sizeof(szIn8FileName));
pszPeriod = strstr(szIn8FileName, ".gm");
*(pszPeriod+1) = 'i'; *(pszPeriod+2) = 'n'; *(pszPeriod+3) = '8';
pfIn8 = fopen ( szIn8FileName , "r" );
if ( pfIn8 == NULL )
{
printf("\nError opening file %s, map file not created!\n" , szIn8FileName);
status = ERROR_IN8_FILE;
goto End;
}
/* open .map for writing. If file exists -> content will be destroyed */
strncpy(szMapFileName, pszDestFile, sizeof(szMapFileName));
pszPeriod = strstr(szMapFileName, ".bmp");
*(pszPeriod+1) = 'm'; *(pszPeriod+2) = 'a'; *(pszPeriod+3) = 'p';
pfMap = fopen ( szMapFileName , "w+" );
if ( pfMap == NULL )
{
printf("\nError opening file %s\n" , szMapFileName);
status = ERROR_MAP_FILE;
goto End;
}
printf("%s -> %s", szIn8FileName, szMapFileName);
/* find the beginning of the pure file name without extension or path */
iPos = pszPeriod - szIn8FileName; /* position index of period inside szIn8FileName string */
/* while(iPos && (*pszPeriod != '\\' || ':')) { 20020916 */
while(iPos && (*pszPeriod != '\\' || *pszPeriod != ':')) {
pszPeriod--;
iPos--;
}
strncpy(szMapName, pszPeriod, sizeof(szMapName));
pszPeriod = strchr(szMapName, '.');
memset(pszPeriod ,'\0', 4);
sprintf(paszOziMap[1], "%s\n", szMapName); /* map name = file */
sprintf(paszOziMap[2], "%s\n", pszDestFile); /* bmp file */
/* ---------------------- */
/* get data from in8 file */
/* ---------------------- */
memset(szIn8Line, '\0', sizeof(szIn8Line));
while ( fgets(szIn8Line, sizeof(szIn8Line), pfIn8) ) {
if (!strstr(szIn8Line, "[NMEARECT]")) continue;
/* ;[NMEARECT] 2735.700,6248.520,2753.810,6300.350 */
pszToken = strtok(szIn8Line, "],\n"); /* tokenize string using comma and newline (fgets reads also first newline character) */
iToken = 0;
while (pszToken) {
switch(iToken) {
case 1: /* 2735.700 */
dLon01 = atof(pszToken) / 100.0; /* 2735.700 -> 27.35700 */
lLon01 = (long)dLon01; /* 27.35700 -> 27 */
dLon01 = (dLon01-lLon01) * 100.0; /* (27.35700 - 27) * 100.0 -> 35.700 */
break;
case 2: /* 6248.520 */
dLat01 = atof(pszToken) / 100.0; /* 6248.520 -> 62.48520 */
lLat01 = (long)dLat01; /* 62.48520 -> 62 */
dLat01 = (dLat01-lLat01) * 100.0; /* (62.48520 - 62) * 100.0 -> 48.520 */
break;
case 3: /* 2753.810 */
dLon02 = atof(pszToken) / 100.0; /* 2753.810 -> 27.53810 */
lLon02 = (long)dLon02; /* 27.53810 -> 27 */
dLon02 = (dLon02-lLon02) * 100.0;
Unohdin mainita, että esim. Fortunan uusissa GPS-hiirissä (saattaa olla muillakin valmistajilla) on ainoana datumina WGS84, joten jos sellaista käyttää, kuten minä käytän läppärin kanssa, niin kartta on saatava täsmättyä samaan datumiin. Ei voi maailman tappiin pelata KKJ:n kanssa valitettavasti.
Muistutan taas kerran, että GPS:n lähettämän sijaintitiedon datumilla ja kartta-aineiston (ja sen kalibroinnissa käytetyllä datumilla) ei varsinaisesti ole tekemistä keskenään. Eli jos kartta-aineisto on KKJ:n mukainen (koordinaattimerkinnät KKJ:ssä), kalibrointi tehdään KKJ:n mukaisilla koordinaateilla, mutta kuitenkin sijaintinäyttö saadaan oikein, vaikka GPS lähettää sijainnin WGS84:na. Miksi näin? Yksinkertaisesti siksi, että muunnos KKJ:n ja WGS84:n välillä on puhdasta matematiikkaa (tiedän kyllä, että pientä virhettä syntyy, mutta nyt ei mennä senttitarkkuuksiin) ja ohjelmallisesti muunnos on varsin helppo tehdä. Tärkeintä on tietää, missä datumissa tieto tulee ja missä se halutaan esittää. Tähän perustuu myös se, että GPS osaa kertoa paikan koordinaatit useissa eri datumeissa. Sijaintia käsitellään ensisijaisesti WGS84:ssa ja siitä erilaisten laskutoimitusten mukaan saadaan tieto esitettyä halutussa datumissa.
Tärkeintä on se, että karttaohjelmassa on valittuna GPS:ltä tulevan sijaintitedon datumiksi sama, jota GPS todellisuudessa lähettää. Jotkut gepsit lähettävät sijainnin NMEA:lla aina WGS84:na, jotkut samassa, joka on valitettu näytettäväksi. Eli GPS:n datumina voi olla WGS84 ja karttaohjelmaasa _näytettävänä_ datumina voi olla KKJ ja kartta-aineiston datumina WGS84. Mikä tahansa yhdistelmä toimii _riittävän_ tarkasti, jos asetukset vain ovat kohdallaan.
Niin MeriCD:ssä kuin Ozissakin on erikseen valinta GPS:stä vastaanotettavan NMEA-datan datumille ja ohjelmassa esitettävän sijaintitiedon datumille. Näitä asioita ei pidä sotkea keskenään. Myös tiedon esitysmuodolle (esim. dd mm.mmmm, dd mm ss.sss, tms.) on valinnat, nämä esitysmuodon muutoksethan ovat vielä yksinkertaisempaa matematiikkaa.
Olet oikeassa, kaksi pistettä riittää, jos lähtöaineisto on muodossaa. Jos tuossa sinun kuvaamassasi tilanteessa levyn paikalla olisikin paperi, joka on hieman rypistynyt, niin homma menee astetta vaikeammaksi. Kahdella pisteellä tässä tilanteessa virhettä syntyy enemmän kuin silloin, jos pisteitä on annettu vaikkapa neljä. Toki virhettä syntyy tällöinkin, mutta vähemmän. Tämän takia kalibrointipisteitä suositellaan käytettäväksi usemapia.
Korostan vielä kerran sitä, että aineiston oikeellisuus pitää aina tarkistaa kalibrointitietojen määrittämisen jälkeen. Perustarkistus on helppo tehdä valitsemalla käytettävässä karttaohjelmassa kartalta riittävän monta koordinaattiviivojen risteyskohtaa ja katsomalla paikan koordinaatit. Jos ohjelma osaa korjata vioittuneen aineiston aiheuttamat virheet 5-10 m metrin tarkkuteen (n. 0,002 - 0,004 kaariminuuttia), niin silloin ollaan mielestäni hyväksyttävässä tarkkuudessa. Itse olen käyttänyt nyrkkisääntönä, että jos >0,005 minuutin virheitä ilmaantuu, pitää homma tehdä uusiksi. Tosin itselläni ei ole sattunut yhtään niin huonoa (meri)kartta-aineistoa, että virheitä olisin käytännössä havainnut.
Kokemukseni mukaan esim. OziExplorerin laskenta-algoritmit hallitsevat korjauksen hyvin vai onko nimimerkillä "ohjeet" antaa toisenlaista faktatietoa?
Sanoit: Olet oikeassa, kaksi pistettä riittää, jos lähtöaineisto on muodossaa.
Ja minä taas sanoin, että silloin kun tällaisesta bittikartasta kerrotaan ohjelmalle oikeat tiedot karttaprojektiosta ja ellipsoidista, se on oikeassa muodossaan.
Eli tähän saakka olemme samaa mieltä.
Mutta sinä ryhdyt heti puhumaan "rypistyneistä" kartoista. Ja siinä kohdassa menee välit poikki. "Rypistyneiden" vääristyneiden tai yleensä sellaisten karttojen, joiden projektio ym. lähtötietoja ei tiedetä, "kalibrointi" on humbuugia, jolla voi olla ennalta arvaamattomat seuraukset.
Sivusta kommentti, tuo rypistyminen on vähän huono sana tässä yhteydessä. Rypistyneistä kartoista (siis paperi....) skannattuja tiedostoja en menisi edes tarjoamaan ohjelmille, mutta skannauksessa tulee helposti x/y suunnissa mittavirhettä eli paperilla oleva neliö ei olekkaan tiedostossa neliö vaan suorakaide. Varsinkin halvemmissa skannereissa tuo ilmiö on melko yleinen, tosin aika lievänä yleensä. Lisäksi muutama vuoden veneessä ollut paperikartta saattaa olla kosteuden vaikutuksesta kutistunut hieman, paperilla on taipumus kutistua johonkin suuntaan vähän enemmän. En muista miten päin se oli paperikoneelta katsottuna, viiran kulkusuuntaan vai poikittain kun kutistui enemmän mutta jostain löytynee tieto kumpaan suuntaan merikartoilla oli taipumus kutistua enemmän (vanhat vihreät on leikattu paperirullalta ainakin pääasiassa "samaan asentoon").
Nuo kyseiset vääristymät korjautuvat erinomaisesti 3 tai 4 pisteen kalibroinnilla, muunlaiset vääristymät aiheuttavat ainakin kokeilemillani ohjelmilla "hemmetinmoisen valituksen" virheellisestä materiaalista. Tottakai kalibroinnin lopputulos pitää aina varmistaa ennenkuin siihen luottaa yhtään...
break;
case 4: /* 6300.350 */
dLat02 = atof(pszToken) / 100.0; /* 6300.350 -> 63.00350 */
lLat02 = (long)dLat02; /* 63.00350 -> 63 */
dLat02 = (dLat02-lLat02) * 100.0; /* (63.00350 - 63) * 1000.0 -> 00.350 */
break;
default:
break;
} /* end switch iToken */
pszToken = strtok(NULL, "],\n"); /* next token */
iToken++;
} /* end while pszToken */
} /* end while fread(szIn8Line...) */
/* ------------------------ */
/* format calibration lines */
/* ------------------------ */
/* Point01,xy, 0, 0,in, deg, 63, 00.350,N, 27, 35.700,E, grid, , , ,N */
/* "Point%02d,xy,%5ld,%5ld,in, deg,%4ld,%8.3lf,N,%4ld,%8.3lf,E, grid, , , ,N,\n" */
sprintf(szMapLine10, pszCalibFormat, 1, 0L, 0L, lLat02, dLat02, lLon01, dLon01);
paszOziMap[9] = szMapLine10;
/* Point02,xy, 7816,11196,in, deg, 62, 48.520,N, 27, 53.810,E, grid, , , ,N */
sprintf(szMapLine11, pszCalibFormat, 2, lBmpWidth, lBmpHeight, lLat01, dLat01, lLon02, dLon02);
paszOziMap[10] = szMapLine11;
/* ------------------------ */
/* write data into map file */
/* ------------------------ */
for (iPos = 0; paszOziMap[iPos]; iPos++) {
fputs(paszOziMap[iPos], pfMap);
} /* end for paszOziMap[iPos] */
printf("\n%25.25s - Map file OK -\n", " ");
End:
if (pfMap) fclose(pfMap);
if (pfMap) fclose(pfIn8);
return status;
} /* end sWriteMapFile */
Kas kun MeriCD:n ohjelma ei osaa käsitellä muuta, kuin KKJ-materiaalia, niin rompulla olevat kartat on väännetty KKJ:ksi.
Kyllä ne rasteriin kuuluvat WGS-koordinaattiviivat kuvautuvat kuitenkin maastoon nähden juuri niihin paikkoihin, mihin niiden tuleekin kuvautua.
Siniset kartat on piirretty WGS84:ään, joten long/lat viivat ovat WGS84 koordinaatistossa tasaluvuissa. Esim. Ozin karttaohjelmassa voi valita missä muodossa koordinaattinumero näytetään. Sisäisesti Ozi ja SeaClear käsittelevät karttoja aina WGS84-koordinaatistossa.
_Asennettaessa_ karttoja (toivottavasti tämä on sallittu termi, kun kalibrointi on näköjään varattu johonkin muuhun :-) ko. ohjelmiin ohjelmille kerrotaan missä koordinaatistossa lähde materiaali on.
MeriCD näyttää käsittelevän karttoja KKJ:ssä, perinteitä kunnioittaen :-) Kun katsoo karttalehtien _asennus_tiedostoja (.in8), niin tuolla on vain karttalehden kulmapisteet, ilman koordinaatistoa (joka käytännössä siis näyttää olevan KKJ).
Kun sinisiä sitten konvertoi näihin muihin ohjelmiin, niin ko. kulmapisteen ovat KKJ/Finnish Nautical Map/Finnish Hayford koordinaatiston pisteitä (hyvällä lapsella on monta nimeä), jotka asennusohjelma sitten konvertoi SC:n/Ozin sisäisesti käyttämään WGS84 muotoon.
Pelkästä KKJ/WGS84-ongelmasta ei ole kysymys. Kartat heittävät myös pohjois-eteläsuunnassa. Erot ovat samaa luokkaa molempiin suuntiin. Kokeilin kyllä kaikkia yhdistelmiä.
Siniset sähköiset kartat näyttävät tosiaan olevan vielä KKJ-muodossa. Ikävä juttu, mutta onneksi ohjelmat hanskaavat kyllä muutokset.
Kyllä se sinisten CD-karttojen rasterikuva on WGS-ellipsoidiin sidottuun Mercator-projektiotasoon piirretty kuva. Jos vastaavasta alueesta piirretään kuva "KKJ":ssä niin kuvat pikselit eivät satu samoille kohdille, kun verrataan koko kuva-alaa keskenään.
Jos Meri-CD sitten käyttää tästä kuvamosaiikista yhtenäistä karttaa muokatessaan kuvan nurkkapisteiden KKJ-koordinaatteja, niin kyseessä on vähintään "quick and dirty" ratkaisu. Mutta minä en tiedä mitä Meri-CD ohjelma tekee. Tarkastelunäkökulmani on teoreettinen, mikä on mahdollista tehdä oikein ja mikä ei ole mitenkään mahdollista tehdä oikein jonkin rasterikäsittelyohjelman avulla.
Tietenkin jokin toinen ohjelma voi muokata mosaiikista virheettömän kartan WGS84:ssä, mutta silloin pitää antaa manuaalisesti aika paljon tietoa, jonka pitää olla ehdottomasti oikein. En tässä ryhdy kuvaamaan tämän tiedon elementtejä, koska en tunne ko. ohjelmia. Tieto on uniikkia, mutta esitystapa voi vaihdella.
Teoreettinen saivartelu kannattaa jättää ehkä muille foorumeille, muunnoksissa syntyvät pienet virheet (
Niin meitähän on joka junaan ja kukin taaplaa tyylillään. Harrastuksestahan tässä on kysymys, niin teillä kuin minullakin. Minäkin harrastan mielelläni kaikenlaista, mutta luonteeseeni kuuluu, että yritän aina tehdä kaiken periaatteeltaan oikein. Joku toinen taas nauttii siitä, että pystyy tekemään ammattilaiselta näyttävää jälkeä kotikonstein.
Mutta yhdessä asiassa olen jyrkkä, aluksen päällikön on aina tiedettävä missä on ja mihin on menossa. Ja jos tässä päätöksenteossa käytetään monimutkaisia teknisiä järjestelmiä, niin harrastelija voi ottaa elämää suuremman vastuun kannettavakseen. Kyllähän te vakuuttelette ymmärtävänne asian, ja kaikki ne jotka tänne kirjoittavat ymmärtävät varmasti myös. Mutta entä ne, jotka vain lukevat näitä kirjoituksia ja tuhertavat asioiden parisa omissa oloissaan.
Vihdoinkin kunnollinen ja asiallinen keskustelu näillä palstoilla!Kunniotettava piirre tuo jämpti "niuhottaminen". Kuitenkin (lähes) kaikki asian harrastajat tietävät, että epätarkkuustekijöitä on siinä määrin, että auringontarkkaan navigointiin ei kannata ryhtyä, vaan riittää, että esim sumussa ja yöllä pysyy väylällä. Itse olen huomannut, että kotisatamasta lähtiessä tai palatessa on gps:n tarkkuus erilainen eri päivinä. Parhaimmillaan se on alle pari metriä ja pahimmillaan parikymmentäkin. (vertailupisteinä samat kiinteät jääpoijut). Lähtökohtaisesti Merenkulkuhallituksen pikselikartat ovat sen verran epätarkkoja, että niillä osuu kiviin paperiversiollakin, jollei käytä omaa järkeään.
Epäilemättä löytyy paikkoja, jossa merenkulkuhallituksen pikselikartoilla voi paikannus viedä kiville. Mutta kun tiedät tällaisen paikan, niin tiedätkö juuri samaa paikkaa kuvaavan jonkin toisen kartan, joka on sijaintitiedoltaan täsmälleen oikein. Unohdetaan satamat ja muut erikoiskohteet ja puhutaan vaan karikoista jossain tuolla kaukana joka paikasta.
Ihan ensimmäiseksi kysymys: Onko olemassa muita piirrettyjä ja painettuja karttoja meidän saaristoalueiltamme, kuin Merenkulkuhallituksen tekemiä ? Toki digitaalisia löytyy esim USAn armeijalta, mutta niistä ei ollut puhe. Jopa uusilta "sinikartoilta" löytyy useita virhepaikkoja, vaikka huhupuheiden mukaan kartat olisi tehty gps-paikannuksen ja satelliittikuvien mukaan, Kuka uskoo?!!
Kysymyksesi tosin sisältää vastauksen asiaan jota ajan takaa. Tottakai MKL:n kartoissa ja aineistoissa on paikallisia virheitä syvyystiedoissa. Mutta samat virheet ovat sitten kopioituneet kaikkien muidenkin karttatuotteiden valmistajien karttoihin. Se on vaan sitten hankalampi juttu, että kun MKL:n kartalla virhe korjataan esim. uusiin mittauksiin perustuen, niin montako vuotta kestää, ennenkuin asia korjautuu "tällaisella kopiokartalla".
Huomasin, että korjauspaketissa on useita in8-filejä. Oletko tehnyt siirrot vanhoilla in8:illa vai huomioinut korjauksen?
Vielä kerran, miten on mahdollista saada KKJ/WGS84-eron kanssa samansuuruinen virhe pohjois-eteläsuunnassa saaristomeren alueella? Tuo virhe ei voi johtua KKJ/WGS84-muunnoksista!
Sivujako on pysynyt samana iät ja ajat - entä jos vain korvaan vanhan kuvatiedoston uudella ja jätän IN8 tai MAP tiedoston entiselleen? Mahtaako toimia?
Vielä kerran, en tiedä.
Valitettavasti näin sisävesiveneilijänä en vielä ole käytännössä päässyt tutustumaan tarkemmin sinisiin karttoihin. Jos karttajako on täsmälleen entisen mukainen ja jos karttprojektio on säilynyt entisellään, niin silloin vanhan kalibrointitiedoston (.map) käyttö pitäisi onnistua Tämä siksi, että jos kartan nurkkapisteet ovat entisellä paikoillaan, niin ei niiden koordinaatitkaan ole muuttuneet. . Vanhaan map-tiedostoon voi käsin editoida esim. Windowsin Notepadilla uuden tiedostonimen. Kokeilemallahn tuo selviää, kerro meille muillekin tuloksista niin ei tarvitse turhaan spekuloida.
WGS84/KKJ muunnokissa eroa tulee sekä latitudiin että longidudiin, joten tässäkin suhteessa aineistoa näkemättä kuvauksestasi ei pysty oikein hahmottamaan mistä virhe oikein johtuu. MeriCD:n in8-tiedostossa ei ainakaan vanhassa versiossa ole kerrottu koordinaattien datumia eikä sitä, mitä kuvatiedoston pikseliä on käytetty kohdistamisessa. Vanhassa versiossa koordinaatit olivat WGS84:ssa ja kohdistuspisteinä (4 kpl) kuvan nurkat.
Jos pysytellään krouveissa tarkkuusrajoissa, niin saaristomerellähän latitudi on sama kummassakin järjestelmässä. Esimerkkipaikka Utö.
Uusissakin cd-merikartan in8-tiedostoissa koordinaatit ovat KKJ-muodossa. Niinpä tein ohjelmapätkän, joka muuttaa kaikkien kansiossa olevien in8-tiedostojen KKJ-koordinaatit WHS84:ksi.
Tämän muunnoksen jälkeen Arin tekemä gmb2bmpc tulostaa koordinaatit MAP-tiedostoon oikein, mutta Ozi ei vieläkään kalibroi karttaa kohdalleen. Syy tähän on MAP-tiedoston kohta Finland Hayford. Tein toisen ohjelman, joka muuttaa tämän tekstin WGS 84:ksi.
Ja jotta homma hoituisi helpommin, tein myös "Muunna.bat"-tiedoston, jonka ajamalla kaikki kansiossa olevat Mxxx.gmb ja Mxxx.in8 -tiedostot kääntyvät .bmp ja .MAP -tiedostoiksi käyttämällä Arin ohjelman lisäksi omia pikku ohjelmapätkiäni.
Onko Arilla jotain sitä vastaan, että luovuttaisin työkalun haluaville?
Itsekö teit sen ohjelmapätkän algoritmia myöten, joka tekee muunnoksen KKJ:sta WGS84:ään?
En tietenkään ole itse kehitellyt algoritmia, ja miksipä olisin. Eivät autovalmistajatkaan keksi pyörää uudelleen autoa suunnitellessaan.
Pyörä on standarditavaraa autoissa, mutta tuo muunnos on se oleellisin osa siinä prosessissa, minkä olet kehittänyt.
Mitäköhän nyt ajat takaa? Eihän tuo muunnokseen tarvittava algoritmi mikään valtionsalaisuus ole.
Ohjelmapätkän kirjoitin helpottaakseni karttojen konvertointia. Tarkoitukseni ei millään tavalla ollut kehuskella matemaattisilla kyvyilläni. Netistä löytyy kyllä paljon valmiita sovelluksia yksittäisten koordinaattien muuntamiseen, mutta minä halusin automatisoida muunnoksen, koska muunnettavia tiedostoja on useita kymmeniä. Juuri tämä automatisointi oli minulle se oleellisin osa, sillä minua fiksummat ovat jo kehittäneet muunnosalgoritmin jos toisenkin.
Itse ajoin MapCal 2 ohjelmalla MeriCd A, Viipuri - Helsinki. Ei minulla ainkaan mitään heittoa ollut, kun vertasin veneen plotterin seurantajälkeä läppärillä olevaan SeaClearin seurantajälkeen (Haicom 204E gps).
Näin yritin varovasti kertoa tuossa viestiketjun alkupäässä. Kaikella kunnioituksella bitinvääntäjiä kohtaan, mutta aina on mahdollista, että joku jutska jää huomioimatta ja kun matematiikasta on kyse, saattaa virhe olla joko äärettömän suuri, tai harmittavan huomaamattoman pieni.
Seaclearin Mapcal käänsi ainakin ne vanhat aivan OK, ja ihmettelisin, jos uudet eivät kääntyisi yhtälailla. (softa löytyy seaclear-kansiosta) Ajatus siitä, että merenkulkuhallitus olisi tietoisesti vaikeuttanut käännöstä tuntuu melko kaukaa haetulta, koska eivät ole edes vaivautuneet uudistamaan käyttöjärjestelmää!
Käänsin uuden A sarjan kartat M601 ja M625. Vertailin kummankin kartan alueelta yhtä koord.pistettä SC:n ja MCD:n välillä. Kun karttadatumiksi oli valittu KKJ, olivat koordinaatit samat kummassakin ohjelmassa.
Tein vastaavan testin D sarjan karttojen M701 ja M702 kanssa. Siellä M701 näytti samaa koordinaattia SC:ssä ja MCD:ssä, kun datum oli WGS84. Kartassa M702 en saanut koordinaatteja samaksi datuminkaan vaihdolla, ja totesin saman kuin Ozi, virhettä oli jopa pohjois-etelä suunnassa.
Sarja A on vuodelta 2004, sarja D vuodelta 2005 ja siinä on jo bugeja korjattu. Itse ajoin sarjalla D kesällä MCD plotterina ja aina oli trackit kohdillaan, sen vuoksi tuntuu mahdottomalta, että siinä olisi jotain virheitä.
Osaako kukaan kertoa, miksi SC:n filessä datums2.ini on kaksi riviä Finnish Nautical Chartsille, joista alempi on inaktiivinen?
Laitoin kesällä ajamani ja tallettamani trackin Högsårasta Lövön kautta Taalintehtaalle SC:ssä M702:n päälle ja metsässä meni suurimman osan aikaa riippumatta karttadatumista. MCD:ssä sama track näyttää juuri sen reitin mitä ajoin. Näyttää kepit olevan hyvin paikoillaan MCD:ssä.
Sama track-testi onnistui kartoilla M625 ja M701 SC:ssä.
Siirsin vanhat merikartat kämmentietokoneelle. Viikonloppuna trackit näyttivät olevan aivan kohdallaan koko ajan. D2005-sarjassa tuntuu todellakin olevan jotakin häikkää!
in8-tiedostoja en ole päivittänyt, todennäköisesti vaikuttaa asiaan!
Kyselisin semmoista että mistä löydän ohjelman joka kääntää meriCD:n esim.BMP muotoon? olen yrittänyt hakea mutta ei löydy. topo karttoja sain siirrettyä kännykkääni mutta en merikarttaa.Kännykässäni on tämä erinomainen mapviewGPS 2.5 s-60, joka tuntuu toimivan aika hyvin. Normaalikartan käännökset tein Oziexplorerilla ja Ogf2toolilla. Kiitoksia etukäteen jos saan hyviä vinkkejä.
Ohjelma on nimeltään gmb2bmp tai uudempi? versio gmb2bmpc, tätänykyä vaikea löytää netistä koska merenkulkulaitos uhkaili tekijää oikeusjutuilla (kuulemma) joten varsinainen jakelu lopetettiin. Sitkeästi etsimällä saattaa löytyä jostain vielä, tai hyvällä tuurilla joku jolla on k.o. ohjelma voi lähettää sen sähköpostilla...
Et varmaankaan ole kovin tarkkaan lukenut tämän viestisäikeen juttuja: tuossa vähän ylempänä on käännösvalmis lähdekoodi copypastattavaksi (Viesti Koodia nimimerkiltä Löytyy). Tuttavapiiristä varmasti löytyy joku, joka osaa sen kääntää exeksi, jos et itse satu hallitsemaan C-kielisen koodin kääntämistä komentotilassa suroitettavaksi DOS-exeksi.
Kyllä on tullut selattua mutta kun ei oikein ymmärrä
noista lähdekoodeista mitään mitä se tarkoittaa. kiitoksia kuitenkin neuvosta. tallensin sen lähdekoodin parempien päivien varaan jos vaikka joskus oppisi avaamaan sen. Onko tietoa löytyykö mistään valmiiksi avattua versiota? olisin kauhean kiitollinen.
Vertailin M725-kartan in8-tiedostoja
D2002 ja D2005 välillä longitudin ero on 122 m, latitudi heittää kartan kulmissa 245 ja 255 m. Käytetty koordinaatisto ei käy ilmi in8-tiedostosta.
D2005-korjauspaketti sisältää olemattoman korjauksen latitudiin (1m).
Näyttäisi siltä että sivujakoa on muutettu, pitänee sovittaa bmp-karttoja päällekkäin jollakin softalla.
Havaitsemani paikannusvirhe oli samaa luokkaa koordinaatiston eron kanssa.
Kulmista päätellen projektiollekin on tehty jotakin.
Ovat ilmeiseti sittenkin muuttaneet ohjelmakoodia sen verran, että käännökset Seacleariin tulee vaikeaksi! Hyvä, että huomasit. Moni kaveri olisi todennäköisesti (itse mukaan lukien) ajellut kiville, jos olisi siirrellyt vain ne kartat, joissa on muutoksia vanhaan verrattuna (olin aikeissa ladata korjaukset koneelle, kunhan olisin löytänyt sen päivitysosoitteen).
Sensijaan, että puuhastelevat tällaisten kiusantekoasioiden kanssa, laittaisivat sen käyttöliittymän sellaiseen kuntoon, että olisi edes LÄHELLÄ Seaclearin helppoutta. Siitä olisi hyötyä kaikille.
Kumpikohan tässä syyllistyy moraalittomampaan toimintaan, ne jotka ohjelmistolisenssin vastaisesti kopioivat ja asentavat ohjelman osia kokonaan toiseen toimintaympäristöön, vai ohjelmistolisenssin luovuttaja, joka pyrkii toimenpiteiullään estämään lisenssin vastaisen toiminnan. MeriCD:n karttadata ei kuitenkaan ole meidän kaikkien yhteistä omaisuutta, ja vaikka olisikin, niin on olemassa sanonta "lahjahevosen suuhun ei katsota". Hyi vaan sinulle.
Itselläni on korjaustiedostoilla käännetty sininen D701.
SC:ssä oikean alakulman lähellä long/lat risteys antaa 59N49.998 22E19.998
oik.yläk. 59N55.001 22E20.001
vas.yläk. 59N55.001 22E09.996
vas.alak. 59N49.999 22E09.999
OK, tekeehän tuo pahimmillaan 0.002 nm, mutta tuo on vähemmän, kuin ko. viivan paksuus.
725:llä on vain kaksi risteystä, mutta tarkuus samaa luokkaa. `
Mikä tässä on ongelman käytettäessä SeaClearia?
Vertailin MeriCD ja SeaClearin pisteitä ja aina tulee samat koordinaatit. Mistä ihmeestä saatte niitä eroja aikaiseksi??? MeriCd D on ajettu päivitys ennen kääntämistä SCään.
En menisi pitämään moraalisaarnoja niille jotka siirtävät _ostamastaan_ MeriCD ohjelmasta karttadatan johonkin toiseen ohjelmaan käytettäväksi. CD-Merikartan ohjelma on nimittäin malliesimerkki surkeasta käytettävyydestä, sitä voisi käyttää esimerkkinä ohjelmointikoulutuksessa "näin EI pidä ohjelmaa toteuttaa tälläiseen käyttöön".
Tuo karttadatan siirto toiseen ohjelmaan vähenisi murto-osaan nykyisestä jos tuo MeriCD:n ohjelma vaihdettasi (tehtäisi/ostettaisi uusi) johonkin toimivaan jossa on edes vähän ajateltu _käytettävyyttä_ veneessä, epäilyttää pahasti että nykyisen ohjelman tekijöiden kokemus vesillä liikkumisesta rajoittuu ruotsin/tallinnan lauttoihin matkustajina. Nykyisen ohjelman käytettävyys ei ole kunnossa edes toimiston pöydällä saati sitten liikkuvassa veneessä jos on vähänkin aallokkoa. Muutenkin surkean käyttöliittymän pilaa venekäytössä se ettei ohjelmaa voi käyttää pelkästään näppäimistöltä, hiiren käyttö heiluvassa veneessä (ja sen hiirikursorin tihrustaminen oikeaan työkalupalkin ruutuun) _EI_ ole toimiva tapa käyttää ohjelmaa vaan hallinta pitää tapahtua täysin näppäinkomennoilla.
Minä esitin nimimerkki Artsille kysymyksen, jonka voisi esittää tällaisessa vertauskuvallisessa muodossa
- kaljatehtailija huomaa, että hänen kaljasammiostaan käydään jatkuvasti yöllä pihistämässä ämpärikaupalla kaljaa. Niinpä hankkii varaston oveen paremman lukon, jota varkaat eivät kykene tiirikoimaan
- varkaat nostavat kauhean metelin, että kaljatehtailija on ryhtynyt hankalasti. Että kaljahan on hyvää, mutta koska tehtailija pakkaa sen vähittäismyyntiä varten niin typerän näköiseen pakkaukseen, etteihän sellaista kukaan kehtaa ostaa. Että siksi heillä on säilytettävä oikeus käyttää "salaa" tätä varaston takaovea!
Kuka tässä sen enempää on moralisoinut. MeriCD-ohjelman valmistaja myy raaka-aineen, jonka se on laillisesti hankkinut merenkulkulaitokselta, sellaisessa pakkauksessa, joka ei tyydytä kaikkia kuluttajia. Ei tämä asiaintila oikeuta kuluttajaa käyttämään ko. tuotetta ostohetkellä hyväksymänsä hankintalisenssin vastaiseen toimintaan. Ja jos se varastettava raaka-aine edes kopioitaisiin laillisesti hankitulta levyltä, mutta ei, se on varastettuna tavarana kiertänyt jo kädestä käteen, ja kaikki sen tietävät.
Jos näihin kaljavertauksiin mennään, niin itse pitäisi tuota MeriCD:n aineiston siirtoa toiseen ohjelmaan samana, kuin jos ostaisin kaupasta pullon kaljaa ja siirtäisin sen sisällön ennen juomista toiseen pulloon sen takia, että alkuperäinen pullo oli käytettävyydeltään käyttökelvoton...:)
Tuo kaljavertaus oli kyllä melkoinen keksintö! Heh heh.
Hanko-Jussarö on ostettu joskus ajat sitten alyttömän suolaiseen hintaan pöytäkoneelle aiheeseen tutustumista varten. Myöhemmin löytyi kirjastosta Turun ja Ahvenanmaan saaristot. Käsittääkseni kirjaston levyistä saa jopa ottaa kopiot omaan käyttöön. Tosin niitäkään ei ole, vaan kartat, ei ohjelmat, ovat kovalevylläni. Missään tapauksessa en olisi ostanut ko versioita, joten Merenkulkuhallitus ei kuitenkaan olisi saanut minulta nyhdettyä tuota yhtä "virhehankintaa" enempää rahaa. Säälittää vaan ammattilaisia, jotka joutuivat toimimaan tälläisella materiaalilla. (No nykyään tilanne on tietysti toisin.)
Seaclearin ilmestymisen jälkeen kiinnostuin asiasta sen verran, että otin ko. kartat koemielessä käyttöön.(en siis navigoi niillä, enkä käytä kaupalliseen toimintaan, enkä taloudellisesti hyödy niistä vähääkään) Ohjelma toimii niin hyvin, että voisin jopa harkita uusien karttojen ostoa, jos niistä olisi jotain hyötyä vanhoihin verrattuna. Vielä todennäköisempi ostaja olisin, jos se MeriCD olisi helpompi käyttää. Koska läppärinikin on jo melko iäkäs, niin seuraava hankinta tulee tietysti olemaan plotteri. En tiedä, paljonko Merenkulkuhallitus nettoaa niistä kartoista, mutta käsitykseni mukaan ne valmistetaan aivan muusta, kuin merenkulkuhallituksen materiaalista.
Minä ainakin olen ostanut kartat sekä paperilla että cd:llä, joten en koe tekeväni mitään väärää. Päin vastoin, saattaa olla cd-merikartan myyntiä edistävä seikka, että kartat on muunnettavissa käyttökelpoiseen ohjelmaan. Ymmärtääkseni en tee myöskään mitään laitonta, vaikka Merenkulkulaitos niin väittääkin.
Olisin tiedustellut miten toi gmb2bmpC toimii, elikä
olisiko jostain saatavilla suomenkielisiä ohjeita?
Olen yrittänyt kirjoitella komentorivissä ohjeiden mukaan siinä onnistumatta. Olisiko esim. tiedossa jokin suomenkielinen nettisivu josta ohjeet voisi kopioida? Kiitoksia etukäteen.