#### Overview of this book

Geospatial analysis is used in almost every domain you can think of, including defense, farming, and even medicine. With this systematic guide, you'll get started with geographic information system (GIS) and remote sensing analysis using the latest features in Python. This book will take you through GIS techniques, geodatabases, geospatial raster data, and much more using the latest built-in tools and libraries in Python 3.7. You'll learn everything you need to know about using software packages or APIs and generic algorithms that can be used for different situations. Furthermore, you'll learn how to apply simple Python GIS geospatial processes to a variety of problems, and work with remote sensing data. By the end of the book, you'll be able to build a generic corporate system, which can be implemented in any organization to manage customer support requests and field support personnel.
Preface
Free Chapter
Section 1: The History and the Present of the Industry
Learning about Geospatial Analysis with Python
Learning Geospatial Data
The Geospatial Technology Landscape
Section 2: Geospatial Analysis Concepts
Geospatial Python Toolbox
Python and Geographic Information Systems
Python and Remote Sensing
Python and Elevation Data
Section 3: Practical Geospatial Processing Techniques
Real-Time Data
Putting It All Together
Other Books You May Enjoy

# Calculating line direction

In addition to distance, you will often want to know the bearing of a line between its endpoints. We can calculate this line direction from one of the points using only the Python math module:

1. First, we import the math functions we'll need:
`from math import atan2, cos, sin, degrees`
1. Next, we set up some variables for our two points:
`lon1 = -90.21lat1 = 32.31lon2 = -88.95lat2 = 30.43`
1. Next, we'll calculate the angle between the two points:
`angle = atan2(cos(lat1)*sin(lat2)-sin(lat1) * \  cos(lat2)*cos(lon2-lon1), sin(lon2-lon1)*cos(lat2))`
1. Finally, we'll calculate the bearing of the line in degrees:
`bearing = (degrees(angle) + 360) % 360print(bearing)309.3672990606595`

Sometimes, you end up with a negative bearing value. To avoid this issue, we add 360 to the result to avoid a negative number and use the Python modulo operator to keep...