You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spOSMroute/mapsys/map.h

441 lines
12 KiB

/***************************************************************************
* map.h
*
* Copyright 2009 - Steffen Pohle
* steffen@gulpe.de
****************************************************************************/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _MAP_H_
#define _MAP_H_
#include <math.h>
#include <stdint.h>
#define MAP_EARTHRADIUS 6370.0
#define CALC_START(__pos, __step) (__step * floorf(__pos/__step))
#define MAP_W_REFS 8
#define MAP_W_NAMELEN 64
#define MAP_HASH_DEGFACTOR 80.0f
#define MAP_OSMWEB_DELTA 0.025f
#define MAP_LSHASHFACTOR 80
#define MAP_LSFREECNT 4096
#if defined(__MINGW32CE__) || defined(_WIN32_WCE)
#define MAP_LSSTAT_MAX 16
#else
#define MAP_LSSTAT_MAX 128
#endif
#define MAP_LSSIZE_HASH 28
#define MAP_LSSIZE_WAY 16
#define MAP_LSSIZE_WAYNODE 23
#define MAP_LSSIZE_POS 8
#define MAP_LSSIZE_AREA 12
#define MAP_LSSIZE_PLACE 21
#define MAP_LSSIZE_POI 17
#define MAP_SEARCHLINE_LEN 128
#define MAP_HASH_DEFAULTSIZE 4096
#if defined(__MINGW32CE__) || defined(_WIN32_WCE)
#define MAP_HASH_MAX 128
#else
#define MAP_HASH_MAX 4096
#endif
#define MWAY_F_oneway 0x01
#define MWAY_F_planed 0x02
#define MWAY_F_roundabout 0x04
#define MWAY_F_railway 0x08
#define MWAY_F_junction 0x10
#define MWAY_F_TEXT "oneway\nplaned\nroundabout\nrailway\njunction"
#define MS_lock 0x01
#define MS_changed 0x02
enum _map_waytype {
MWAY_highway,
MWAY_tertiary,
MWAY_railway,
MWAY_residential,
MWAY_cycleway,
MWAY_footway,
MWAY_service,
MWAY_unknown_railway,
MWAY_unknown_way,
MWAY_unknown,
MWAY_MAX
};
enum _map_areatype {
MAREA_residential,
MAREA_industrial,
MAREA_water,
MAREA_commercial,
MAREA_greenfield,
MAREA_farm,
MAREA_wood,
MAREA_land,
MAREA_military,
MAREA_building,
MAREA_campsite,
MAREA_unknown,
MAREA_ignore,
MAREA_MAX
};
enum _map_placetype {
MAP_PLACE_city,
MAP_PLACE_town,
MAP_PLACE_village,
MAP_PLACE_hamlet,
MAP_PLACE_suburb,
MAP_PLACE_unknown
};
enum _map_poitype {
MAP_POI_gasstation,
MAP_POI_parking,
MAP_POI_trainstation,
MAP_POI_busstop,
MAP_POI_restaurant,
MAP_POI_hotel,
MAP_POI_campsite,
MAP_POI_unknown
};
#include "osmroute.h"
struct map_pos {
float lon;
float lat;
};
struct map_hashpos {
int ilon;
int ilat;
};
struct map_waynode {
int pnr; // number of the point from the way
struct map_pos d; // destination (node address)
unsigned long long int d_id;
unsigned short int d_subid;
int d_pnr;
uint8_t flags; // some flags.. like permitted
};
/*
* way and area information
*/
struct map_way {
char status;
unsigned long long int id;
unsigned short int subid;
unsigned char type;
unsigned char flags;
char name[MAP_W_NAMELEN];
char ref[MAP_W_NAMELEN];
struct map_waynode *n; /* connecting ways */
int n_cnt;
struct map_pos *p; /* point data */
int p_cnt;
struct map_way *next; /* next */
char data[]; /* memory for the point data */
};
struct map_area {
char status;
unsigned long long int id;
unsigned char type;
unsigned char flags;
struct map_pos *p; /* point data */
int p_cnt;
struct map_area *prev; /* prev */
struct map_area *next; /* next */
char data[]; /* memory for the point data and name also additional data */
};
/*
* places and pois
*/
struct map_poi {
float lon;
float lat;
unsigned long long int id; /* id how it is saved in openstreetmap */
unsigned char type; /* MAP_POI_RESTAURANT, MAP_POI_HOSPITAL, MAP_POI_UNDEFINED... */
char *name;
char *additional;
struct map_poi *next;
char data[]; /* data will contain: 1.NAME, 2.ADDITIONAL_DATA (seperated by \0) */
};
struct map_place {
float lon;
float lat;
unsigned long long int id;
unsigned char type; /* MAP_P_VILLAGE, MAP_P_CITY, MAP_P_UNDEFINED... */
unsigned int population;
char *country;
char *state;
char *district;
char *name;
char *postalcode;
struct map_place *next;
char data[];
};
struct map_hash {
char status;
struct map_hashpos pos;
int wayscnt;
struct map_way *ways;
int areascnt;
struct map_area *areas;
int poiscnt;
struct map_poi *pois;
int placescnt;
struct map_place *places;
char *free; /* where is the next free datablock */
int datasize; /* how many bytes? */
char data[]; /* data itself */
};
struct map_search_data {
unsigned long long int id;
float lon;
float lat;
char name[MAP_SEARCHLINE_LEN];
char country[MAP_SEARCHLINE_LEN];
};
#define MHLOAD_NONE 0
#define MHLOAD_RELOAD 1
struct map_lshentry {
uint32_t ways;
uint32_t areas;
uint32_t pois;
uint32_t places;
uint32_t pcnt;
uint32_t ncnt;
uint32_t ccnt; /* size of all text based data (including '0') */
};
struct map_lshmap {
uint64_t pos;
uint32_t size;
};
/*
* as soon as we have different r_fd and w_fd the filename will
* be the one from the orginal file
*/
struct map_lsstat {
char fname[LEN_FILENAME];
char fnametmp[LEN_FILENAME];
struct map_lshmap r_lshpos[MAP_LSHASHFACTOR*MAP_LSHASHFACTOR]; /* size of array is always MAP_LSHASHFACTOR*MAP_LSHASHFACTOR */
struct map_lshmap w_lshpos[MAP_LSHASHFACTOR*MAP_LSHASHFACTOR]; /* size of array is always MAP_LSHASHFACTOR*MAP_LSHASHFACTOR */
struct map_lshmap w_free[MAP_LSFREECNT]; /* data where we handle the free datablocks */
int r_fd; /* read filedescriptor */
int w_fd; /* write filedescriptor */
int changed;
};
extern struct map_hash **mhash;
extern int mhash_max; // currently allocated entrys
extern int mhash_pos;
extern struct map_lsstat *mlsstat;
// extern unsigned long long int selected_way_id;
// extern unsigned short int selected_way_sid;
// extern struct map_pos selected_way_pos[2];
// extern char selected_way_name[MAP_W_NAMELEN];
/*
* some calculations
*/
extern float map_lon2km (float lon, float lat);
extern float map_lat2km (float lat);
extern float map_km2lon (float km, float lat);
extern float map_km2lat (float km);
extern int map_text2geo (char *text, float *dest);
extern int map_geo2igeo (float f);
extern float map_igeo2geo (int i);
extern struct map_hashpos map_pos2ipos (struct map_pos pos);
extern float map_getdistance (struct map_pos p1, struct map_pos p2);
/*
* general map functions
*/
extern void map_init ();
extern void map_clear (); // free the used memory
extern void map_debug ();
/*
* hash handling
*/
extern struct map_hash *map_hash_alloc (int memsize); // alloc memory for the hash
extern struct map_hash *map_hash_realloc (struct map_hash *mhorg, int memsize); // realloc hash memory and copy data into it
extern void map_hash_copy (struct map_hash *mhdest,struct map_hash *mhsrc);
extern int map_hash_calc_size (int ways, int areas, int pois, int places, int pcnt, int ncnt, int ccnt);
extern struct map_hash *map_hash_geti (int ilon, int ilat, int loadflags);
extern struct map_hash *map_hash_get (float lon, float lat, int loadflags);
extern int map_hash_add (struct map_hash *mh); // add/update hash
extern void map_hash_free (struct map_hash *mh, int noremove); // save and remove hash from memory (also delete from list)
extern int map_hash_getfree_size (struct map_hash *mh);
extern void *map_hash_getfree_aligned (struct map_hash *mh, int align);
extern int map_hash_countways (struct map_hash *mh);
extern int map_hash_countareas (struct map_hash *mh);
/*
* load / save from the data dir
*/
extern struct map_hash *map_load_hash (int ilon, int ilat);
extern void map_save_all ();
extern int map_save_hash (struct map_hash *mh);
extern void map_ls_rwdatacheck (int size);
extern void map_ls_get_filename_only (char *fn, int len, int ilon, int ilat);
extern void map_ls_get_filename (char *fn, int len, int ilon, int ilat);
extern struct map_lsstat *map_ls_statopen (char *fname);
extern struct map_lsstat *map_ls_statget (char *fname);
extern void map_ls_statclose (struct map_lsstat *lsstat);
extern char *map_ls_loaddata (struct map_lsstat *lsstat, int *size, int ilon, int ilat);
extern void map_ls_savedata (struct map_lsstat *lsstat, char *data, int size, int ilon, int ilat);
extern char *map_ls_hash2data (struct map_hash *mh, int *size);
extern struct map_hash *map_ls_data2hash (char *data, int size);
extern void map_defragfile (char *fn);
extern void map_defrag ();
/*
* load data from file / web
*/
extern void osm_loadfile (char *fn);
extern void map_load_web (struct map_pos hs, struct map_pos he);
extern void map_load_setview ();
extern int map_webload (char *remotefn, char *localfn, char *statustext);
extern void map_refresh (float lon, float lat);
extern void map_refreshblock (struct map_pos start, struct map_pos end, float delta);
/*
* way/node with the givin ID
*/
extern struct map_way *map_way_find (struct map_hash *mh, unsigned long long int id, unsigned short int subid);
extern void map_way_copy (struct map_way *dest, struct map_way *src);
extern int map_way_add (struct map_way *way, int loadflags);
extern int map_way_add_to_hash (struct map_hash *mh, struct map_way *mw);
extern int map_way_getsize (struct map_way *way);
extern int map_way_findclosest (struct map_pos *pos, struct map_pos *waypos, int idh, char *name, int namelen, unsigned long long int *closest_id, unsigned short int *closest_sid);
extern float map_way_getdistance (struct map_way *mw, struct map_pos *pos, struct map_pos *waypos);
extern float map_way_getlenght (struct map_way *mw, int start, int end);
extern int map_way_checkref (char *ref1, char *ref2);
/*
* find the area/node with the givin ID
*/
extern struct map_area *map_area_find (struct map_hash *mh, unsigned long long int id);
extern void map_area_copy (struct map_area *dest, struct map_area *src);
extern int map_area_add (struct map_area *area, int loadflags);
extern int map_area_add_to_hash (struct map_hash *mh, struct map_area *ma);
extern int map_area_getsize (struct map_area *area);
/*
* pois and places
*/
extern void map_place_copy (struct map_place *dest, struct map_place *src);
extern int map_place_add (struct map_place *place, int loadflags);
extern int map_place_add_to_hash (struct map_hash *mh, struct map_place *place);
extern int map_place_getsize (struct map_place *place);
extern void map_poi_copy (struct map_poi *dest, struct map_poi *src);
extern int map_poi_add (struct map_poi *poi, int loadflags);
extern int map_poi_add_to_hash (struct map_hash *mh, struct map_poi *poi);
extern int map_poi_getsize (struct map_poi *poi);
/*
* debugging functions
*/
extern void map_way_print (struct map_way *mw);
/*
* searching stuff
*/
extern void map_search_add (char *country, char *name, unsigned long long int id, float lon, float lat);
extern int map_search (char *name, struct map_search_data *data, int datasize);
extern void map_search_init ();
extern void map_search_get_filename (char *fn, int len);
extern void map_search_sort ();
/*
* for statistics or other informations.
*/
extern unsigned long long int osm_cur_wayid;
extern unsigned long long int osm_ways_cnt;
extern unsigned long long int osm_nodes_cnt;
extern float osm_file_pos;
extern struct map_pos osm_load_from_web_cur;
extern struct map_pos osm_load_from_web_start;
extern struct map_pos osm_load_from_web_end;
#ifdef HAVE_NCURSES
void osm_convert_info ();
#endif
#endif