File indexing completed on 2025-01-12 06:34:50
0001 ' Goode Homolosine - Interrupted for Continents 0002 ' Central longitude of map (Lambda0) = 0 Degrees 0003 ' 0004 ' =================================== 0005 ' 0006 ' Program Written by: 0007 ' Paul B. Anderson (804) 853-7595 0008 ' 3214 Chalfin Ave. 0009 ' Norfolk, Va. 23513 0010 ' 0011 ' =================================== 0012 ' 0013 ' Main Map Formula From "AN ALBUM OF MAP PROJECTIONS" 0014 ' by John P. Snyder & Philip M. Voxland, 1987. 0015 ' (U.S. Geological Survey Professional Paper 1453) 0016 ' 0017 ' Function MollweideFormula# (Used in Mollweide Iteration) is from: 0018 ' "MAP PROJECTIONS -- A WORKING MANUAL" 0019 ' by John P. Snyder, 1987. 0020 ' (U.S. Geological Survey Professional Paper 1395) 0021 ' 0022 ' ============== 0023 ' Declarations 0024 ' ============== 0025 ' 0026 DECLARE SUB Alert () 0027 DECLARE SUB CRTColorMenu () 0028 DECLARE SUB DataPointsMenu () 0029 DECLARE SUB DrawGrid () 0030 DECLARE SUB DrawOutline () 0031 DECLARE SUB DrawProjection (PolyLine%) 0032 DECLARE SUB FeaturesMenu () 0033 DECLARE SUB GetMapData (FileName$) 0034 DECLARE SUB Goode (DeltaLambda#, Radius#, XCoord#, YCoord#) 0035 DECLARE SUB LatLongEntry (Title$, Note$) 0036 DECLARE SUB LatLongMenu () 0037 DECLARE SUB LongitudeFOR (Begin#, Finish#, Incr#) 0038 DECLARE SUB MakeLatitudeLines (LatRange%, LatDetail%) 0039 DECLARE SUB MakeLongitudeLines (LatRange%, LongDetail!) 0040 DECLARE SUB PlotFileColorMenu () 0041 DECLARE SUB ReadInfile (Byte%) 0042 DECLARE FUNCTION ArcCos# (n#) 0043 DECLARE FUNCTION ArcSin# (n#) 0044 DECLARE FUNCTION ArcTanH# (n#) 0045 DECLARE FUNCTION Atan2# (b#, a#) 0046 DECLARE FUNCTION Center% (Length%) 0047 DECLARE FUNCTION ConvertCoordToDecDeg# (coord#) 0048 DECLARE FUNCTION CoTan# (n#) 0049 DECLARE FUNCTION LN# (n#) 0050 DECLARE FUNCTION MollweideFormula# (ThetaPrime#, MPhi#) 0051 DECLARE FUNCTION Normalize# (LambdaVal#, Lambda0Val#) 0052 DECLARE FUNCTION PointCount& (PtCnt&) 0053 DECLARE FUNCTION PolyLineColor% (PolyLineHeader%) 0054 DECLARE FUNCTION Raise# (n#, Power#) 0055 DECLARE FUNCTION Round# (n#, PowerOfTen%) 0056 DECLARE FUNCTION Sec# (n#) 0057 DECLARE FUNCTION Sign# (n#) 0058 ' 0059 ' =========== 0060 ' Constants 0061 ' =========== 0062 ' 0063 CONST FALSE = 0 0064 CONST TRUE = NOT FALSE 0065 CONST SQRT2 = 1.414213562373095# ' SQR(2) 0066 CONST DEG180 = 3.1415926535898# ' PI 0067 CONST DEG90 = 1.5707963267949# ' PI / 2 0068 CONST DEG360 = 6.2831853071796# ' PI * 2 0069 CONST DEG45 = .7853981633974501# ' PI / 4 0070 CONST RAD2DEG = 57.29577951308219# ' 180 / PI 0071 CONST DEG2RAD = 1.745329251994333D-02 ' PI / 180 0072 CONST MIN2RAD = 2.908882086657222D-04 ' DEG2RAD / 60 0073 CONST MERGEPOINT = .710988432654746# ' 40.73666 * DEG2RAD 0074 CONST TOLERANCE = .0000001# ' Tolerance value for Newton-Raphson routine 0075 CONST DTPINCR = .00001# ' Increment value for Delta Theta Prime 0076 ' (inside Newton-Raphson routine) 0077 ' 0078 ' additional Degree Values used in this projection 0079 ' Put Here to avoid repetitive calculation 0080 ' 0081 CONST DEG10 = 10 * DEG2RAD 0082 CONST DEG20 = 20 * DEG2RAD 0083 CONST DEG30 = 30 * DEG2RAD 0084 CONST DEG40 = 40 * DEG2RAD 0085 CONST DEG50 = 50 * DEG2RAD 0086 CONST DEG60 = 60 * DEG2RAD 0087 CONST DEG80 = 80 * DEG2RAD 0088 CONST DEG100 = 100 * DEG2RAD 0089 CONST DEG140 = 140 * DEG2RAD 0090 CONST DEG160 = 160 * DEG2RAD 0091 0092 CONST XCONST = .9003163161571041# ' (8# ^ .5#) / Deg180# 0093 CONST MOLLRFACTOR = .0528# ' Reduction factor applied to 0094 ' Mollweide to match parallels 0095 ' of sinusoidal portion of 0096 ' the projection 0097 ' 0098 CONST XCENTER = 320 ' VGA Center X 0099 CONST YCENTER = 240 ' VGA Center Y 0100 CONST ASPECT = 1 ' VGA mode 12 -- 640x480 aspect ratio = 1 0101 CONST CRTRADIUS = 100 ' Radius Value for CRT display 0102 CONST PLOTRADIUS = 1 ' Radius Value for Plot File 0103 CONST PLTXCENTER = 5588 ' (25.4 * 5.5#) / .025 0104 CONST PLTYCENTER = 4318 ' (25.4 * 4.25#) / .025 0105 CONST LAMBDA0 = 0 ' Central Longitude of map for Goode 0106 ' Homolosine Interrupted for Continental 0107 ' Lobes. 0108 ' 0109 ' ============================ 0110 ' TYPE Definition For PNT file 0111 ' ============================ 0112 ' 0113 TYPE PNTRecord 0114 Header AS INTEGER 0115 Lat AS INTEGER 0116 Lon AS INTEGER 0117 END TYPE 0118 ' 0119 DIM SHARED PNTData AS PNTRecord 0120 ' 0121 ' ========================================= 0122 ' Type Definition for Global Variables (G.) 0123 ' ========================================= 0124 ' 0125 TYPE GlobalVariables 0126 CrtX AS DOUBLE ' Intermediate value for X Coordinate 0127 CrtY AS DOUBLE ' Intermediate value for Y Coordinate 0128 ModCrtX AS DOUBLE ' Modified to be centered on CRT 0129 ModCrtY AS DOUBLE ' Modified to be centered on CRT 0130 LastModCrtX AS DOUBLE 0131 LastModCrtY AS DOUBLE 0132 LastCrtY AS DOUBLE 0133 Lambda AS DOUBLE ' Longitude in Radians 0134 Lambda2 AS DOUBLE ' Central Longitude of Lobe 0135 Phi AS DOUBLE ' Latitude in Radians 0136 Visible AS INTEGER ' When True --> Draw PolyLine% 0137 Grid AS INTEGER ' When True --> Draw Grid 0138 Outline AS INTEGER ' When True --> Skip Lobe IF-Then statements 0139 MapDataLevel AS INTEGER ' Levels 1 to 5 0140 ExtensionLobe1 AS INTEGER ' When True --> Draw extension 1 0141 ExtensionsLobe2 AS INTEGER ' When True --> Draw extensions 2 & 3 0142 ColorVal AS INTEGER ' CRT Color Out 0143 GridColor AS INTEGER ' CRT Color for Grid 0144 CoastColor AS INTEGER ' CRT Color for Coasts 0145 BorderColor AS INTEGER ' CRT Color for Political Borders 0146 IslandColor AS INTEGER ' CRT Color for Islands 0147 StateColor AS INTEGER ' CRT Color U.S. State borders 0148 LakeColor AS INTEGER ' CRT Color for Lakes 0149 RiverColor AS INTEGER ' CRT Color for Rivers 0150 ProvinceColor AS INTEGER ' CRT Color for Canadian Provinces 0151 AustColor AS INTEGER ' CRT Color for Australian States 0152 MexicoColor AS INTEGER ' CRT Color for Mexican States 0153 GridPen AS INTEGER ' Grid color for Plot File 0154 CoastPen AS INTEGER ' Coast color for Plot File 0155 BorderPen AS INTEGER ' Border color for Plot File 0156 IslandPen AS INTEGER ' Island color for Plot File 0157 StatePen AS INTEGER ' State color for Plot File 0158 LakePen AS INTEGER ' Lake color for Plot File 0159 RiverPen AS INTEGER ' River color for Plot File 0160 ProvincePen AS INTEGER ' Canadian Province color for Plot File 0161 AustPen AS INTEGER ' Australian State color for Plot File 0162 MexicoPen AS INTEGER ' Mexican State color for Plot File 0163 LastPlotPen AS STRING * 1 ' 0164 PlotFile AS INTEGER ' When True Plot to a File 0165 CoastSW AS INTEGER ' When True Plot to Crt or file 0166 BorderSW AS INTEGER ' When True Plot to Crt or file 0167 IslandSW AS INTEGER ' When True Plot to Crt or file 0168 StateSW AS INTEGER ' When True Plot to Crt or file 0169 LakeSW AS INTEGER ' When True Plot to Crt or file 0170 RiverSW AS INTEGER ' When True Plot to Crt or file 0171 ProvinceSW AS INTEGER ' When True Plot to Crt or file 0172 AustSW AS INTEGER ' When True Plot to Crt or file 0173 MexicoSW AS INTEGER ' When True Plot to Crt or file 0174 LongStep AS INTEGER ' Grid Longitude Increment 0175 LatStep AS DOUBLE ' Grid Latitude Increment 0176 LongOption AS INTEGER ' 1 - Longitude to pole, 2 - ends at +/-85 deg. 0177 END TYPE 0178 0179 DIM SHARED G AS GlobalVariables 0180 ' 0181 ' > variables used by GetPKDData example routines 0182 ' 0183 ' for the *.PKD file format 0184 ' DIM SHARED Index AS DOUBLE 0185 ' DIM SHARED PointsInLine AS LONG 0186 ' DIM SHARED LonI AS DOUBLE 0187 ' DIM SHARED LatI AS DOUBLE 0188 ' DIM SHARED LonR AS DOUBLE 0189 ' DIM SHARED LatR AS DOUBLE 0190 ' DIM SHARED FeatureType AS INTEGER 0191 ' DIM SHARED LoopCount AS LONG 0192 ' DIM SHARED Infile$(23) 0193 0194 ' 0195 ' ========================= 0196 ' Program starting values 0197 ' ========================= 0198 ' 0199 ' > Flags to tell the program when to draw the map inside the extensions 0200 ' 0201 G.ExtensionLobe1 = FALSE 0202 G.ExtensionsLobe2 = FALSE 0203 ' 0204 ' > Starting CRT colors for Geographical features 0205 ' 0206 G.GridColor = 0 ' Black 0207 G.CoastColor = 0 ' Black 0208 G.BorderColor = 4 ' Red 0209 G.IslandColor = 0 ' Black 0210 G.StateColor = 4 ' Red 0211 G.LakeColor = 1 ' Blue 0212 G.RiverColor = 1 ' Blue 0213 ' 0214 ' > Note: Color values for the following actually use U.S. State color 0215 ' they are not hooked into the CRT color menu 0216 ' 0217 G.ProvinceColor = 4 ' Red 0218 G.AustColor = 4 ' Red 0219 G.MexicoColor = 4 ' Red 0220 ' 0221 ' > Starting Plot File colors for Geographical features (Used by Corel Draw) 0222 ' 0223 G.GridPen = 1 ' Black 0224 G.CoastPen = 1 ' Black 0225 G.BorderPen = 3 ' Red 0226 G.IslandPen = 1 ' Black 0227 G.StatePen = 3 ' Red 0228 G.LakePen = 2 ' Blue 0229 G.RiverPen = 2 ' Blue 0230 ' 0231 ' > Note: Color values for the following actually use U.S. State color 0232 ' they are not hooked into the Pen color menu 0233 ' 0234 G.ProvincePen = 3 ' Red 0235 G.AustPen = 3 ' Red 0236 G.MexicoPen = 3 ' Red 0237 ' 0238 ' > Starting Geographical Features (All ON) 0239 ' 0240 G.CoastSW = TRUE 0241 G.BorderSW = TRUE 0242 G.IslandSW = TRUE 0243 G.StateSW = TRUE 0244 G.LakeSW = TRUE 0245 G.RiverSW = TRUE 0246 G.ProvinceSW = TRUE 0247 G.AustSW = TRUE 0248 G.MexicoSW = TRUE 0249 ' 0250 ' > Starting Latitude and longitude increment -- Traditional View 0251 ' 0252 G.LongStep = 10# 0253 G.LatStep = 10# 0254 G.LongOption = 2 0255 ' 0256 ' > Starting Database level 0257 ' 0258 G.MapDataLevel = 3 0259 ' 0260 ' > Plotting Variables, Plot Size = A 0261 ' 0262 G.PlotFile = TRUE 0263 Plotpass% = 0 'WARNING: Will not write over existing file while in program. 0264 ' 0265 ' --------------- HOWEVER ------------------- 0266 ' IF you EXIT the program and then restart it 0267 ' It WILL write over existing Plot files!!!!! 0268 ' ------------------------------------------- 0269 ' 0270 UserQuits% = FALSE ' Don't Quit yet 0271 0272 VIEW PRINT 1 TO 25 0273 ' 0274 ' { Main Program } 0275 ' 0276 DO 0277 MenuItem% = 0 ' No Menu Items Selected 0278 COLOR 7, 9 0279 CLS 0280 ' 0281 LOCATE 2, 29: PRINT "=======================" 0282 LOCATE 3, 30: PRINT "W O R L D V I E W S" 0283 LOCATE 4, 29: PRINT "=======================" 0284 LOCATE 6, 24: PRINT "Map Projection Library, Volume 1" 0285 LOCATE 8, 24: PRINT " 1. Draw" 0286 LOCATE 16, 30: PRINT "World Views' Options" 0287 LOCATE 18, 12: PRINT " 2. Change CRT Color of Geographical Features" 0288 LOCATE 19, 12: PRINT " 3. Turn Geographical Features On/Off " 0289 LOCATE 20, 12: PRINT " 4. Modify Latitude/Longitude Display" 0290 LOCATE 21, 12: PRINT " 5. Increase/Decrease Amount of Points to Plot" 0291 LOCATE 22, 12: PRINT " 6. Change Plot File Pen Colors of Geographical Features" 0292 LOCATE 24, 21 0293 INPUT "Select Menu Item (1-6) or 0 to Quit: ", MenuItem% 0294 ' 0295 SELECT CASE MenuItem% 0296 ' 0297 CASE 0 0298 UserQuits% = TRUE 0299 0300 CASE 1 0301 ' Draw the Map 0302 Title$ = " Goode Homolosine Projection " 0303 Note$ = "Central Longitude of Map is 0 Degrees" 0304 CALL LatLongEntry(Title$, Note$) 0305 ' 0306 IF G.PlotFile THEN 0307 Plotpass% = Plotpass% + 1 0308 PlotFile$ = "C:\WV\WVPLOT" + LTRIM$(STR$(Plotpass%)) + ".PLT" 0309 OPEN PlotFile$ FOR OUTPUT AS #1 0310 PRINT #1, "IN; IP0,0,11176,8636; SP0;" 0311 PRINT #1, "SC-5498,5498,-4249,4249;" 0312 PRINT #1, "VS4; PT 0.1; SP1;" 0313 G.LastPlotPen = "1" 0314 END IF 0315 0316 SCREEN 12 ' Switch to VGA 480/640, 16 COLOR mode 0317 VIEW (0, 0)-(639, 479), 7 0318 ' 0319 COLOR 10 0320 Col% = Center%(LEN(Title$)) 0321 LOCATE 1, Col%: PRINT Title$; 0322 0323 CALL DrawOutline 0324 0325 ' CALL GetPKDData 0326 0327 IF G.Grid THEN CALL DrawGrid 0328 IF G.CoastSW THEN CALL GetMapData("PCoast.pnt") 0329 IF G.IslandSW THEN CALL GetMapData("PIsland.pnt") 0330 IF G.LakeSW THEN CALL GetMapData("Plake.pnt") 0331 IF G.RiverSW THEN CALL GetMapData("River.pnt") 0332 IF G.BorderSW THEN CALL GetMapData("PBorder.pnt") 0333 IF G.StateSW THEN CALL GetMapData("PUSA48.pnt") 0334 IF G.ProvinceSW THEN CALL GetMapData("PCanProv.pnt") 0335 IF G.AustSW THEN CALL GetMapData("PAust.pnt") 0336 IF G.MexicoSW THEN CALL GetMapData("PMexico.pnt") 0337 0338 G.ExtensionLobe1 = TRUE 0339 IF G.CoastSW THEN CALL GetMapData("PCoast.pnt") 0340 IF G.IslandSW THEN CALL GetMapData("PIsland.pnt") 0341 0342 G.ExtensionLobe1 = FALSE 0343 G.ExtensionsLobe2 = TRUE 0344 0345 IF G.CoastSW THEN CALL GetMapData("PCoast.pnt") 0346 IF G.IslandSW THEN CALL GetMapData("PIsland.pnt") 0347 0348 G.ExtensionsLobe2 = FALSE 0349 0350 IF G.PlotFile THEN 0351 PRINT #1, "PU 0,0; SP00;" 0352 CLOSE #1 0353 END IF 0354 0355 CALL Alert ' BEEP 0356 0357 COLOR 12 0358 LOCATE 1, Col%: PRINT Title$; 0359 0360 DO 0361 Brk$ = INKEY$ 0362 LOOP UNTIL Brk$ > "" 0363 0364 SCREEN 0 'Switch back to Text mode 0365 VIEW PRINT 1 TO 25 0366 0367 CASE 2 0368 ' Change Line Color of Geographical features 0369 CALL CRTColorMenu 0370 0371 CASE 3 0372 ' Turn Geographical features OFF or ON 0373 CALL FeaturesMenu 0374 ' 0375 CASE 4 0376 ' Change Latitude and Longitude Values 0377 CALL LatLongMenu 0378 ' 0379 CASE 5 0380 ' Change the Amount of Database Latitude and Longitude Values to plot 0381 CALL DataPointsMenu 0382 ' 0383 CASE 6 0384 ' Change the Line color of the Geographical features sent to the plot file 0385 CALL PlotFileColorMenu 0386 ' 0387 CASE ELSE 0388 PRINT CHR$(7); 0389 0390 END SELECT '{ MenuItem. } 0391 ' 0392 LOOP UNTIL UserQuits% 0393 ' 0394 END 0395 0396 SUB Alert 0397 ' { Sounds a tone when map is complete. } 0398 0399 SOUND 880, 36.4 0400 0401 END SUB ' { Alert. } 0402 0403 FUNCTION ArcCos# (n#) STATIC 0404 ' 0405 IF n# <> 0 THEN 0406 ArcCos# = ATN(Raise#(1 - (n# * n#), .5) / n#) + DEG180 * (n# - ABS(n#)) / (2 * n#) 0407 ELSE 0408 n# = 0 0409 END IF 0410 ' 0411 END FUNCTION '{ ArcCos#. } 0412 0413 FUNCTION ArcSin# (n#) STATIC 0414 ' 0415 IF ABS(n#) < 1 THEN 0416 ArcSin# = ATN(n# / Raise#(1 - (n# * n#), .5)) 0417 EXIT FUNCTION 0418 END IF 0419 0420 IF n# = 1 THEN 0421 ArcSin# = DEG90 0422 EXIT FUNCTION 0423 END IF 0424 0425 IF n# = -1 THEN 0426 ArcSin# = -DEG90 0427 END IF 0428 ' 0429 END FUNCTION ' { ArcSin#. } 0430 0431 FUNCTION ArcTanH# (n#) STATIC 0432 ' 0433 AT1# = ABS(n#) 0434 ' 0435 IF AT1# < 1 THEN 0436 AT2# = .5 * LN#((1 + AT1#) / (1 - AT1#)) 0437 ArcTanH# = AT2# * Sign#(n#) 0438 END IF 0439 ' 0440 END FUNCTION ' { ArcTanH#.} 0441 0442 FUNCTION Atan2# (b#, a#) 0443 ' 0444 IF a# = 0 THEN 0445 IF b# > 0 THEN 0446 Atan2# = DEG90 0447 ELSEIF b# < 0 THEN 0448 Atan2# = -DEG90 0449 ELSE 0450 Atan2# = 0 0451 END IF 0452 ' 0453 ELSEIF b# = 0 THEN 0454 IF a# < 0 THEN 0455 Atan2# = DEG180 0456 ELSE 0457 Atan2# = 0 0458 END IF 0459 ' 0460 ELSE 0461 IF a# < 0 THEN 0462 IF b# > 0 THEN 0463 Atan2# = ATN(b# / a#) + DEG180 0464 ELSE 0465 Atan2# = ATN(b# / a#) - DEG180 0466 END IF 0467 ' 0468 ELSE 0469 Atan2# = ATN(b# / a#) 0470 END IF 0471 END IF 0472 ' 0473 END FUNCTION '{ ATan2#. } 0474 0475 FUNCTION Center% (Length%) 0476 ' 0477 IF Length% MOD 2 = 0 THEN 0478 Column% = 40 - (Length% \ 2) 0479 ELSE 0480 Column% = (40 - (Length% \ 2)) + 1 0481 END IF 0482 ' 0483 Center% = Column% 0484 ' 0485 END FUNCTION '{ Center$. } 0486 0487 FUNCTION ConvertCoordToDecDeg# (coord#) 0488 ' Used by GetPKDData subroutine 0489 ' 0490 ConvertCoordToDecDeg# = coord# / 3600 0491 ' 0492 END FUNCTION '{ ConvertCoordToDecDeg#. } 0493 0494 FUNCTION CoTan# (n#) 0495 ' 0496 Sine# = SIN(n#) 0497 IF ABS(Sine#) <= .0001 THEN 0498 PRINT "Error: CoTan#(n#) Where n# <= 0" 0499 SYSTEM 0500 ELSE 0501 CoTan# = COS(n#) / Sine# 0502 END IF 0503 ' 0504 END FUNCTION '{ CoTan#. } 0505 0506 SUB CRTColorMenu 0507 ' 0508 ExitMenu% = FALSE 0509 ' 0510 DO 0511 CLS 0512 LOCATE 2, 18: PRINT "** Change CRT Color of Geographical Features **" 0513 LOCATE 4, 36: PRINT "Color Codes" 0514 LOCATE 5, 22: PRINT "0 - Black" 0515 LOCATE 6, 22: PRINT "1 - Blue 6 - Brown 11 - Lt. Cyan " 0516 LOCATE 7, 22: PRINT "2 - Green 7 - White 12 - Lt. Red " 0517 LOCATE 8, 22: PRINT "3 - Cyan 8 - Dk. Grey 13 - Lt. Magenta" 0518 LOCATE 9, 22: PRINT "4 - Red 9 - Lt. Blue 14 - Yellow" 0519 LOCATE 10, 22: PRINT "5 - Magenta 10 - Lt. Green 15 - Br. White" 0520 LOCATE 12, 28: PRINT "1. Grid Color is:"; G.GridColor 0521 LOCATE 13, 28: PRINT "2. Coast Color is:"; G.CoastColor 0522 LOCATE 14, 28: PRINT "3. Border Color is:"; G.BorderColor 0523 LOCATE 15, 28: PRINT "4. Island Color is:"; G.IslandColor 0524 LOCATE 16, 28: PRINT "5. State Border Color is:"; G.StateColor 0525 LOCATE 17, 28: PRINT "6. Lake Color is:"; G.LakeColor 0526 LOCATE 18, 28: PRINT "7. River Color is:"; G.RiverColor 0527 LOCATE 20, 14 0528 INPUT "Select Option (1-7) or 0 to Return to Main Menu: ", Menu% 0529 0530 SELECT CASE Menu% 0531 ' 0532 CASE 0 0533 ExitMenu% = TRUE 0534 ' 0535 CASE 1 0536 LOCATE 20, 1: PRINT SPACE$(80) 0537 LOCATE 20, 14 0538 INPUT "Change Grid Color to (0-15):", NewColor% 0539 ' 0540 IF NewColor% >= 0 AND NewColor% < 16 THEN 0541 G.GridColor = NewColor% 0542 ELSE 0543 PRINT CHR$(7) 0544 END IF 0545 ' 0546 CASE 2 0547 LOCATE 20, 1: PRINT SPACE$(80) 0548 LOCATE 20, 14 0549 INPUT "Change Coastline Color to (0-15):", NewColor% 0550 ' 0551 IF NewColor% >= 0 AND NewColor% < 16 THEN 0552 G.CoastColor = NewColor% 0553 ELSE 0554 PRINT CHR$(7) 0555 END IF 0556 ' 0557 CASE 3 0558 LOCATE 20, 1: PRINT SPACE$(80) 0559 LOCATE 20, 14 0560 INPUT "Change Border Color to (0-15):", NewColor% 0561 ' 0562 IF NewColor% >= 0 AND NewColor% < 16 THEN 0563 G.BorderColor = NewColor% 0564 ELSE 0565 PRINT CHR$(7) 0566 END IF 0567 ' 0568 CASE 4 0569 LOCATE 20, 1: PRINT SPACE$(80) 0570 LOCATE 20, 14 0571 INPUT "Change Island Color to (0-15):", NewColor% 0572 ' 0573 IF NewColor% >= 0 AND NewColor% < 16 THEN 0574 G.IslandColor = NewColor% 0575 ELSE 0576 PRINT CHR$(7) 0577 END IF 0578 ' 0579 CASE 5 0580 LOCATE 20, 1: PRINT SPACE$(80) 0581 LOCATE 20, 14 0582 INPUT "Change State Border Color to (0-15):", NewColor% 0583 ' 0584 IF NewColor% >= 0 AND NewColor% < 16 THEN 0585 G.StateColor = NewColor% 0586 ELSE 0587 PRINT CHR$(7) 0588 END IF 0589 ' 0590 CASE 6 0591 LOCATE 20, 1: PRINT SPACE$(80) 0592 LOCATE 20, 14 0593 INPUT "Change Lake Color to (0-15):", NewColor% 0594 ' 0595 IF NewColor% >= 0 AND NewColor% < 16 THEN 0596 G.LakeColor = NewColor% 0597 ELSE 0598 PRINT CHR$(7) 0599 END IF 0600 ' 0601 CASE 7 0602 LOCATE 20, 1: PRINT SPACE$(80) 0603 LOCATE 20, 14 0604 INPUT "Change River Color to (0-15):", NewColor% 0605 ' 0606 IF NewColor% >= 0 AND NewColor% < 16 THEN 0607 G.RiverColor = NewColor% 0608 ELSE 0609 PRINT CHR$(7) 0610 END IF 0611 ' 0612 CASE ELSE 0613 PRINT CHR$(7) 0614 ' 0615 END SELECT '{ Menu. } 0616 ' 0617 LOOP UNTIL ExitMenu% 0618 ' 0619 END SUB ' { CRTColor. } 0620 0621 SUB DataPointsMenu 0622 ' 0623 ExitMenu% = FALSE 0624 ' 0625 DO 0626 CLS 0627 ' 0628 LOCATE 2, 16: PRINT "** Increase/Decrease Amount of Points to Plot **" 0629 LOCATE 4, 27: PRINT "Current Database Level is"; G.MapDataLevel 0630 LOCATE 6, 25: PRINT "1. 179,331 X-Y Coordinate Pairs" 0631 LOCATE 7, 25: PRINT "2. 109,992 X-Y Coordinate Pairs" 0632 LOCATE 8, 25: PRINT "3. 27,393 X-Y Coordinate Pairs" 0633 LOCATE 9, 25: PRINT "4. 14,867 X-Y Coordinate Pairs" 0634 LOCATE 10, 25: PRINT "5. 5,365 X-Y Coordinate Pairs" 0635 LOCATE 12, 18 0636 PRINT "Select Option (1-5) to Change Database Level" 0637 LOCATE 13, 18 0638 INPUT " or 0 to Return to Previous Menu: ", Menu% 0639 ' 0640 SELECT CASE Menu% 0641 ' 0642 CASE 0 0643 ExitMenu% = TRUE 0644 ' 0645 CASE 1 TO 5 0646 G.MapDataLevel = Menu% 0647 ' 0648 CASE ELSE 0649 PRINT CHR$(7) 0650 ' 0651 END SELECT '{ Menu. } 0652 ' 0653 LOOP UNTIL ExitMenu% 0654 ' 0655 END SUB '{ DataPointsMenu. } 0656 0657 SUB DrawGrid 0658 ' 0659 G.LastModCrtX = 0 0660 G.LastModCrtY = 0 0661 G.ColorVal = G.GridColor 0662 0663 LatRange% = 90 ' 0664 LatDetail% = 5 ' Since Latitude Lines are straight no need to change 0665 LongDetail! = .25 ' For Faster Screen Draws this variable can be increased 0666 ' For "Publication" Quality vector Graphics try .1# 0667 ' (slows screen draws and large increase 0668 ' in plot file size) 0669 ' 0670 ' 0671 ' > If G.LongOption is 1 - All Longitude lines converge at pole 0672 ' If G.LongOption is 2 - Only draw longitude lines to within 5 Degrees 0673 ' of the pole (Default value) 0674 ' 0675 SELECT CASE G.LongOption 0676 0677 CASE IS = 1 0678 LatStop% = 90 0679 ' 0680 CASE IS = 2 0681 LatStop% = 85 0682 ' 0683 END SELECT '{ G.LongOption. } 0684 ' 0685 CALL MakeLongitudeLines(LatStop%, LongDetail!) 0686 CALL MakeLatitudeLines(LatRange%, LatDetail%) 0687 ' 0688 END SUB '{ DrawGrid. } 0689 0690 SUB DrawOutline STATIC 0691 ' 0692 G.Outline = TRUE 0693 G.ColorVal = G.GridColor 0694 G.LastModCrtX = 0 0695 0696 PolyLine% = TRUE 0697 Increment# = DEG2RAD / 4 0698 0699 G.Lambda = -DEG180 0700 G.Lambda2 = -DEG160 0701 CALL LongitudeFOR(-DEG90, 0, Increment#) 0702 G.Lambda2 = -DEG100 0703 CALL LongitudeFOR(0, DEG90, Increment#) 0704 ' 0705 ' ================== 0706 ' Insert 1 Longitude 0707 ' ================== 0708 ' 0709 G.Lambda = -DEG10 0710 G.Lambda2 = -DEG100 0711 CALL LongitudeFOR(DEG90, DEG60, -Increment#) 0712 ' 0713 ' ================================= 0714 ' Insert 1 Latitude (Bottom Border) 0715 ' ================================= 0716 ' 0717 G.Phi = DEG60 0718 G.Lambda2 = -DEG100 0719 G.Lambda = -DEG10 0720 ' 0721 DO 0722 CALL DrawProjection(PolyLine%) 0723 G.Lambda = G.Lambda - Increment# 0724 IF G.Lambda < -DEG40 THEN EXIT DO 0725 LOOP 0726 ' 0727 ' ================================= 0728 ' 0729 ' ================================= 0730 ' 0731 G.Lambda = -DEG40 0732 G.Lambda2 = -DEG100 0733 CALL LongitudeFOR(DEG60, 0, -Increment#) 0734 G.Lambda2 = DEG30 0735 CALL LongitudeFOR(0, DEG60, Increment#) 0736 ' 0737 ' ================================= 0738 ' Insert 2 Latitude (Bottom Border) 0739 ' ================================= 0740 ' 0741 G.Phi = DEG60 0742 G.Lambda2 = DEG30 0743 G.Lambda = -DEG40 0744 0745 DO 0746 CALL DrawProjection(PolyLine%) 0747 G.Lambda = G.Lambda - Increment# 0748 IF G.Lambda < -DEG50 THEN EXIT DO 0749 LOOP 0750 ' 0751 ' ================== 0752 ' Insert 2 Longitude 0753 ' ================== 0754 ' 0755 G.Lambda = -DEG50 0756 G.Lambda2 = DEG30 0757 CALL LongitudeFOR(DEG60, DEG90, Increment#) 0758 ' 0759 ' ================== 0760 ' Insert 3 Longitude 0761 ' ================== 0762 ' 0763 G.Lambda = -DEG160 0764 G.Lambda2 = DEG30 0765 CALL LongitudeFOR(DEG90, DEG50, -Increment#) 0766 ' 0767 ' ================================= 0768 ' Insert 3 Latitude (Bottom Border) 0769 ' ================================= 0770 ' 0771 G.Phi = DEG50 0772 G.Lambda2 = DEG30 0773 G.Lambda = -DEG160 0774 0775 DO 0776 CALL DrawProjection(PolyLine%) 0777 G.Lambda = G.Lambda - Increment# 0778 IF G.Lambda < -DEG180 THEN EXIT DO 0779 LOOP 0780 0781 ' ================== 0782 ' 0783 ' ================== 0784 ' 0785 G.Lambda = DEG180 0786 G.Lambda2 = DEG30 0787 CALL LongitudeFOR(DEG50, 0, -Increment#) 0788 G.Lambda2 = DEG140 0789 CALL LongitudeFOR(0, -DEG90, -Increment#) 0790 0791 G.Lambda = DEG80 0792 G.Lambda2 = DEG140 0793 CALL LongitudeFOR(-DEG90, 0, Increment#) 0794 G.Lambda2 = DEG20 0795 CALL LongitudeFOR(0, -DEG90, -Increment#) 0796 0797 G.Lambda = -DEG20 0798 G.Lambda2 = DEG20 0799 CALL LongitudeFOR(-DEG90, 0, Increment#) 0800 G.Lambda2 = -DEG60 0801 CALL LongitudeFOR(0, -DEG90, -Increment#) 0802 0803 G.Lambda = -DEG100 0804 G.Lambda2 = -DEG60 0805 CALL LongitudeFOR(-DEG90, 0, Increment#) 0806 G.Lambda2 = -DEG160 0807 CALL LongitudeFOR(0, -DEG90, -Increment#) 0808 0809 PolyLine% = FALSE 0810 CALL DrawProjection(PolyLine%) 0811 0812 G.Outline = FALSE '* 0813 ' 0814 END SUB '{ DrawOutline. } 0815 0816 SUB DrawProjection (PolyLine%) STATIC 0817 ' 0818 IF G.ExtensionLobe1 THEN 0819 G.Outline = FALSE 0820 LongDeg# = CSNG(G.Lambda * RAD2DEG) 0821 0822 IF LongDeg# >= -40 AND LongDeg# <= -10 THEN 0823 IF CSNG(G.Phi * RAD2DEG) >= 60 THEN 0824 G.Lambda2 = -DEG100 0825 G.Outline = TRUE 0826 END IF 0827 END IF 0828 0829 IF LongDeg# >= -180 AND LongDeg# <= -160 THEN 0830 IF CSNG(G.Phi * RAD2DEG) >= 50 THEN 0831 G.Lambda2 = DEG30 0832 G.Outline = TRUE 0833 END IF 0834 END IF 0835 IF G.Outline = FALSE THEN EXIT SUB 0836 END IF 0837 0838 IF G.ExtensionsLobe2 THEN 0839 G.Outline = FALSE 0840 LongDeg# = CSNG(G.Lambda * RAD2DEG) 0841 IF LongDeg# >= -50 AND LongDeg# <= -40 THEN 0842 IF CSNG(G.Phi * RAD2DEG) >= 60 THEN 0843 G.Lambda2 = DEG30 0844 G.Outline = TRUE 0845 END IF 0846 END IF 0847 IF G.Outline = FALSE THEN EXIT SUB 0848 END IF 0849 0850 CALL Goode(G.Lambda, CRTRADIUS, G.CrtX, G.CrtY) 0851 0852 IF G.PlotFile THEN 0853 CALL Goode(G.Lambda, PLOTRADIUS, PlotX#, PlotY#) 0854 PlotX# = ((25.4# * PlotX#) / .025#) '+ PltXCenter# 0855 PlotY# = ((25.4# * PlotY#) / .025#) '+ PltYCenter# 0856 END IF 0857 ' 0858 G.ModCrtX = FIX((G.CrtX * ASPECT) + XCENTER) 0859 G.ModCrtY = CINT(YCENTER) - FIX(G.CrtY) 0860 ' 0861 IF PolyLine% = FALSE THEN G.Visible = FALSE 0862 ' 0863 ' > This statement eliminates the stray lines going from top to bottom 0864 ' > for the Transverse Mercator and Cassini Projections 0865 ' 0866 IF ABS(G.ModCrtY - G.LastModCrtY) > 120 THEN G.Visible = FALSE 0867 ' 0868 ' > This statement eliminates the stray lines for the Azimuthal Projections 0869 ' 0870 IF ABS(G.LastModCrtX - G.ModCrtX) > 120 THEN G.Visible = FALSE 0871 0872 IF G.LastModCrtX < -2000 OR G.ModCrtX < -2000 THEN G.Visible = FALSE 0873 0874 IF G.Visible THEN 0875 Y2# = (G.ModCrtY - G.LastModCrtY) * (G.ModCrtY - G.LastModCrtY) 0876 X2# = (G.ModCrtX - G.LastModCrtX) * (G.ModCrtX - G.LastModCrtX) 0877 Distance# = Raise#(X2# + Y2#, .5) 0878 IF ABS(Distance#) > 20 THEN 0879 G.Visible = FALSE 0880 END IF 0881 END IF 0882 0883 IF G.PlotFile THEN 0884 IF G.Visible THEN 0885 PRINT #1, "PD"; STR$(CINT(PlotX#)); ","; STR$(CINT(PlotY#)); ";" 0886 ELSE 0887 PRINT #1, "PU"; STR$(CINT(PlotX#)); ","; STR$(CINT(PlotY#)); ";" 0888 END IF 0889 END IF 0890 0891 IF G.Visible THEN 0892 LINE (G.LastModCrtX, G.LastModCrtY)-(G.ModCrtX, G.ModCrtY), G.ColorVal 0893 END IF 0894 0895 G.Visible = TRUE 0896 G.LastModCrtX = G.ModCrtX 0897 G.LastModCrtY = G.ModCrtY 0898 ' 0899 END SUB ' { DrawProjection. } 0900 0901 SUB FeaturesMenu 0902 ' 0903 ExitMenu% = FALSE 0904 ' 0905 DO 0906 CLS 0907 ' 0908 LOCATE 2, 19 0909 PRINT "** Turn Geographical Features On or Off **" 0910 ' 0911 LOCATE 5, 22: PRINT "1. Coastlines are"; 0912 IF G.CoastSW THEN 0913 PRINT " On " 0914 ELSE 0915 PRINT " Off" 0916 END IF 0917 ' 0918 LOCATE 6, 22: PRINT "2. Islands are"; 0919 IF G.IslandSW THEN 0920 PRINT " On " 0921 ELSE 0922 PRINT " Off" 0923 END IF 0924 ' 0925 LOCATE 7, 22: PRINT "3. Lakes are"; 0926 IF G.LakeSW THEN 0927 PRINT " On " 0928 ELSE 0929 PRINT " Off" 0930 END IF 0931 ' 0932 LOCATE 8, 22: PRINT "4. Rivers are"; 0933 IF G.RiverSW THEN 0934 PRINT " On " 0935 ELSE 0936 PRINT " Off" 0937 END IF 0938 ' 0939 LOCATE 9, 22: PRINT "5. Country Borders are"; 0940 IF G.BorderSW THEN 0941 PRINT " On " 0942 ELSE 0943 PRINT " Off" 0944 END IF 0945 ' 0946 LOCATE 10, 22: PRINT "6. U.S. State Borders are"; 0947 IF G.StateSW THEN 0948 PRINT " On " 0949 ELSE 0950 PRINT " Off" 0951 END IF 0952 ' 0953 LOCATE 11, 22: PRINT "7. Canadian Province Borders are"; 0954 IF G.ProvinceSW THEN 0955 PRINT " On " 0956 ELSE 0957 PRINT " Off" 0958 END IF 0959 ' 0960 LOCATE 12, 22: PRINT "8. Austrailian State Borders are"; 0961 IF G.AustSW THEN 0962 PRINT " On " 0963 ELSE 0964 PRINT " Off" 0965 END IF 0966 ' 0967 LOCATE 13, 22: PRINT "9. Mexican State Borders are"; 0968 IF G.AustSW THEN 0969 PRINT " On " 0970 ELSE 0971 PRINT " Off" 0972 END IF 0973 ' 0974 LOCATE 16, 23: PRINT "Select Option (1-9) to toggle Feature" 0975 ' 0976 LOCATE 17, 37: PRINT "- Or -" 0977 ' 0978 LOCATE 18, 24: INPUT "0 to Return to Previous Menu: ", Menu% 0979 ' 0980 SELECT CASE Menu% 0981 ' 0982 CASE 0 0983 ExitMenu% = TRUE 0984 ' 0985 CASE 1 0986 IF G.CoastSW THEN 0987 G.CoastSW = FALSE 0988 ELSE 0989 G.CoastSW = TRUE 0990 END IF 0991 ' 0992 CASE 2 0993 IF G.IslandSW THEN 0994 G.IslandSW = FALSE 0995 ELSE 0996 G.IslandSW = TRUE 0997 END IF 0998 ' 0999 CASE 3 1000 IF G.LakeSW THEN 1001 G.LakeSW = FALSE 1002 ELSE 1003 G.LakeSW = TRUE 1004 END IF 1005 ' 1006 CASE 4 1007 IF G.RiverSW THEN 1008 G.RiverSW = FALSE 1009 ELSE 1010 G.RiverSW = TRUE 1011 END IF 1012 ' 1013 CASE 5 1014 IF G.BorderSW THEN 1015 G.BorderSW = FALSE 1016 ELSE 1017 G.BorderSW = TRUE 1018 END IF 1019 ' 1020 CASE 6 1021 IF G.StateSW THEN 1022 G.StateSW = FALSE 1023 ELSE 1024 G.StateSW = TRUE 1025 END IF 1026 ' 1027 CASE 7 1028 IF G.ProvinceSW THEN 1029 G.ProvinceSW = FALSE 1030 ELSE 1031 G.ProvinceSW = TRUE 1032 END IF 1033 ' 1034 CASE 8 1035 IF G.AustSW THEN 1036 G.AustSW = FALSE 1037 ELSE 1038 G.AustSW = TRUE 1039 END IF 1040 ' 1041 CASE 9 1042 IF G.MexicoSW THEN 1043 G.MexicoSW = FALSE 1044 ELSE 1045 G.MexicoSW = TRUE 1046 END IF 1047 ' 1048 CASE ELSE 1049 PRINT CHR$(7) 1050 ' 1051 END SELECT '{ Menu. } 1052 ' 1053 LOOP UNTIL ExitMenu% 1054 ' 1055 END SUB '{ FeaturesMenu. } 1056 1057 SUB GetFullCoords (LonI#, LatI#) 1058 ' Used by GetPKDData subroutine 1059 ' 1060 STATIC Temp# 1061 STATIC Temp2# 1062 ' 1063 ' Longitude Degree1 1064 CALL ReadInfile(Byte%) 1065 Temp# = Byte% 1066 Temp# = Temp# * 7200! 1067 ' 1068 ' Longitude Degree2 1069 CALL ReadInfile(Byte%) 1070 Temp2# = Byte% 1071 Temp# = Temp# + (Temp2# * 3600!) 1072 ' 1073 ' Longitude Minutes 1074 CALL ReadInfile(Byte%) 1075 Temp2# = Byte% 1076 Temp# = Temp# + (Temp2# * 60!) 1077 ' 1078 ' Longitude Seconds 1079 CALL ReadInfile(Byte%) 1080 Temp2# = Byte% 1081 Temp# = Temp# + Temp2# 1082 LonI# = Temp# 1083 ' 1084 ' Latitude Degrees 1085 Temp# = 0 1086 Temp2# = 0 1087 CALL ReadInfile(Byte%) 1088 Temp# = Byte% 1089 Temp# = Temp# * 3600! 1090 ' 1091 ' Latitude Minutes 1092 CALL ReadInfile(Byte%) 1093 Temp2# = Byte% 1094 Temp# = Temp# + (Temp2# * 60!) 1095 ' 1096 ' Latitude Seconds 1097 CALL ReadInfile(Byte%) 1098 Temp2# = Byte% 1099 Temp# = Temp# + Temp2# 1100 LatI# = Temp# 1101 ' 1102 END SUB '{ GetFullCoords. } 1103 1104 SUB GetMapData (FileName$) STATIC 1105 ' 1106 G.Visible = FALSE 1107 G.LastModCrtX = 0 1108 1109 OPEN "C:\WORK\" + FileName$ FOR RANDOM AS #2 LEN = LEN(PNTData) 1110 1111 TotalRecords& = LOF(2) / LEN(PNTData) 1112 1113 FOR RecordCounter& = 1 TO TotalRecords& 1114 1115 GET #2, RecordCounter&, PNTData 1116 1117 IF PNTData.Header >= G.MapDataLevel THEN 1118 1119 IF PNTData.Header > 5 THEN 1120 G.ColorVal = PolyLineColor%(PNTData.Header) 1121 PolyLine% = FALSE 1122 ELSE 1123 PolyLine% = TRUE 1124 END IF 1125 1126 G.Phi = PNTData.Lat * MIN2RAD 1127 G.Lambda = PNTData.Lon * MIN2RAD 1128 1129 CALL DrawProjection(PolyLine%) 1130 1131 END IF 1132 1133 NEXT RecordCounter& 1134 1135 CLOSE #2 1136 1137 END SUB '{ GetMapData. } 1138 1139 SUB GetMP1Data 1140 ' This module contains both the GetMP1Data and ParseWord Subroutines. 1141 ' They are not hooked into the program, but are provided in case the user 1142 ' wishes to install them and create his or her own coordinate database. 1143 ' 1144 ' An *.MP1 file is nothing more than an ASCII file that can be 1145 ' created with a Text editor containing Latitude in Decimal Degrees 1146 ' then Longitude in Decimal Degrees separated by a comma or a space. 1147 ' Comments can also be included on each line as long as they are set 1148 ' off by an apostrophe (') and are at the end of the line. 1149 ' 1150 ' The first set of coordinates in the file are understood to be the beginning 1151 ' of the first PolyLine%. A new PolyLine% is indicated by a blank line at the 1152 ' beginning of the series of coordinates making up the new line. 1153 ' 1154 ' OPEN "C:EXAMPLE.PRN" FOR INPUT AS #1 1155 ' 1156 ' G.Visible = False 1157 ' G.LastModCRTX = 0 1158 ' SEEK #1, 1 1159 ' 1160 ' WHILE NOT EOF(1) 1161 ' 1162 ' LINE INPUT #1, MP1Rec$ 1163 ' 1164 ' CALL ParseWord(MP1Rec$, TLat$) 1165 ' LatR = VAL(TLat$) * Deg2Rad 1166 ' 1167 ' CALL ParseWord(MP1Rec$, TLong$) 1168 ' LongR = VAL(TLong$) * Deg2Rad 1169 ' 1170 ' IF VAL(TLong$) = 0 AND VAL(TLat$) = 0 THEN 1171 ' PolyLine% = False 1172 ' LINE INPUT #1, MP1Rec$ 1173 ' 1174 ' CALL ParseWord(MP1Rec$, TLat$) 1175 ' LatR = VAL(TLat$) * Deg2Rad 1176 ' 1177 ' CALL ParseWord(MP1Rec$, TLong$) 1178 ' LongR = VAL(TLong$) * Deg2Rad 1179 ' 1180 ' ELSE 1181 ' PolyLine% = True 1182 ' END IF 1183 ' CALL DrawProjection(PolyLine%) 1184 1185 ' WEND 1186 ' 1187 'END SUB '{ GetMP1Data. } 1188 ' 1189 ' SUB ParseWord (PointLine$, Coord$) STATIC 1190 ' Subroutine to Parse text for *.MP1 Format 1191 ' 1192 ' Sep$ = " ," 1193 ' Coord$ = "" 1194 ' PointLine$ = RTRIM$(LTRIM$(PointLine$)) 1195 ' LenPointLine% = LEN(PointLine$) 1196 ' IF PointLine$ = "" OR PointLine$ = "'" THEN 1197 ' EXIT SUB 1198 ' END IF 1199 ' FOR Cnt1% = 1 TO LenPointLine% 1200 ' IF INSTR(Sep$, MID$(PointLine$, Cnt1%, 1)) = 0 THEN 1201 ' EXIT FOR 1202 ' END IF 1203 ' NEXT Cnt1% 1204 ' FOR Cnt2% = Cnt1% TO LenPointLine% 1205 ' IF INSTR(Sep$, MID$(PointLine$, Cnt2%, 1)) THEN ' = 0 1206 ' EXIT FOR 1207 ' END IF 1208 ' NEXT Cnt2% 1209 ' FOR Cnt3% = Cnt2% TO LenPointLine% 1210 ' IF INSTR(Sep$, MID$(PointLine$, Cnt3%, 1)) = 0 THEN 1211 ' EXIT FOR 1212 ' END IF 1213 ' NEXT Cnt3% 1214 ' IF Cnt1% > LenPointLine% THEN 1215 ' PointLine$ = "" 1216 ' EXIT SUB 1217 ' END IF 1218 ' IF Cnt2% > LenPointLine% THEN 1219 ' Coord$ = MID$(PointLine$, Cnt1%) 1220 ' PointLine$ = "" 1221 ' EXIT SUB 1222 ' END IF 1223 ' Coord$ = MID$(PointLine$, Cnt1%, Cnt2% - Cnt1%) 1224 ' IF Cnt3% > LenPointLine% THEN 1225 ' PointLine$ = "" 1226 ' ELSE 1227 ' PointLine$ = MID$(PointLine$, Cnt3%) 1228 ' END IF 1229 ' 1230 ' END SUB ' { ParseWord. } 1231 END SUB '{ GetMP1Data. } 1232 1233 SUB GetNextCoords (LonI AS DOUBLE, LatI AS DOUBLE) 1234 ' Used by GetPKDData subroutine 1235 ' 1236 'Extract Longitude Delta 1237 CALL ReadInfile(Byte%) 1238 LonI = LonI + Byte% 1239 ' 1240 'Extract Latitude Delta 1241 CALL ReadInfile(Byte%) 1242 LatI = LatI + Byte% 1243 ' 1244 END SUB '{GetNextCoords} 1245 1246 SUB GetPKDData 1247 1248 ' extracts data from *.PKD files 1249 ' This uses the South America Database Only 1250 1251 ' G.Visible = False 1252 ' PreviousScreenX# = 0# 1253 1254 ' Infile$(1) = "SAC1.PKD" 1255 ' Infile$(2) = "SAC2.PKD" 1256 ' Infile$(3) = "SAC3.PKD" 1257 ' Infile$(4) = "SAC4.PKD" 1258 ' Infile$(5) = "SAC7.PKD" 1259 ' Infile$(6) = "SAC8.PKD" 1260 ' Infile$(7) = "SAC9.PKD" 1261 ' Infile$(8) = "SAC13.PKD" 1262 ' Infile$(9) = "SAC14.PKD" 1263 ' Infile$(10) = "SAC10.PKD" 1264 ' Infile$(11) = "SAB01.PKD" 1265 ' Infile$(12) = "SAB2.PKD" 1266 ' Infile$(13) = "SAB3.PKD" 1267 ' Infile$(14) = "SAR1.PKD" 1268 ' Infile$(15) = "SAR2.PKD" 1269 ' Infile$(16) = "SAR3.PKD" 1270 ' Infile$(17) = "SAR4.PKD" 1271 ' Infile$(18) = "SAR5.PKD" 1272 ' Infile$(19) = "SAR06.PKD" 1273 ' Infile$(20) = "SAR7.PKD" 1274 ' Infile$(21) = "SAR8.PKD" 1275 ' Infile$(22) = "SAR10.PKD" 1276 1277 ' FOR Infil% = 1 TO 22 1278 ' OPEN "C:\SA\" + Infile$(Infil%) FOR BINARY AS #1 1279 ' 1280 ' DO 1281 ' CALL ReadInfile(FeatureType) 1282 1283 ' IF MID$(Infile$(Infil%), 3, 1) = "C" THEN G.ColorVal = 0 1284 ' IF MID$(Infile$(Infil%), 3, 1) = "B" THEN G.ColorVal = 4 1285 ' IF MID$(Infile$(Infil%), 3, 1) = "R" THEN G.ColorVal = 1 1286 ' 1287 ' PointsInLine& = PointCount&(PtCnt&) 1288 ' 1289 ' CALL GetFullCoords(LonI, LatI) ' - Max Place Holder (Max not used in program) 1290 ' 1291 ' CALL GetFullCoords(LonI, LatI) ' - Min Place Holder (Min not used in Program) 1292 ' 1293 ' PolyLine% = False 1294 1295 ' CALL GetFullCoords(LonI, LatI) ' - Use First Coordinate 1296 1297 ' LonR = ConvertCoordToDecDeg#(LonI) 1298 ' LatR = ConvertCoordToDecDeg#(LatI) 1299 1300 ' G.Phi = LatR * Deg2Rad 1301 ' G.Lambda = LonR * Deg2Rad 1302 ' CALL DrawProjection(PolyLine%) 1303 ' 1304 ' PointsInLine& = PointsInLine& - 1 1305 ' 1306 ' PolyLine% = True 1307 ' FOR LoopCount = 1 TO PointsInLine& 1308 ' 1309 ' CALL GetNextCoords(LonI, LatI) '- Use next coordinates 1310 ' LonR = ConvertCoordToDecDeg#(LonI) 1311 ' LatR = ConvertCoordToDecDeg#(LatI) 1312 1313 ' G.Phi = LatR * Deg2Rad 1314 ' G.Lambda = LonR * Deg2Rad 1315 ' CALL DrawProjection(PolyLine%) 1316 ' 1317 ' NEXT LoopCount 1318 ' 1319 ' LOOP UNTIL Index = LOF(1) 1320 ' 1321 ' Index = 0 1322 ' CLOSE #1 1323 ' NEXT Infil% 1324 ' 1325 END SUB '{ GetPKDData. } 1326 1327 SUB Goode (DeltaLambda#, Radius#, XCoord#, YCoord#) STATIC 1328 ' 1329 ' When drawing the outline and the extensions there are a number 1330 ' of duplications that would be drawn over each other if the following 1331 ' groups of IF-THEN statements were used. It was easier to define the 1332 ' necessary Lobe Central Longitude (G.Lambda2) values in the Outline 1333 ' and DrawProjection (extensions) subroutines and use the Outline 1334 ' variable as a flag to skip over the following IF-THENs. 1335 1336 IF G.Outline THEN 1337 GOTO XYPlot 1338 END IF 1339 1340 IF G.Phi >= 0 THEN 1341 IF (G.Lambda > -DEG180) AND (G.Lambda <= -DEG40) THEN 1342 G.Lambda2 = -DEG100 1343 GOTO XYPlot 1344 END IF 1345 1346 IF (G.Lambda > -DEG40) AND (G.Lambda <= DEG180) THEN 1347 G.Lambda2 = DEG30 1348 GOTO XYPlot 1349 END IF 1350 END IF 1351 1352 IF (G.Lambda >= -DEG180) AND (G.Lambda <= -DEG100) THEN 1353 G.Lambda2 = -DEG160 1354 GOTO XYPlot 1355 END IF 1356 1357 IF (G.Lambda >= -DEG100) AND (G.Lambda <= -DEG20) THEN 1358 G.Lambda2 = -DEG60 1359 GOTO XYPlot 1360 END IF 1361 1362 IF (G.Lambda >= -DEG20) AND (G.Lambda <= DEG80) THEN 1363 G.Lambda2 = DEG20 1364 GOTO XYPlot 1365 END IF 1366 1367 IF (G.Lambda >= DEG80) AND (G.Lambda <= DEG180) THEN 1368 G.Lambda2 = DEG140 1369 GOTO XYPlot 1370 END IF 1371 ' 1372 ' ---------------------------------- 1373 ' 1374 XYPlot: 1375 ' The DeltaLambda# value is computed at the top of the DrawProjection 1376 ' subroutine to place the Longitude (G.Lambda#) Value into the correct 1377 ' quadrant of the map in relation to the center of the full map. It is 1378 ' used here to establish the same Longitude relationship for the lobe. 1379 1380 Lambda1# = Normalize#(DeltaLambda#, G.Lambda2) 1381 1382 IF ABS(G.Phi) < MERGEPOINT THEN ' (40.73666# * Deg2Rad) 1383 ' Sinusoidal Projection 1384 XCoord# = Radius# * Lambda1# * COS(G.Phi) 1385 YCoord# = Radius# * G.Phi 1386 ELSE 1387 ' Part of the MollweideFormula# Function 1388 ' Placed here to reduce amount of calculations 1389 SinPhi# = DEG180 * SIN(G.Phi) 1390 ' 1391 ' This subroutine uses Newton-Raphson iteration to derive the Theta# value 1392 ' 1393 ' Mollweide Projection 1394 Start# = G.Phi * .5 1395 DeltaThetaPrime# = Start# 1396 DO 1397 FirstGuess# = MollweideFormula#(DeltaThetaPrime#, SinPhi#) 1398 DeltaThetaPrime# = DeltaThetaPrime# + DTPINCR# 1399 ' MollweideFormula# is a user defined function - use The Menu Bar - View 1400 ' Menu to find it. 1401 SecondGuess# = (MollweideFormula#(DeltaThetaPrime#, SinPhi#) - FirstGuess#) / DTPINCR# 1402 Start# = Start# - FirstGuess# / SecondGuess# 1403 DeltaThetaPrime# = Start# 1404 LOOP WHILE ABS(MollweideFormula#(DeltaThetaPrime#, SinPhi#)) >= TOLERANCE# 1405 ' 1406 Theta# = DeltaThetaPrime# * .5 1407 ' 1408 XCoord# = Radius# * XCONST * Lambda1# * COS(Theta#) 1409 YCoord# = Radius# * (SQRT2 * SIN(Theta#) - MOLLRFACTOR * Sign#(G.Phi)) 1410 ' 1411 END IF 1412 ' 1413 ' In addition to the extensive use of IF-THEN statements to define the 1414 ' Boundries and Central Longitudes of each lobe, the TRICK to 1415 ' Interrupting and recentering a projection is in the following 1416 ' line of code. As you know the Homolosine consists of 2 projections that 1417 ' are merged at 40 Deg. 44 Min. and 11.89 Sec.(40.73666# Decimal Deg.). 1418 ' The X Coordinate formula of the center projection (Sinusoidal) is copied 1419 ' and modified by making the G.Phi# (Latitude) value always equal to 0 (Cosine 1420 ' of 0 is 1) and using the central longitude (G.Lambda2#) of the lobe the 1421 ' Current Longitude (G.Lambda#) value is within. This value is then added to 1422 ' the Normal X coordinate output of both projections. 1423 ' 1424 ' Normal X OUT | Modified X coord of center Projection 1425 XCoord# = XCoord# + (G.Lambda2 * Radius#) 1426 1427 ' This line of code is used to turn off PolyLine%s that cross into different 1428 ' lobes. It could be better (When crossing the equator)! 1429 1430 IF (PreviousPhi# > 0 AND G.Phi < 0) OR (PreviousPhi# < 0 AND G.Phi > 0) THEN 1431 G.Visible = TRUE 1432 ELSE 1433 IF (PreviousLambda2# <> G.Lambda2) THEN 1434 G.Visible = FALSE 1435 END IF 1436 END IF 1437 ' 1438 PreviousPhi# = G.Phi 1439 PreviousLambda2# = G.Lambda2 1440 ' 1441 END SUB '{ Goode. } 1442 1443 SUB LatLongEntry (Title$, Note$) 1444 ' 1445 CLS 1446 1447 IF Title$ <> "" THEN 1448 Col = Center%(LEN(Title$)) 1449 LOCATE 2, Col: PRINT Title$ 1450 END IF 1451 ' 1452 IF Note$ <> "" THEN 1453 Col = Center%(LEN(Note$)) 1454 LOCATE 4, Col: PRINT Note$ 1455 END IF 1456 ' 1457 LOCATE CSRLIN + 1, 20 1458 ' 1459 INPUT "Do you want Grid Lines (Y/N)? ", Answer$ 1460 Answer$ = UCASE$(Answer$) 1461 1462 IF Answer$ = "Y" OR Answer$ = "" THEN 1463 G.Grid = TRUE 1464 ELSE 1465 G.Grid = FALSE 1466 END IF 1467 1468 ' 1469 LOCATE CSRLIN + 1, 19 1470 INPUT "Send Output to Plot File (Y/N)? ", Answer$ 1471 Answer$ = UCASE$(Answer$) 1472 1473 IF Answer$ = "Y" THEN 1474 G.PlotFile = TRUE 1475 ELSE 1476 G.PlotFile = FALSE 1477 END IF 1478 1479 ' 1480 END SUB '{ LatLongEntry. } 1481 1482 SUB LatLongMenu 1483 ' 1484 ExitMenu% = FALSE 1485 1486 DO 1487 CLS 1488 ' 1489 LOCATE 2, 20 1490 PRINT "** Modify Latitude/ Longitude Display **" 1491 ' 1492 SELECT CASE G.LongOption 1493 1494 CASE 1 1495 LOCATE 4, 17 1496 PRINT "Currently all Longitude lines converge at Pole" 1497 1498 CASE 2 1499 LOCATE 4, 11 1500 PRINT "Currently all Longitude lines end 5 Degrees away from Pole" 1501 1502 END SELECT '{ G.LongOption. } 1503 1504 LOCATE 6, 12 1505 PRINT "1. Change Latitude increment (Currently"; G.LatStep; "Degrees)" 1506 1507 LOCATE 7, 12 1508 PRINT "2. Change Longitude increment (Currently"; G.LongStep; "Degrees)" 1509 1510 LOCATE 8, 12 1511 PRINT "3. All Longitude lines converge at Pole" 1512 1513 LOCATE 9, 12 1514 PRINT "4. Longitude lines end 5 Degrees away from Pole" 1515 1516 LOCATE 11, 14 1517 INPUT "Select Option (1-4) or 0 to Return to Previous Menu: ", Menu% 1518 ' 1519 SELECT CASE Menu% 1520 ' 1521 CASE 0 1522 ExitMenu% = TRUE 1523 ' 1524 CASE 1 1525 LOCATE 12, 1: PRINT SPACE$(80) 1526 LOCATE 13, 1: PRINT SPACE$(80) 1527 1528 LOCATE 12, 20 1529 INPUT "Change Latitude Increment to (5 to 90): ", Increment% 1530 1531 IF Increment% >= 5 AND Increment% <= 90 THEN 1532 G.LatStep = Increment% 1533 ELSE 1534 PRINT CHR$(7) 1535 END IF 1536 ' 1537 CASE 2 1538 LOCATE 12, 1: PRINT SPACE$(80) 1539 LOCATE 13, 1: PRINT SPACE$(80) 1540 1541 LOCATE 12, 19 1542 INPUT "Change Longitude Increment to (5 to 90): ", Increment% 1543 1544 IF Increment% >= 5 AND Increment% <= 90 THEN 1545 G.LongStep = Increment% 1546 ELSE 1547 PRINT CHR$(7) 1548 END IF 1549 ' 1550 CASE 3 1551 G.LongOption = 1 1552 ' 1553 CASE 4 1554 G.LongOption = 2 1555 ' 1556 CASE ELSE 1557 PRINT CHR$(7) 1558 ' 1559 END SELECT '{ Menu. } 1560 ' 1561 LOOP UNTIL ExitMenu% 1562 ' 1563 END SUB '{ LatLongMenu. } 1564 1565 FUNCTION LN# (n#) STATIC 1566 ' 1567 IF n# > 0 THEN 1568 LN# = LOG(n#) 1569 ELSE 1570 PRINT "Error: LN#(n#) Where n# <= 0# " 1571 SYSTEM 1572 END IF 1573 ' 1574 END FUNCTION ' { LN#. } 1575 1576 SUB LongitudeFOR (Begin#, Finish#, Incr#) STATIC 1577 ' 1578 PolyLine% = TRUE 1579 1580 FOR LatGrid# = Begin# TO Finish# STEP Incr# 1581 G.Phi = LatGrid# 1582 CALL DrawProjection(PolyLine%) 1583 NEXT LatGrid# 1584 ' 1585 END SUB '{ LongitudeFOR. } 1586 1587 SUB MakeLatitudeLines (LatRange%, LatDetail%) 1588 ' 1589 G.Outline = TRUE 1590 FOR LatGrid% = LatRange% TO -LatRange% STEP -1 1591 1592 IF ABS(LatGrid%) < 90 THEN 1593 1594 Even% = (LatGrid% MOD G.LatStep = 0) 1595 IF Even% THEN 1596 G.Phi = LatGrid% * DEG2RAD 1597 PolyLine% = FALSE 1598 CALL DrawProjection(PolyLine%) 1599 PolyLine% = TRUE 1600 1601 IF LatGrid% <= 0 THEN 1602 ' 1603 ' > Southern Lobe 1 1604 ' 1605 G.Lambda2 = -DEG160 1606 PolyLine% = FALSE 1607 CALL DrawProjection(PolyLine%) 1608 PolyLine% = TRUE 1609 1610 FOR LongGrid% = -180 TO -100 STEP 5 1611 G.Lambda = LongGrid% * DEG2RAD 1612 CALL DrawProjection(PolyLine%) 1613 NEXT LongGrid% 1614 ' 1615 ' > Southern Lobe 2 1616 ' 1617 G.Lambda2 = -DEG60 1618 PolyLine% = FALSE 1619 CALL DrawProjection(PolyLine%) 1620 PolyLine% = TRUE 1621 1622 FOR LongGrid% = -100 TO -20 STEP 5 1623 G.Lambda = LongGrid% * DEG2RAD 1624 CALL DrawProjection(PolyLine%) 1625 NEXT LongGrid% 1626 ' 1627 ' > Southern Lobe 3 1628 ' 1629 G.Lambda2 = DEG20 1630 PolyLine% = FALSE 1631 CALL DrawProjection(PolyLine%) 1632 PolyLine% = TRUE 1633 1634 FOR LongGrid% = -20 TO 80 STEP 5 1635 G.Lambda = LongGrid% * DEG2RAD 1636 CALL DrawProjection(PolyLine%) 1637 NEXT LongGrid% 1638 ' 1639 ' > Southern Lobe 4 1640 ' 1641 G.Lambda2 = DEG140 1642 PolyLine% = FALSE 1643 CALL DrawProjection(PolyLine%) 1644 PolyLine% = TRUE 1645 1646 FOR LongGrid% = 80 TO 180 STEP 5 1647 G.Lambda = LongGrid% * DEG2RAD 1648 CALL DrawProjection(PolyLine%) 1649 NEXT LongGrid% 1650 1651 ELSE 1652 ' 1653 ' > Northern Lobe 1 1654 ' 1655 G.Lambda2 = -DEG100 1656 IF LatGrid% < 60 THEN 1657 PolyLine% = FALSE 1658 CALL DrawProjection(PolyLine%) 1659 PolyLine% = TRUE 1660 1661 FOR LongGrid% = -180 TO -40 STEP 5 1662 G.Lambda = LongGrid% * DEG2RAD 1663 CALL DrawProjection(PolyLine%) 1664 NEXT LongGrid% 1665 ELSE 1666 PolyLine% = FALSE 1667 CALL DrawProjection(PolyLine%) 1668 PolyLine% = TRUE 1669 1670 FOR LongGrid% = -180 TO -10 STEP 5 1671 G.Lambda = LongGrid% * DEG2RAD 1672 CALL DrawProjection(PolyLine%) 1673 NEXT LongGrid% 1674 END IF 1675 ' 1676 ' > Northern Lobe 2 1677 ' 1678 G.Lambda2 = DEG30 1679 IF LatGrid% < 50 THEN 1680 PolyLine% = FALSE 1681 CALL DrawProjection(PolyLine%) 1682 PolyLine% = TRUE 1683 1684 FOR LongGrid% = -40 TO 180 STEP 5 1685 G.Lambda = LongGrid% * DEG2RAD 1686 CALL DrawProjection(PolyLine%) 1687 NEXT LongGrid% 1688 END IF 1689 1690 IF LatGrid% >= 50 AND LatGrid% < 60 THEN 1691 PolyLine% = FALSE 1692 CALL DrawProjection(PolyLine%) 1693 PolyLine% = TRUE 1694 1695 FOR LongGrid% = -40 TO 180 STEP 5 1696 G.Lambda = LongGrid% * DEG2RAD 1697 CALL DrawProjection(PolyLine%) 1698 NEXT LongGrid% 1699 1700 FOR LongGrid% = -180 TO -160 STEP 5 1701 G.Lambda = LongGrid% * DEG2RAD 1702 CALL DrawProjection(PolyLine%) 1703 NEXT LongGrid% 1704 END IF 1705 1706 IF LatGrid% >= 60 THEN 1707 PolyLine% = FALSE 1708 CALL DrawProjection(PolyLine%) 1709 PolyLine% = TRUE 1710 1711 FOR LongGrid% = -50 TO 180 STEP 5 1712 G.Lambda = LongGrid% * DEG2RAD 1713 CALL DrawProjection(PolyLine%) 1714 NEXT LongGrid% 1715 1716 FOR LongGrid% = -180 TO -160 STEP 5 1717 G.Lambda = LongGrid% * DEG2RAD 1718 CALL DrawProjection(PolyLine%) 1719 NEXT LongGrid% 1720 END IF 1721 END IF 1722 END IF 1723 END IF 1724 1725 NEXT LatGrid% 1726 G.Outline = FALSE 1727 ' 1728 END SUB 1729 1730 SUB MakeLongitudeLines (LatRange%, LongDetail!) 1731 ' 1732 ' =========================================== 1733 ' Extension 3 (Right side of Northern Lobe 2) 1734 ' =========================================== 1735 ' 1736 G.Outline = TRUE 1737 G.Lambda2 = DEG30 1738 1739 FOR LongGrid% = -160 TO -180 STEP -1 1740 Even% = (LongGrid% MOD G.LongStep = 0) 1741 IF Even% THEN 1742 IF LongGrid% >= -180 AND LongGrid% < -160 THEN 1743 G.Lambda = LongGrid% * DEG2RAD 1744 PolyLine% = FALSE 1745 ' 1746 FOR LatGrid! = LatRange% TO 50 STEP -LongDetail! 1747 G.Phi = LatGrid! * DEG2RAD 1748 CALL DrawProjection(PolyLine%) 1749 PolyLine% = TRUE 1750 NEXT LatGrid! 1751 END IF 1752 END IF 1753 NEXT LongGrid% 1754 1755 G.Outline = FALSE 1756 ' 1757 ' =============================================== 1758 ' Longitude Lines from 180 degrees to -40 Degrees 1759 ' =============================================== 1760 ' 1761 FOR LongGrid% = 180 TO -40 STEP -1 1762 1763 IF LongGrid% < 180 THEN 1764 Even% = (LongGrid% MOD G.LongStep = 0) 1765 IF Even% THEN 1766 IF LongGrid% = -40 THEN 1767 G.Lambda2 = DEG30 1768 G.Outline = TRUE 1769 ELSE 1770 G.Outline = FALSE 1771 END IF 1772 1773 G.Lambda = LongGrid% * DEG2RAD 1774 PolyLine% = FALSE 1775 ' 1776 North# = LatRange% * DEG2RAD 1777 South# = -LatRange% * DEG2RAD 1778 1779 IF LatRange% = 85 THEN 1780 IF G.Lambda = DEG30 THEN 1781 North# = DEG90 1782 END IF 1783 1784 IF G.Lambda = DEG140 THEN 1785 South# = -DEG90 1786 END IF 1787 1788 IF G.Lambda = DEG20 THEN 1789 South# = -DEG90 1790 END IF 1791 END IF 1792 1793 IF LongGrid% = -40 THEN 1794 South# = DEG60 1795 END IF 1796 1797 IF LongGrid% = 80 OR LongGrid% = -20 THEN 1798 South# = 0 1799 END IF 1800 1801 CALL LongitudeFOR(North#, South#, -LongDetail! * DEG2RAD) 1802 END IF 1803 END IF 1804 NEXT LongGrid% 1805 ' 1806 ' =========== 1807 ' Extension 2 (Left side of Northern Lobe 2) 1808 ' =========== 1809 ' 1810 G.Outline = TRUE 1811 G.Lambda2 = DEG30# 1812 1813 FOR LongGrid% = -40 TO -50 STEP -1 1814 Even% = (LongGrid% MOD G.LongStep = 0) 1815 IF Even% THEN 1816 IF LongGrid% > -50 AND LongGrid% < -40 THEN 1817 G.Lambda = LongGrid% * DEG2RAD 1818 PolyLine% = FALSE 1819 ' 1820 FOR LatGrid! = LatRange% TO 60 STEP -LongDetail! 1821 G.Phi = LatGrid! * DEG2RAD 1822 CALL DrawProjection(PolyLine%) 1823 PolyLine% = TRUE 1824 NEXT LatGrid! 1825 END IF 1826 END IF 1827 NEXT LongGrid% 1828 ' 1829 ' =========================================== 1830 ' Extension 1 (Right side of Northern Lobe 1) 1831 ' =========================================== 1832 ' 1833 G.Outline = TRUE 1834 G.Lambda2 = -DEG100 1835 1836 FOR LongGrid% = -10 TO -40 STEP -1 1837 Even% = (LongGrid% MOD G.LongStep = 0) 1838 IF Even% THEN 1839 IF LongGrid% > -40 AND LongGrid% < -10 THEN 1840 G.Lambda = LongGrid% * DEG2RAD 1841 PolyLine% = FALSE 1842 ' 1843 FOR LatGrid! = LatRange% TO 60 STEP -LongDetail! 1844 G.Phi = LatGrid! * DEG2RAD 1845 CALL DrawProjection(PolyLine%) 1846 PolyLine% = TRUE 1847 NEXT LatGrid! 1848 END IF 1849 END IF 1850 ' 1851 NEXT LongGrid% 1852 G.Outline = FALSE 1853 ' 1854 ' ============================================== 1855 ' Longitude Lines from 0 degrees to -180 Degrees 1856 ' ============================================== 1857 ' 1858 FOR LongGrid% = -40 TO -180 STEP -1 1859 1860 IF LongGrid% = -180 THEN EXIT FOR ' no real need to redraw -180 1861 1862 Even% = (LongGrid% MOD G.LongStep = 0) 1863 IF Even% THEN 1864 IF LongGrid% <= -40 THEN 1865 G.Lambda = LongGrid% * DEG2RAD 1866 PolyLine% = FALSE 1867 ' 1868 North# = LatRange% * DEG2RAD 1869 South# = -LatRange% * DEG2RAD 1870 1871 IF LatRange% = 85 THEN 1872 IF G.Lambda = -DEG100 THEN 1873 North# = DEG90 1874 END IF 1875 1876 IF G.Lambda = -DEG60 THEN 1877 South# = -DEG90 1878 END IF 1879 1880 IF G.Lambda = -DEG160 THEN 1881 South# = -DEG90 1882 END IF 1883 END IF 1884 1885 IF LongGrid% = -100 THEN 1886 South# = 0 1887 END IF 1888 1889 CALL LongitudeFOR(North#, South#, -LongDetail! * DEG2RAD) 1890 1891 END IF 1892 END IF 1893 ' 1894 NEXT LongGrid% 1895 ' 1896 END SUB '{ MakeLongitudeLines. } 1897 1898 FUNCTION MollweideFormula# (ThetaPrime#, MPhi#) STATIC 1899 ' From John Snyder's "Map Projections -- A Working Manual" 1900 ' Used by the Newton-Raphson iteration in the Mollweide portion 1901 ' of the Map subroutine 1902 ' 1903 MollweideFormula# = -(ThetaPrime# + SIN(ThetaPrime#) - MPhi#) / (1 + COS(ThetaPrime#)) 1904 ' 1905 END FUNCTION '{ MollweideFormula#. } 1906 1907 FUNCTION Normalize# (LambdaVal#, Lambda0Val#) STATIC 1908 ' 1909 ' This subroutine is responsible for placing the Longitude (Lambda) 1910 ' value into the correct part of the map in relation to the selected 1911 ' Central Longitude (Lambda0) of the map. 1912 ' 1913 LambdaDiff# = LambdaVal# - Lambda0Val# 1914 1915 DO WHILE ABS(LambdaDiff#) > DEG180 1916 IF LambdaDiff# < 0 THEN 1917 LambdaDiff# = LambdaDiff# + DEG360 1918 ELSE 1919 LambdaDiff# = LambdaDiff# - DEG360 1920 END IF 1921 LOOP 1922 1923 Normalize# = LambdaDiff# 1924 ' 1925 END FUNCTION ' { Normalize#. } 1926 1927 SUB PlotFileColorMenu 1928 ' 1929 ExitMenu% = FALSE 1930 ' 1931 DO 1932 CLS 1933 ' 1934 LOCATE 2, 11 1935 PRINT "** Change Plot File Pen Colors of Geographical Features **" 1936 LOCATE 4, 33: PRINT "Pen Color Codes" 1937 LOCATE 6, 29: PRINT "1 - Black 5 - Magenta" 1938 LOCATE 7, 29: PRINT "2 - Blue 6 - Yellow" 1939 LOCATE 8, 29: PRINT "3 - Red 7 - Cyan" 1940 LOCATE 9, 29: PRINT "4 - Green 8 - Brown" 1941 1942 LOCATE 12, 27: PRINT "1. Grid Pen is:"; G.GridPen 1943 LOCATE 13, 27: PRINT "2. Coast Pen is:"; G.CoastPen 1944 LOCATE 14, 27: PRINT "3. Country Border Pen is:"; G.BorderPen 1945 LOCATE 15, 27: PRINT "4. Island Pen is:"; G.IslandPen 1946 LOCATE 16, 27: PRINT "5. State Border Pen is:"; G.StatePen 1947 LOCATE 17, 27: PRINT "6. Lake Pen is:"; G.LakePen 1948 LOCATE 18, 27: PRINT "7. River Pen is:"; G.RiverPen 1949 LOCATE 20, 14 1950 INPUT "Select Option (1-7) or 0 to Return to Main Menu: ", Menu% 1951 1952 SELECT CASE Menu% 1953 ' 1954 CASE 0 1955 ExitMenu% = TRUE 1956 1957 CASE 1 1958 LOCATE 20, 1: PRINT SPACE$(80) 1959 LOCATE 20, 26 1960 INPUT "Change Grid Pen to (1-8):", NewPen% 1961 IF NewPen% >= 1 AND NewPen% < 9 THEN 1962 G.GridPen = NewPen% 1963 ELSE 1964 PRINT CHR$(7) 1965 END IF 1966 ' 1967 CASE 2 1968 LOCATE 20, 1: PRINT SPACE$(80) 1969 LOCATE 20, 23 1970 INPUT "Change Coastline Pen to (1-8):", NewPen% 1971 IF NewPen% >= 1 AND NewPen% < 9 THEN 1972 G.CoastPen = NewPen% 1973 ELSE 1974 PRINT CHR$(7) 1975 END IF 1976 ' 1977 CASE 3 1978 LOCATE 20, 1: PRINT SPACE$(80) 1979 LOCATE 20, 21 1980 INPUT "Change Country Border Pen to (1-8):", NewPen% 1981 IF NewPen% >= 1 AND NewPen% < 9 THEN 1982 G.BorderPen = NewPen% 1983 ELSE 1984 PRINT CHR$(7) 1985 END IF 1986 ' 1987 CASE 4 1988 LOCATE 20, 1: PRINT SPACE$(80) 1989 LOCATE 20, 25 1990 INPUT "Change Island Pen to (1-8):", NewPen% 1991 IF NewPen% >= 1 AND NewPen% < 9 THEN 1992 G.IslandPen = NewPen% 1993 ELSE 1994 PRINT CHR$(7) 1995 END IF 1996 ' 1997 CASE 5 1998 LOCATE 20, 1: PRINT SPACE$(80) 1999 LOCATE 20, 22 2000 INPUT "Change State Border Pen to (1-8):", NewPen% 2001 IF NewPen% >= 1 AND NewPen% < 9 THEN 2002 G.StatePen = NewPen% 2003 ELSE 2004 PRINT CHR$(7) 2005 END IF 2006 ' 2007 CASE 6 2008 LOCATE 20, 1: PRINT SPACE$(80) 2009 LOCATE 20, 26 2010 INPUT "Change Lake Pen to (1-8):", NewPen% 2011 IF NewPen% >= 1 AND NewPen% < 9 THEN 2012 G.LakePen = NewPen% 2013 ELSE 2014 PRINT CHR$(7) 2015 END IF 2016 ' 2017 CASE 7 2018 LOCATE 20, 1: PRINT SPACE$(80) 2019 LOCATE 20, 26 2020 INPUT "Change River Pen to (1-8):", NewPen% 2021 IF NewPen% >= 1 AND NewPen% < 9 THEN 2022 G.RiverPen = NewPen% 2023 ELSE 2024 PRINT CHR$(7) 2025 END IF 2026 ' 2027 CASE ELSE 2028 PRINT CHR$(7) 2029 2030 END SELECT '{ Menu. } 2031 ' 2032 LOOP UNTIL ExitMenu% 2033 ' 2034 END SUB '{ PlotFileColorMenu. } 2035 2036 FUNCTION PointCount& (PtCnt&) 2037 ' Used by GetPKDData subroutine 2038 ' 2039 CALL ReadInfile(Byte%) 2040 PtCnt& = Byte% * 100 2041 CALL ReadInfile(Byte%) 2042 PtCnt& = PtCnt& + Byte% 2043 PointCount& = PtCnt& 2044 ' 2045 END FUNCTION '{ PointCount&. } 2046 2047 FUNCTION PolyLineColor% (PolyLineHeader%) STATIC 2048 ' 2049 SELECT CASE PolyLineHeader% 2050 ' 2051 CASE 1000 TO 1999 2052 ' Coast 2053 PolyLineColor% = G.CoastColor 2054 PlotPen$ = LTRIM$(STR$(G.CoastPen)) 2055 ' 2056 CASE 2000 TO 2999 2057 ' Country Borders 2058 PolyLineColor% = G.BorderColor 2059 PlotPen$ = LTRIM$(STR$(G.BorderPen)) 2060 2061 CASE 3000 TO 3999 2062 ' Canadian Provinces 2063 PolyLineColor% = G.StateColor 2064 PlotPen$ = LTRIM$(STR$(G.StatePen)) 2065 2066 CASE 4000 TO 4999 2067 ' U.S. State borders 2068 PolyLineColor% = G.StateColor 2069 PlotPen$ = LTRIM$(STR$(G.StatePen)) 2070 2071 CASE 5000 TO 5999 2072 ' Islands 2073 PolyLineColor% = G.IslandColor 2074 PlotPen$ = LTRIM$(STR$(G.IslandPen)) 2075 2076 CASE 6000 TO 6999 2077 ' Lakes 2078 PolyLineColor% = G.LakeColor 2079 PlotPen$ = LTRIM$(STR$(G.LakePen)) 2080 2081 CASE 7000 TO 7999 2082 ' Rivers 2083 PolyLineColor% = G.RiverColor 2084 PlotPen$ = LTRIM$(STR$(G.RiverPen)) 2085 2086 CASE 8000 TO 8999 2087 ' Australian States 2088 PolyLineColor% = G.StateColor 2089 PlotPen$ = LTRIM$(STR$(G.StatePen)) 2090 ' 2091 END SELECT '{ PlineHeader. } 2092 2093 IF G.PlotFile THEN 2094 IF G.LastPlotPen <> PlotPen$ THEN 2095 PRINT #1, "SP" + PlotPen$ + ";" 2096 END IF 2097 2098 G.LastPlotPen = PlotPen$ 2099 END IF 2100 ' 2101 END FUNCTION '{ PolyLineColor%. } 2102 2103 FUNCTION Raise# (n#, Power#) 2104 ' Raise a number to a power 2105 ' (even negative numbers raised to a non-integer power) 2106 ' 2107 IF n# = 0 THEN 2108 IF Power# = 0 THEN 2109 Raise# = 1 2110 ELSE 2111 Raise# = 0 2112 END IF 2113 ELSE 2114 Raise# = Sign#(n#) * EXP(Power# * LN#(ABS(n#))) 2115 END IF 2116 ' 2117 END FUNCTION '{ Raise. } 2118 2119 SUB ReadInfile (Byte%) 2120 STATIC Rec AS STRING * 1 2121 ' Used by GetPKDData subroutine 2122 ' 2123 Index = Index + 1 'Record Count 2124 GET #1, , Rec 2125 Byte% = ASC(Rec) 2126 ' 2127 ' Convert to Signed Char 2128 IF Byte% > 127 THEN 2129 Byte% = Byte% - 256 2130 END IF 2131 ' 2132 END SUB '{ ReadInFile. } 2133 2134 FUNCTION Round# (n#, PowerOfTen%) STATIC 2135 ' 2136 pTen# = 10 ^ PowerOfTen% 2137 RTemp# = INT(n# / pTen# + .5) * pTen# 2138 Temp$ = STR$(RTemp#) 2139 Temp$ = MID$(Temp$, 1, ABS(PowerOfTen%) + 4) 2140 Round# = VAL(Temp$) 2141 ' 2142 END FUNCTION 2143 2144 FUNCTION Sec# (n#) 2145 ' 2146 Cosine# = COS(n#) 2147 IF ABS(Cosine#) <= 0# THEN 2148 PRINT "Error: Sec#(n#) where n# ="; n# 2149 PRINT " Cosine# ="; Cosine# 2150 SYSTEM 2151 ELSE 2152 Sec# = (1 / Cosine#) 2153 END IF 2154 2155 END FUNCTION 2156 2157 FUNCTION Sign# (n#) 2158 ' Return -1 if n# < 0, or +1 if n# >= 0 2159 ' 2160 IF n# = 0 THEN 2161 Sign# = 1 2162 ELSE 2163 Sign# = ABS(n#) / n# 2164 END IF 2165 ' 2166 END FUNCTION '{ Sign. } 2167