【问题标题】:Want to compare value at one geographic location to another location想要将一个地理位置的价值与另一个位置进行比较
【发布时间】:2019-02-06 22:01:27
【问题描述】:

我有一个数据框,其中包含纬度、经度、hwmQualityName、海拔、描述和其他非必要信息的列。下面显示的是仅纬度、经度、hwmQualityName、海拔和描述的数据框。在 latitude 列之前、description 列之后以及 latitude、longitude、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) 我想将每个位置的 elev_ft 值与半径为 300 英尺的周围位置的 elev_ft 值进行比较,以确定我正在查看的位置的 elev_ft 值是否是异常值。

2) 在识别出具有异常值的 elev_ft 值的位置后,我想使用 hwmQualityName 列和 hwm_locationdescription 列中的字符串来删除包含hwmQualityName 列中的单词“Poor”或包含单词“waves”或 hwm_locationdescription 列中与 wave 相关的任何其他单词。

我希望最终得到的是一个数据框,它根据上述条件删除了点。

我是 Python 新手,不知道解决此任务的最佳方法。

我们将不胜感激。

【问题讨论】:

  • 是沿海岸排列的纬度和经度,或者可以说位置1在顶部,位置2在底部,位置3又在顶部?
  • 应该是后者。每个对应点的纬度和经度在数据框中的组织方式是它们是随机的无序地理点。例如(不查看确切位置),数据框中的第一个点可能位于相对于数据框中的第二个点更北的位置,但数据框中的第三个点可能位于第二个点的北边,但第一个点的南边,不一定是第一个和第二个数据帧点的南边。

标签: python


【解决方案1】:

我相信距离函数对第 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

【讨论】:

    【解决方案2】:

    你有坐标,你想给出一个以英尺为单位的半径。如果你将英尺转换为你的坐标测量单位,你会让事情变得更容易,经度和纬度通常以度、分和秒为单位,1 秒约为 90 英尺。300 英尺 = 3.3 秒 = 0.055 分钟 = .00092度数。我对数字进行了四舍五入,因为看起来您不需要对距离非常精确,但它仍然应该精确到

    然后可以找到计算一个坐标是否在另一个坐标范围内的数学Here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多