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.
442 lines
12 KiB
442 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.0125f
|
|
|
|
#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 14
|
|
#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 short int subid;
|
|
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
|