static void gpkgMakePoint (double x, double y, int srid, unsigned char **result, unsigned int *size) { /* build a Blob encoded Geometry representing a POINT */ unsigned char *ptr; int endian_arch = gaiaEndianArch (); /* computing the Blob size and then allocating it */ *size = GEOPACKAGE_HEADER_LEN + GEOPACKAGE_2D_ENVELOPE_LEN; *size += GEOPACKAGE_WKB_HEADER_LEN; *size += (sizeof (double) * 2); /* [x,y] coords */ *result = malloc (*size); if (*result == NULL) { return; } memset (*result, 0xD9, *size); ptr = *result; /* setting the Blob value */ gpkgSetHeader2DLittleEndian (ptr, srid, endian_arch); gpkgSetHeader2DMbr (ptr + GEOPACKAGE_HEADER_LEN, x, y, x, y, endian_arch); *(ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_2D_ENVELOPE_LEN) = GEOPACKAGE_WKB_LITTLEENDIAN; gaiaExport32 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_2D_ENVELOPE_LEN + 1, GEOPACKAGE_WKB_POINT, 1, endian_arch); gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_2D_ENVELOPE_LEN + GEOPACKAGE_WKB_HEADER_LEN, x, 1, endian_arch); gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_2D_ENVELOPE_LEN + GEOPACKAGE_WKB_HEADER_LEN + sizeof (double), y, 1, endian_arch); }
static void gpkgMakePointZM (double x, double y, double z, double m, int srid, unsigned char **result, unsigned int *size) { /* build a Blob encoded Geometry representing a POINT */ unsigned char *ptr; int endian_arch = gaiaEndianArch (); /* computing the Blob size and then allocating it */ *size = GEOPACKAGE_HEADER_LEN + GEOPACKAGE_4D_ENVELOPE_LEN; *size += GEOPACKAGE_WKB_HEADER_LEN; *size += (sizeof (double) * 4); /* [x,y,z,m] coords */ *result = malloc (*size); if (*result == NULL) { return; } memset (*result, 0xD9, *size); /* just a flag value */ ptr = *result; /* setting the Blob value */ *ptr = GEOPACKAGE_MAGIC1; *(ptr + 1) = GEOPACKAGE_MAGIC2; *(ptr + 2) = GEOPACKAGE_VERSION; *(ptr + 3) = GEOPACKAGE_FLAGS_3DM_LITTLEENDIAN; gaiaExport32 (ptr + 4, srid, 1, endian_arch); /* the SRID */ gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN, x, 1, endian_arch); /* MBR - minimum X */ gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 1 * sizeof (double), x, 1, endian_arch); /* MBR - maximum X */ gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 2 * sizeof (double), y, 1, endian_arch); /* MBR - minimum Y */ gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 3 * sizeof (double), y, 1, endian_arch); /* MBR - maximum Y */ gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 4 * sizeof (double), z, 1, endian_arch); /* MBR - minimum Z */ gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 5 * sizeof (double), z, 1, endian_arch); /* MBR - maximum Z */ gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 6 * sizeof (double), m, 1, endian_arch); /* MBR - minimum M */ gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + 7 * sizeof (double), m, 1, endian_arch); /* MBR - maximum M */ *(ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_4D_ENVELOPE_LEN) = GEOPACKAGE_WKB_LITTLEENDIAN; gaiaExport32 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_4D_ENVELOPE_LEN + 1, GEOPACKAGE_WKB_POINTZM, 1, endian_arch); gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_4D_ENVELOPE_LEN + GEOPACKAGE_WKB_HEADER_LEN, x, 1, endian_arch); gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_4D_ENVELOPE_LEN + GEOPACKAGE_WKB_HEADER_LEN + sizeof (double), y, 1, endian_arch); gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_4D_ENVELOPE_LEN + GEOPACKAGE_WKB_HEADER_LEN + (2 * sizeof (double)), z, 1, endian_arch); gaiaExport64 (ptr + GEOPACKAGE_HEADER_LEN + GEOPACKAGE_4D_ENVELOPE_LEN + GEOPACKAGE_WKB_HEADER_LEN + (3 * sizeof (double)), m, 1, endian_arch); }
bool MyFrame::CreateNetwork(Network * p_graph, wxString & table, wxString & from, wxString & to, wxString & geometry, wxString & name, bool aStarSupported, double aStarCoeff) { // // creates the NETWORK-DATA table // int ret; wxString sql; char xsql[1024]; char *errMsg = NULL; unsigned char *auxbuf = new unsigned char[MAX_BLOCK]; unsigned char *buf = new unsigned char[MAX_BLOCK]; unsigned char *out; sqlite3_stmt *stmt; int i; int size; int endian_arch = gaiaEndianArch(); NetNode *pN; int pk = 0; int nodes_cnt = 0; int len; bool net_data_exists = false; bool net_exists = false; bool delete_existing = false; char xname[1024]; wxString data_table = table + wxT("_net_data"); wxString net_table = table + wxT("_net"); net_data_exists = TableAlreadyExists(data_table); net_exists = TableAlreadyExists(net_table); if (net_data_exists == true || net_exists == true) { // asking permission to overwrite existing tables wxString msg; if (net_data_exists == true) msg += wxT("A table named '") + data_table + wxT("' already exists\n"); if (net_exists == true) msg += wxT("A table named '") + net_table + wxT("' already exists\n"); msg += wxT("\nDo you allow DROPping existing table(s) ?"); wxMessageDialog confirm(this, msg, wxT("Confirm overwrite"), wxYES_NO | wxICON_QUESTION); ret = confirm.ShowModal(); if (ret == wxID_YES) delete_existing = true; } ::wxBeginBusyCursor(); for (i = 0; i < p_graph->GetNumNodes(); i++) { // setting the internal index to each Node pN = p_graph->GetSortedNode(i); pN->SetInternalIndex(i); } // starts a transaction ret = sqlite3_exec(SqliteHandle, "BEGIN", NULL, NULL, &errMsg); if (ret != SQLITE_OK) { wxMessageBox(wxT("BEGIN error: ") + wxString::FromUTF8(errMsg), wxT("spatialite_gui"), wxOK | wxICON_ERROR, this); sqlite3_free(errMsg); goto abort; } if (delete_existing == true) { strcpy(xname, net_table.ToUTF8()); DoubleQuotedSql(xname); sql = wxT("DROP TABLE IF EXISTS ") + wxString::FromUTF8(xname); strcpy(xsql, sql.ToUTF8()); ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg); if (ret != SQLITE_OK) { wxMessageBox(wxT("DROP TABLE error: ") + wxString::FromUTF8(errMsg), wxT("spatialite_gui"), wxOK | wxICON_ERROR, this); sqlite3_free(errMsg); goto abort; } strcpy(xname, data_table.ToUTF8()); DoubleQuotedSql(xname); sql = wxT("DROP TABLE IF EXISTS ") + wxString::FromUTF8(xname); strcpy(xsql, sql.ToUTF8()); ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg); if (ret != SQLITE_OK) { wxMessageBox(wxT("DROP TABLE error: ") + wxString::FromUTF8(errMsg), wxT("spatialite_gui"), wxOK | wxICON_ERROR, this); sqlite3_free(errMsg); goto abort; } } // creating the NETWORK-DATA table strcpy(xname, data_table.ToUTF8()); DoubleQuotedSql(xname); sql = wxT("CREATE TABLE ") + wxString::FromUTF8(xname); sql += wxT(" (Id INTEGER PRIMARY KEY, NetworkData BLOB NOT NULL)"); strcpy(xsql, sql.ToUTF8()); ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg); if (ret != SQLITE_OK) { wxMessageBox(wxT("CREATE TABLE error: ") + wxString::FromUTF8(errMsg), wxT("spatialite_gui"), wxOK | wxICON_ERROR, this); sqlite3_free(errMsg); goto abort; } // preparing the SQL statement strcpy(xname, data_table.ToUTF8()); DoubleQuotedSql(xname); sql = wxT("INSERT INTO ") + wxString::FromUTF8(xname) + wxT(" (Id, NetworkData) VALUES (?, ?)"); strcpy(xsql, sql.ToUTF8()); ret = sqlite3_prepare_v2(SqliteHandle, xsql, strlen(xsql), &stmt, NULL); if (ret != SQLITE_OK) { wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); wxMessageBox(wxT("INSERT error: ") + err, wxT("spatialite_gui"), wxOK | wxICON_ERROR, this); goto abort; } if (pk == 0) { // preparing the HEADER block out = buf; if (aStarSupported) *out++ = GAIA_NET64_A_STAR_START; else *out++ = GAIA_NET64_START; *out++ = GAIA_NET_HEADER; gaiaExport32(out, p_graph->GetNumNodes(), 1, endian_arch); // how many Nodes are there out += 4; if (p_graph->IsNodeCode() == true) *out++ = GAIA_NET_CODE; // Nodes are identified by a TEXT code else *out++ = GAIA_NET_ID; // Nodes are identified by an INTEGER id if (p_graph->IsNodeCode() == true) *out++ = p_graph->GetMaxCodeLength(); // max TEXT code length else *out++ = 0x00; // inserting the main Table name *out++ = GAIA_NET_TABLE; len = table.Len() + 1; gaiaExport16(out, len, 1, endian_arch); // the Table Name length, including last '\0' out += 2; memset(out, '\0', len); strcpy((char *) out, table.ToUTF8()); out += len; // inserting the NodeFrom column name *out++ = GAIA_NET_FROM; len = from.Len() + 1; gaiaExport16(out, len, 1, endian_arch); // the NodeFrom column Name length, including last '\0' out += 2; memset(out, '\0', len); strcpy((char *) out, from.ToUTF8()); out += len; // inserting the NodeTo column name *out++ = GAIA_NET_TO; len = to.Len() + 1; gaiaExport16(out, len, 1, endian_arch); // the NodeTo column Name length, including last '\0' out += 2; memset(out, '\0', len); strcpy((char *) out, to.ToUTF8()); out += len; // inserting the Geometry column name *out++ = GAIA_NET_GEOM; len = geometry.Len() + 1; gaiaExport16(out, len, 1, endian_arch); // the Geometry column Name length, including last '\0' out += 2; memset(out, '\0', len); strcpy((char *) out, geometry.ToUTF8()); out += len; // inserting the Name column name - may be empty *out++ = GAIA_NET_NAME; if (name.Len() == 0) len = 1; else len = name.Len() + 1; gaiaExport16(out, len, 1, endian_arch); // the Name column Name length, including last '\0' out += 2; memset(out, '\0', len); if (name.Len() > 0) strcpy((char *) out, name.ToUTF8()); out += len; if (aStarSupported) { // inserting the A* Heuristic Coeff *out++ = GAIA_NET_A_STAR_COEFF; gaiaExport64(out, aStarCoeff, 1, endian_arch); out += 8; } *out++ = GAIA_NET_END; // INSERTing the Header block sqlite3_reset(stmt); sqlite3_clear_bindings(stmt); sqlite3_bind_int64(stmt, 1, pk); sqlite3_bind_blob(stmt, 2, buf, out - buf, SQLITE_STATIC); ret = sqlite3_step(stmt); if (ret == SQLITE_DONE || ret == SQLITE_ROW) ; else { wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); wxMessageBox(wxT("sqlite3_step error: ") + err, wxT("spatialite_gui"), wxOK | wxICON_ERROR, this); sqlite3_finalize(stmt); goto abort; } pk++; // preparing a new block out = buf; *out++ = GAIA_NET_BLOCK; gaiaExport16(out, 0, 1, endian_arch); // how many Nodes are into this block out += 2; nodes_cnt = 0; } for (i = 0; i < p_graph->GetNumNodes(); i++) { // looping on each Node pN = p_graph->GetSortedNode(i); OutputNetNode(auxbuf, &size, i, p_graph->IsNodeCode(), p_graph->GetMaxCodeLength(), pN, endian_arch, aStarSupported); if (size >= (MAX_BLOCK - (out - buf))) { // inserting the last block gaiaExport16(buf + 1, nodes_cnt, 1, endian_arch); // how many Nodes are into this block sqlite3_reset(stmt); sqlite3_clear_bindings(stmt); sqlite3_bind_int64(stmt, 1, pk); sqlite3_bind_blob(stmt, 2, buf, out - buf, SQLITE_STATIC); ret = sqlite3_step(stmt); if (ret == SQLITE_DONE || ret == SQLITE_ROW) ; else { wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); wxMessageBox(wxT("sqlite3_step error: ") + err, wxT("spatialite_gui"), wxOK | wxICON_ERROR, this); sqlite3_finalize(stmt); goto abort; } pk++; // preparing a new block out = buf; *out++ = GAIA_NET_BLOCK; gaiaExport16(out, 0, 1, endian_arch); // how many Nodes are into this block out += 2; nodes_cnt = 0; } // inserting the current Node into the block nodes_cnt++; memcpy(out, auxbuf, size); out += size; } if (nodes_cnt) { // inserting the last block gaiaExport16(buf + 1, nodes_cnt, 1, endian_arch); // how many Nodes are into this block sqlite3_reset(stmt); sqlite3_clear_bindings(stmt); sqlite3_bind_int64(stmt, 1, pk); sqlite3_bind_blob(stmt, 2, buf, out - buf, SQLITE_STATIC); ret = sqlite3_step(stmt); if (ret == SQLITE_DONE || ret == SQLITE_ROW) ; else { wxString err = wxString::FromUTF8(sqlite3_errmsg(SqliteHandle)); wxMessageBox(wxT("sqlite3_step error: ") + err, wxT("spatialite_gui"), wxOK | wxICON_ERROR, this); sqlite3_finalize(stmt); goto abort; } } sqlite3_finalize(stmt); // creating the VirtualNetwork NET-table strcpy(xname, net_table.ToUTF8()); DoubleQuotedSql(xname); sql = wxT("CREATE VIRTUAL TABLE ") + wxString::FromUTF8(xname); sql += wxT(" USING VirtualNetwork("); strcpy(xname, data_table.ToUTF8()); DoubleQuotedSql(xname); sql += wxString::FromUTF8(xname) + wxT(")"); strcpy(xsql, sql.ToUTF8()); ret = sqlite3_exec(SqliteHandle, xsql, NULL, NULL, &errMsg); if (ret != SQLITE_OK) { wxMessageBox(wxT("CREATE VIRTUAL TABLE error: ") + wxString::FromUTF8(errMsg), wxT("spatialite_gui"), wxOK | wxICON_ERROR, this); sqlite3_free(errMsg); goto abort; } // commits the transaction ret = sqlite3_exec(SqliteHandle, "COMMIT", NULL, NULL, &errMsg); if (ret != SQLITE_OK) { wxMessageBox(wxT("COMMIT error: ") + wxString::FromUTF8(errMsg), wxT("spatialite_gui"), wxOK | wxICON_ERROR, this); sqlite3_free(errMsg); goto abort; } if (buf) delete[]buf; if (auxbuf) delete[]auxbuf; ::wxEndBusyCursor(); return true; abort: ::wxEndBusyCursor(); if (buf) delete[]buf; if (auxbuf) delete[]auxbuf; return true; return false; }