我有一个数据框,其中包含用于纬度,经度,hwmQualityName,海拔,描述和其他非必要信息的列。下面显示的是仅适用于纬度,经度,hwmQualityName,海拔和描述的数据框。数据框中在纬度列之前,描述列之后以及在纬度,经度,hwmQualityName,elev_ft和hwm_locationdescription列之间还有其他具有值的列:
import numpy as np
import matplotlib.pyplot as plt
import netCDF4 as nc4
import os
import sys
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)
import plotly.offline as po
import plotly.graph_objs as go
from mpl_toolkits.basemap import Basemap
import pathlib as pl
import matplotlib as mpl
import pandas as pd
import sys;sys.path.append('../ncsurge')
from importlib import reload
import geopandas as gpd
from shapely.geometry import Point, MultiPoint
from shapely.ops import nearest_points
from hwm import *
root_hwm = pl.Path(r'P:\Temp\bpozo\Scripts\HWM')
A = pd.read_csv(str(root_hwm / 'FilteredHWMs.csv'))
hwm_m = gpd.GeoDataFrame(A)
hwm_m
latitude longitude hwmQualityName elev_ft hwm_locationdescription
35.281050926 -76.6625853795 'Excellent: +/- 0.05 ft' 7.288 'side of left garage'
34.676933 -77.080633 'Poor: +/- 0.40 ft' 12.241 'outside marked with pen'
...
34.94107586 -76.6507665736 'Good: +/- 0.10 ft' 6.025 'side of post'
在海岸线上有一定数量的这些点(例如100个点),在地图上看到时,它们彼此相对靠近。我要做的是几件事:
1)我想将给定半径为300英尺的每个位置的elev_ft值与周围位置的elev_ft值进行比较,以确定我正在查看的位置处的elev_ft值是否是异常值。
2)确定具有elev_ft值是异常值的位置后,我想使用hwmQualityName列和hwm_locationdescription列中的字符串来删除包含以下内容的所有点(即,从数据框中删除整行) hwmQualityName列中的单词“ Poor”,或在hwm_locationdescription列中包含单词“ waves”或与wave相关的任何其他单词。
最后我希望有一个数据框,该数据框已根据上述条件删除了点。
我是Python的新手,我不知道解决此任务的最佳方法。
我们将不胜感激。
答案 0 :(得分:0)
我相信距离函数对第1部分有用。这是我在网上最常使用/找到的一个:
def calculate_distance(latitude1, longitude1, latitude2, longitude2):
import math
latitude1 = math.radians(latitude1)
longitude1 = math.radians(longitude1)
latitude2 = math.radians(latitude2)
longitude2 = math.radians(longitude2)
delta_lon = abs(longitude1 - longitude2)
delta_lat = abs(latitude1 - latitude2)
term1 = math.sin(delta_lat / 2) ** 2
term2 = math.cos(latitude1) * math.cos(latitude2) * math.sin(delta_lon / 2) ** 2
a = term1 + term2
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
distance = c * 6378100 # c * radius of Earth in meters
return distance
您可以使用此功能确定其“ 300英尺”部分。我应该注意,这会返回以米为单位的距离,我不确定精度。我相信当我对其进行测试时,该功能可以达到99.8%的准确度,但是如果您要精确测量,那可能还不够准确
要归功于我发现数学的地方:https://www.movable-type.co.uk/scripts/latlong.html
答案 1 :(得分:0)
您有坐标,并且想要提供一个以英尺为单位的半径。如果将英尺转换为坐标单位,经度和纬度通常以度,分和秒为单位,并且1秒约为90英尺,则会使自己的事情变得容易得多。300英尺= 3.3秒= 0.055分钟= .00092离开。我对这些数字进行了四舍五入,因为看起来您不需要在距离上非常精确,但是在小于10英尺的地方仍然应该是精确的。
然后可以找到确定一个坐标是否在另一个坐标范围内的数学方法Here