我有一些来自ISS(国际空间站)的坐标,我想知道当坐标被记录时,ISS是在陆地还是海洋上,我应该离线完成这一点,但我不确定使用什么方法。来自Python标准库的一部分,我仅限于使用这些库:
numpy
scipy
tensorflow
pandas
opencv-python
opencv-contrib-python
evdev
matplotlib
logzero
pyephem
scikit-image
scikit-learn
reverse-geocoder
如果您知道如何使用其他库来实现这一点,无论如何都是很好的。
通过这段代码,我得到坐标并将其写入文件:
import logging
import logzero
from logzero import logger
import os
import ephem
import time
dir_path = os.path.dirname(os.path.realpath(__file__))
logzero.logfile(dir_path+"/coordinates.csv")
# Set a custom formatter
formatter = logging.Formatter('%(name)s - %(asctime)-15s - %(levelname)s: %(message)s');
logzero.formatter(formatter)
name = "ISS (ZARYA)"
line1 = "1 25544U 98067A 18282.18499736 .00001222 00000-0 25998-4 0 9992"
line2 = "2 25544 51.6418 170.6260 0003545 261.4423 234.4561 15.53790940136242"
iss = ephem.readtle(name, line1, line2)
iss.compute()
latitude = iss.sublat
longitude = iss.sublong
# Save the data to the file
logger.info("%s,%s", latitude, longitude )
你们有什么想法吗?先谢了。
4条答案
按热度按时间ngynwnxp1#
来自Karin托德的
global-land-mask
非常易于使用和高效:它可以通过
pip
获得,它唯一的依赖项是numpy
。zbwhf8kr2#
mpl_toolkits.basemap
可能会有帮助。文档:此处及相关方法如下:
**is_land(xpt,ypt)**如果给定的x,y点(投影坐标)在陆地上,则返回True,否则返回False。陆地的定义基于与类示例关联的GSHHS海岸线多边形。陆地区域内湖泊上的点不计为陆地点。
**注意:**您可能需要小心底图对象使用的投影。
axr492tv3#
最后,我只能使用这些库来解决我的问题。我使用这个网站geoplaner来获得海洋形状的粗略轮廓(它真的很粗糙,因为我是手工做的,但它对我的目的很好,我认为网上应该有一些更精确的多边形,但我不知道如何使用它们)。
我对每一个海洋都这样做,得到了这个(注意我使用的坐标并没有完全覆盖海洋,例如我避开了南大洋):
现在,太平洋更复杂,因为它延伸到Map的两边,你可以有两个连续的点,经度分别为-179和179,这导致这个多边形在xy平面上表现不好。我所做的是将它一分为二,所以我得到了这个:
据我所知,使用matplotlib,你可以用
path
从顶点(坐标列表)创建多边形,然后你可以使用contains_point()
函数来检查点是否在多边形中(因此它在“海洋”中)或不在“陆地”中:经度和纬度的变量,我用我的问题中的程序计算的国际空间站的变量。
mwyxok5s4#
在尝试将风车分为陆上和海上时,我无意中遇到了这个问题。这里给出的所有解决方案对我的情况来说都太不准确了,因为位于海岸线附近或荷兰艾瑟尔湖(IJsselmeer)等湖泊中的风车往往会被错误分类。所以我想出了一个自己的解决方案,基于立交桥:它在OSM中搜索给定国家的所有不同类型的水体,并将给定的坐标与它们匹配(或不)。它比这里提出的其他解决方案慢得多,你必须知道你想分类的东西所在国家的osmid,但从好的方面来说,它要准确得多。areaID是OSM-ID加上3600000000,由于某种原因才能作为立交桥的搜索区域