【问题标题】:Converting latitude and longitude to UTM coordinates in pyspark在pyspark中将纬度和经度转换为UTM坐标
【发布时间】:2018-06-28 07:23:03
【问题描述】:

我的数据框包含每个点的经度和纬度坐标。我想将每个点的地理坐标转换为 UTM 坐标。

我尝试使用 utm 模块 (https://pypi.org/project/utm/)

import utm
df=df.withColumn('UTM',utm.from_latlon(fn.col('lat'),fn.col('lon')))

但我收到此错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-39-8b21f98738ca> in <module>()
----> 1 df=df.withColumn('UTM',utm.from_latlon(fn.col('lat'),fn.col('lon')))

~\Anaconda3\lib\site-packages\utm\conversion.py in from_latlon(latitude, longitude, force_zone_number)
    152        .. _[1]: http://www.jaworski.ca/utmzones.htm
    153     """
--> 154     if not -80.0 <= latitude <= 84.0:
    155         raise OutOfRangeError('latitude out of range (must be between 80 deg S and 84 deg N)')
    156     if not -180.0 <= longitude <= 180.0:

F:\spark\spark\python\pyspark\sql\column.py in __nonzero__(self)
    633 
    634     def __nonzero__(self):
--> 635         raise ValueError("Cannot convert column into bool: please use '&' for 'and', '|' for 'or', "
    636                          "'~' for 'not' when building DataFrame boolean expressions.")
    637     __bool__ = __nonzero__

ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.

更新:

创建udf后应用utm或pyproj函数

结果是:

+--------------------+
|                 UTM|
+--------------------+
|[Ljava.lang.Objec...|
|[Ljava.lang.Objec...|
|[Ljava.lang.Objec...|
|[Ljava.lang.Objec...|
|[Ljava.lang.Objec...|
+--------------------+
only showing top 5 rows

【问题讨论】:

  • 你需要创建一个udf并应用utm函数。
  • 好的。谢谢你的回复
  • 如果您觉得答案有用,请点赞并接受 :)

标签: python-3.x pyspark utm pyproj


【解决方案1】:

类似的,

import pyspark.sql.functions as F
import utm
from pyspark.sql.types import *

utm_udf_x = F.udf(lambda x,y: utm.from_latlon(x,y)[0], FloatType())
utm_udf_y = F.udf(lambda x,y: utm.from_latlon(x,y)[1], FloatType())

df = df.withColumn('UTM_x',utm_udf_x(F.col('lat'), F.col('lon')))
df = df.withColumn('UTM_y',utm_udf_y(F.col('lat'), F.col('lon')))

虽然我不知道你为什么在最后写[1]

【讨论】:

  • 我按照以上几行,但我得到了错误:TypeError: () 需要 1 个位置参数,但给定了 2 个
  • 'Py4JJavaError: 调用 o513.showString 时出错。 :org.apache.spark.SparkException:作业因阶段失败而中止:阶段 20.0 中的任务 2 失败 1 次,最近一次失败:阶段 20.0 中丢失任务 2.0(TID 40,本地主机,执行程序驱动程序):org.apache.spark .api.python.PythonException: Traceback(最近一次调用最后一次):'
  • @mayank agrawal !你帮我解决这个新问题?
  • 结果不清楚可以查看更新部分
  • utm 的输出类型究竟应该是什么?
猜你喜欢
  • 2011-02-11
  • 2021-07-18
  • 2015-07-13
  • 2013-09-09
  • 2019-12-04
  • 2013-02-14
  • 2016-07-30
  • 2021-07-31
  • 1970-01-01
相关资源
最近更新 更多