forked from ExternalVendorCode/Signal-Server
3.09 Meridian
This commit is contained in:
@@ -1,5 +1,8 @@
|
|||||||
SIGNAL SERVER CHANGELOG
|
SIGNAL SERVER CHANGELOG
|
||||||
|
|
||||||
|
3.09 - 7 Feb 2018
|
||||||
|
Meridian LIDAR cropping fix
|
||||||
|
|
||||||
3.08 - 17 Dec 2017
|
3.08 - 17 Dec 2017
|
||||||
Proper fix for nearfield void
|
Proper fix for nearfield void
|
||||||
More LIDAR edge cases: 1x2, 2x1...
|
More LIDAR edge cases: 1x2, 2x1...
|
||||||
|
28
inputs.cc
28
inputs.cc
@@ -166,6 +166,7 @@ int loadLIDAR(char *filenames, int resample)
|
|||||||
double TO_DEG = (180 / PI);
|
double TO_DEG = (180 / PI);
|
||||||
FILE *fd;
|
FILE *fd;
|
||||||
tile_t *tiles;
|
tile_t *tiles;
|
||||||
|
int eastF=0,westF=0; //flags for meridian fix
|
||||||
|
|
||||||
// test for multiple files
|
// test for multiple files
|
||||||
filename = strtok(filenames, " ,");
|
filename = strtok(filenames, " ,");
|
||||||
@@ -216,9 +217,15 @@ int loadLIDAR(char *filenames, int resample)
|
|||||||
|
|
||||||
if (tiles[indx].max_west > max_west)
|
if (tiles[indx].max_west > max_west)
|
||||||
max_west = tiles[indx].max_west;
|
max_west = tiles[indx].max_west;
|
||||||
|
|
||||||
if (tiles[indx].min_west < min_west)
|
if (tiles[indx].min_west < min_west)
|
||||||
min_west = tiles[indx].min_west;
|
min_west = tiles[indx].min_west;
|
||||||
|
|
||||||
|
if (tiles[indx].max_west > 358.0)
|
||||||
|
eastF=1;
|
||||||
|
if (tiles[indx].max_west < 2.0)
|
||||||
|
westF=1;
|
||||||
|
|
||||||
if (max_west == -1) {
|
if (max_west == -1) {
|
||||||
max_west = tiles[indx].max_west;
|
max_west = tiles[indx].max_west;
|
||||||
} else {
|
} else {
|
||||||
@@ -245,6 +252,16 @@ int loadLIDAR(char *filenames, int resample)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Meridian fix
|
||||||
|
if(eastF && westF){
|
||||||
|
max_west=0; //reset
|
||||||
|
for (indx = 0; indx < fc; indx++) {
|
||||||
|
if(tiles[indx].max_west<2.0 && tiles[indx].max_west > max_west)
|
||||||
|
max_west=tiles[indx].max_west;
|
||||||
|
}
|
||||||
|
max_west*=1.0; // WGS84 to westing. -1.5 = 1.5
|
||||||
|
|
||||||
|
}
|
||||||
/* Iterate through all of the tiles to find the smallest resolution. We will
|
/* Iterate through all of the tiles to find the smallest resolution. We will
|
||||||
* need to rescale every tile from here on out to this value */
|
* need to rescale every tile from here on out to this value */
|
||||||
float smallest_res = 0;
|
float smallest_res = 0;
|
||||||
@@ -278,16 +295,21 @@ int loadLIDAR(char *filenames, int resample)
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Now we work out the size of the giant lidar tile. */
|
/* Now we work out the size of the giant lidar tile. */
|
||||||
double total_width = max_west - min_west >= 0 ? max_west - min_west : max_west + (360 - min_west);
|
double total_width = max_west - min_west >= 0 ? max_west - min_west : max_west + (360 - min_west);
|
||||||
double total_height = max_north - min_north;
|
double total_height = max_north - min_north;
|
||||||
if (debug) {
|
if (debug) {
|
||||||
fprintf(stderr,"totalh: %.7f - %.7f = %.7f totalw: %.7f - %.7f = %.7f fc: %d\n", max_north, min_north, total_height, max_west, min_west, total_width,fc);
|
fprintf(stderr,"totalh: %.7f - %.7f = %.7f totalw: %.7f - %.7f = %.7f fc: %d\n", max_north, min_north, total_height, max_west, min_west, total_width,fc);
|
||||||
fprintf(stderr,"mw:%lf Mnw:%lf\n", max_west, min_west);
|
fprintf(stderr,"mw:%lf Mnw:%lf\n", max_west, min_west);
|
||||||
|
//exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
//detect problematic layouts eg. vertical rectangles
|
//detect problematic layouts eg. vertical rectangles
|
||||||
// 1x2
|
// 1x2
|
||||||
if(fc == 2 && desired_resolution < 28 && total_height > total_width){
|
if(fc >= 2 && desired_resolution < 28 && total_height > total_width*1.2){
|
||||||
tiles[fc].max_north=max_north;
|
tiles[fc].max_north=max_north;
|
||||||
tiles[fc].min_north=min_north;
|
tiles[fc].min_north=min_north;
|
||||||
westoffset=westoffset-(total_height-total_width); // WGS84 for stdout only
|
westoffset=westoffset-(total_height-total_width); // WGS84 for stdout only
|
||||||
@@ -304,11 +326,11 @@ int loadLIDAR(char *filenames, int resample)
|
|||||||
//calculate deficit
|
//calculate deficit
|
||||||
|
|
||||||
if (debug) {
|
if (debug) {
|
||||||
fprintf(stderr,"deficit: %.4f cellsize: %.9f tiles needed to square: %.1f\n", total_width-total_height,avgCellsize,(total_width-total_height)/avgCellsize);
|
fprintf(stderr,"deficit: %.4f cellsize: %.9f tiles needed to square: %.1f, desired_resolution %d\n", total_width-total_height,avgCellsize,(total_width-total_height)/avgCellsize,desired_resolution);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 2x1
|
// 2x1
|
||||||
if(fc == 2 && desired_resolution < 28 && total_width > total_height){
|
if(fc >= 2 && desired_resolution < 28 && total_width > total_height*1.2){
|
||||||
tiles[fc].max_north=max_north+(total_width-total_height);
|
tiles[fc].max_north=max_north+(total_width-total_height);
|
||||||
tiles[fc].min_north=max_north;
|
tiles[fc].min_north=max_north;
|
||||||
tiles[fc].max_west=max_west; // Positive westing
|
tiles[fc].max_west=max_west; // Positive westing
|
||||||
|
60
main.cc
60
main.cc
@@ -1,4 +1,4 @@
|
|||||||
double version = 3.08;
|
double version = 3.09;
|
||||||
/****************************************************************************\
|
/****************************************************************************\
|
||||||
* Signal Server: Radio propagation simulator by Alex Farrant QCVS, 2E0TDW *
|
* Signal Server: Radio propagation simulator by Alex Farrant QCVS, 2E0TDW *
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
@@ -48,7 +48,7 @@ double earthradius, max_range = 0.0, forced_erp, dpp, ppd, yppd,
|
|||||||
fzone_clearance = 0.6, forced_freq, clutter, lat, lon, txh, tercon, terdic,
|
fzone_clearance = 0.6, forced_freq, clutter, lat, lon, txh, tercon, terdic,
|
||||||
north, east, south, west, dBm, loss, field_strength,
|
north, east, south, west, dBm, loss, field_strength,
|
||||||
min_north = 90, max_north = -90, min_west = 360, max_west = -1, westoffset=180, eastoffset=-180, delta=0, rxGain=0,
|
min_north = 90, max_north = -90, min_west = 360, max_west = -1, westoffset=180, eastoffset=-180, delta=0, rxGain=0,
|
||||||
cropLat=-70, cropLon=0;
|
cropLat=-70, cropLon=0,cropLonNeg=0;
|
||||||
|
|
||||||
int ippd, mpi,
|
int ippd, mpi,
|
||||||
max_elevation = -32768, min_elevation = 32768, bzerror, contour_threshold,
|
max_elevation = -32768, min_elevation = 32768, bzerror, contour_threshold,
|
||||||
@@ -1714,13 +1714,26 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
ppd=(double) (height / (max_north-min_north));
|
ppd=(double) (height / (max_north-min_north));
|
||||||
yppd=(double) (width / (max_west-min_west));
|
|
||||||
|
|
||||||
|
//Meridian hack
|
||||||
|
if(max_west < 2 && min_west > 358){
|
||||||
|
//yppd=(double) (width / (max_west+(360.0-min_west)));
|
||||||
|
yppd=ppd;
|
||||||
|
}else{
|
||||||
|
yppd=(double) (width / (max_west-min_west));
|
||||||
|
}
|
||||||
|
|
||||||
if(debug){
|
if(debug){
|
||||||
fprintf(stderr,"ppd %lf, yppd %lf, %.4f,%.4f,%.4f,%.4f,%d x %d\n",ppd,yppd,max_north,min_west,min_north,max_west,width,height);
|
fprintf(stderr,"ppd %lf, yppd %lf, %.4f,%.4f,%.4f,%.4f,%d x %d\n",ppd,yppd,max_north,min_west,min_north,max_west,width,height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(yppd<ppd/4){
|
||||||
|
fprintf(stderr,"yppd is bad! Check longitudes\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(delta>0){
|
if(delta>0){
|
||||||
@@ -1831,7 +1844,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ppd=(double)ippd;
|
ppd=(double)ippd;
|
||||||
yppd=ppd;
|
//yppd=ppd;
|
||||||
|
|
||||||
width = (unsigned)(ippd * ReduceAngle(max_west - min_west));
|
width = (unsigned)(ippd * ReduceAngle(max_west - min_west));
|
||||||
height = (unsigned)(ippd * ReduceAngle(max_north - min_north));
|
height = (unsigned)(ippd * ReduceAngle(max_north - min_north));
|
||||||
@@ -1886,25 +1899,26 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(cropping){
|
if(cropping){
|
||||||
// CROPPING. croplat assigned in propPathLoss()
|
// CROPPING. Factor is determined in propPathLoss().
|
||||||
max_north=cropLat; // MAX(path.lat[y])
|
// cropLon is the circle radius in pixels at it's widest (east/west)
|
||||||
// Edge case #1 - EAST/WEST
|
cropLon*=dpp; // pixels to degrees
|
||||||
if(cropLon>357 && tx_site[0].lon < 3)
|
max_north=cropLat; // degrees
|
||||||
cropLon=tx_site[0].lon+3;
|
max_west=cropLon+tx_site[0].lon; // degrees west (positive)
|
||||||
// Edge case #2 - EAST/EAST
|
|
||||||
if(cropLon>359.5 && tx_site[0].lon > 359.5)
|
|
||||||
cropLon=362;
|
|
||||||
max_west=cropLon; // MAX(path.lon[y])
|
|
||||||
cropLat-=tx_site[0].lat; // angle from tx to edge
|
cropLat-=tx_site[0].lat; // angle from tx to edge
|
||||||
cropLon-=tx_site[0].lon;
|
|
||||||
width=(int)((cropLon*ppd)*2);
|
|
||||||
height=(int)((cropLat*ppd)*2);
|
|
||||||
cropping = true;
|
|
||||||
|
|
||||||
if(width>3600*10){
|
|
||||||
fprintf(stderr,"FATAL BOUNDS! max_west: %.4f cropLat: %.4f cropLon: %.4f longitude: %.5f\n",max_west,cropLat,cropLon,tx_site[0].lon);
|
if(debug)
|
||||||
return 0;
|
fprintf(stderr,"Cropping 1: max_west: %.4f cropLat: %.4f cropLon: %.4f longitude: %.5f dpp %.7f\n",max_west,cropLat,cropLon,tx_site[0].lon,dpp);
|
||||||
}
|
width=(int)((cropLon*ppd)*2);
|
||||||
|
height=(int)((cropLat*ppd)*2);
|
||||||
|
|
||||||
|
if(debug)
|
||||||
|
fprintf(stderr,"Cropping 2: max_west: %.4f cropLat: %.4f cropLon: %.7f longitude: %.5f width %d\n",max_west,cropLat,cropLon,tx_site[0].lon,width);
|
||||||
|
|
||||||
|
if(width>3600*10 || cropLon < 0){
|
||||||
|
fprintf(stderr,"FATAL BOUNDS! max_west: %.4f cropLat: %.4f cropLon: %.7f longitude: %.5f\n",max_west,cropLat,cropLon,tx_site[0].lon);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write bitmap
|
// Write bitmap
|
||||||
@@ -1918,10 +1932,10 @@ int main(int argc, char *argv[])
|
|||||||
if( (result = DoSigStr(mapfile, geo, kml, ngs, tx_site,txsites)) != 0 )
|
if( (result = DoSigStr(mapfile, geo, kml, ngs, tx_site,txsites)) != 0 )
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
if(lidar){
|
/*if(lidar){
|
||||||
east=eastoffset;
|
east=eastoffset;
|
||||||
west=westoffset;
|
west=westoffset;
|
||||||
}
|
}*/
|
||||||
|
|
||||||
if (tx_site[0].lon > 0.0){
|
if (tx_site[0].lon > 0.0){
|
||||||
tx_site[0].lon *= -1;
|
tx_site[0].lon *= -1;
|
||||||
|
@@ -687,8 +687,12 @@ void PlotPropPath(struct site source, struct site destination,
|
|||||||
if(path.lat[y]>cropLat)
|
if(path.lat[y]>cropLat)
|
||||||
cropLat=path.lat[y];
|
cropLat=path.lat[y];
|
||||||
|
|
||||||
if(path.lon[y]>cropLon)
|
|
||||||
cropLon=path.lon[y];
|
if(y>cropLon)
|
||||||
|
cropLon=y;
|
||||||
|
|
||||||
|
//if(cropLon>180)
|
||||||
|
// cropLon-=360;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlotLOSMap(struct site source, double altitude, char *plo_filename,
|
void PlotLOSMap(struct site source, double altitude, char *plo_filename,
|
||||||
|
@@ -109,11 +109,11 @@ void DoPathLoss(char *filename, unsigned char geo, unsigned char kml,
|
|||||||
((double)dem[indx].max_west,
|
((double)dem[indx].max_west,
|
||||||
lon)));
|
lon)));
|
||||||
// fix for multi-tile lidar
|
// fix for multi-tile lidar
|
||||||
if(width==10000 && (indx==1 || indx==3)){
|
/* if(width==10000 && (indx==1 || indx==3)){
|
||||||
if(y0 >= 3432){ //3535
|
if(y0 >= 3432){ //3535
|
||||||
y0=y0-3432;
|
y0=y0-3432;
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
|
|
||||||
if (x0 >= 0 && x0 <= mpi && y0 >= 0
|
if (x0 >= 0 && x0 <= mpi && y0 >= 0
|
||||||
@@ -350,12 +350,12 @@ int DoSigStr(char *filename, unsigned char geo, unsigned char kml,
|
|||||||
lon)));
|
lon)));
|
||||||
|
|
||||||
// fix for multi-tile lidar
|
// fix for multi-tile lidar
|
||||||
if(width==10000 && (indx==1 || indx==3)){
|
/* if(width==10000 && (indx==1 || indx==3)){
|
||||||
if(y0 >= 3432){ //3535
|
if(y0 >= 3432){ //3535
|
||||||
y0=y0-3432;
|
y0=y0-3432;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
if (x0 >= 0 && x0 <= mpi && y0 >= 0
|
if (x0 >= 0 && x0 <= mpi && y0 >= 0
|
||||||
&& y0 <= mpi)
|
&& y0 <= mpi)
|
||||||
|
16
test.dcf
Normal file
16
test.dcf
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
+0: 255, 0, 0
|
||||||
|
-10: 255, 128, 0
|
||||||
|
-20: 255, 165, 0
|
||||||
|
-30: 255, 206, 0
|
||||||
|
-40: 255, 255, 0
|
||||||
|
-50: 184, 255, 0
|
||||||
|
-60: 0, 255, 0
|
||||||
|
-70: 0, 208, 0
|
||||||
|
-80: 0, 196, 196
|
||||||
|
-90: 0, 148, 255
|
||||||
|
-100: 80, 80, 255
|
||||||
|
-110: 0, 38, 255
|
||||||
|
-120: 142, 63, 255
|
||||||
|
-130: 196, 54, 255
|
||||||
|
-140: 255, 0, 255
|
||||||
|
-150: 255, 194, 204
|
16
tiles.cc
16
tiles.cc
@@ -53,7 +53,6 @@ int tile_load_lidar(tile_t *tile, char *filename){
|
|||||||
tile->filename = strdup(filename);
|
tile->filename = strdup(filename);
|
||||||
|
|
||||||
/* Perform xur calcs */
|
/* Perform xur calcs */
|
||||||
// Degrees with GDAL option: -co "FORCE_CELLSIZE=YES"
|
|
||||||
tile->xur = tile->xll+(tile->cellsize*tile->width);
|
tile->xur = tile->xll+(tile->cellsize*tile->width);
|
||||||
tile->yur = tile->yll+(tile->cellsize*tile->height);
|
tile->yur = tile->yll+(tile->cellsize*tile->height);
|
||||||
|
|
||||||
@@ -62,15 +61,15 @@ int tile_load_lidar(tile_t *tile, char *filename){
|
|||||||
if (tile->xll < westoffset)
|
if (tile->xll < westoffset)
|
||||||
westoffset = tile->xll;
|
westoffset = tile->xll;
|
||||||
|
|
||||||
// if (debug)
|
if (debug)
|
||||||
// fprintf(stderr,"%d, %d, %.7f, %.7f, %.7f, %.7f, %.7f\n",width,height,xll,yll,cellsize,yur,xur);
|
fprintf(stderr,"%d, %d, %.7f, %.7f, %.7f, %.7f, %.7f\n",tile->width,tile->height,tile->xll,tile->yll,tile->cellsize,tile->yur,tile->xur);
|
||||||
|
|
||||||
// Greenwich straddling hack
|
// Greenwich straddling hack
|
||||||
// if (tile->xll <= 0 && tile->xur > 0) {
|
/* if (tile->xll <= 0 && tile->xur > 0) {
|
||||||
// tile->xll = (tile->xur - tile->xll); // full width
|
tile->xll = (tile->xur - tile->xll); // full width
|
||||||
// tile->xur = 0.0; // budge it along so it's west of greenwich
|
tile->xur = 0.0; // budge it along so it's west of greenwich
|
||||||
// delta = eastoffset; // add to Tx longitude later
|
delta = eastoffset; // add to Tx longitude later
|
||||||
// } else {
|
} else {*/
|
||||||
// Transform WGS84 longitudes into 'west' values as society finishes east of Greenwich ;)
|
// Transform WGS84 longitudes into 'west' values as society finishes east of Greenwich ;)
|
||||||
if (tile->xll >= 0)
|
if (tile->xll >= 0)
|
||||||
tile->xll = 360-tile->xll;
|
tile->xll = 360-tile->xll;
|
||||||
@@ -121,6 +120,7 @@ int tile_load_lidar(tile_t *tile, char *filename){
|
|||||||
// Round to nearest 0.5
|
// Round to nearest 0.5
|
||||||
tile->resolution = tile->precise_resolution < 0.5f ? 0.5f : ceil((tile->precise_resolution * 2)+0.5) / 2;
|
tile->resolution = tile->precise_resolution < 0.5f ? 0.5f : ceil((tile->precise_resolution * 2)+0.5) / 2;
|
||||||
|
|
||||||
|
// Positive westing
|
||||||
tile->width_deg = tile->max_west - tile->min_west >= 0 ? tile->max_west - tile->min_west : tile->max_west + (360 - tile->min_west);
|
tile->width_deg = tile->max_west - tile->min_west >= 0 ? tile->max_west - tile->min_west : tile->max_west + (360 - tile->min_west);
|
||||||
tile->height_deg = tile->max_north - tile->min_north;
|
tile->height_deg = tile->max_north - tile->min_north;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user