当前位置: 首页 > 知识库问答 >
问题:

使用参考点将本地坐标投影到全球GPS

闻人嘉悦
2023-03-14

我在geopandas GeoDataFrame中有一堆形状(例如ShapelyLineStrings或Polygons)。这些形状指定本地200x200米网格中的坐标,即所有坐标都在(0,0)和(200,200)之间。

我现在想在全球范围内“放置”这些线条。为此,我想指定一个GPS点(给定的lat/lon)作为参考。

我的第一个(天真的)方法是使用GeographicalIB,获取所有形状的坐标(在本地X/Y中),应用以下转换并“重新创建”形状:

# Convert coordinates to GPS location
from shapely.geometry import LineString
from geographiclib.geodesic import Geodesic
geod = Geodesic.WGS84  # the base geodesic (i.e. the world)

origin = (48.853772345870176, 2.350983211585546)  # this is somewhere in Paris, for example

def local_to_latlong(x, y, orientation=0, scale=1):
    """ Two step process.
    - First walk x meters to east from origin.
    - Then, from that point, walk y meters north from origin.
    
    Optional: 
    - orientation allows to "spin" the coordinates
    - scale allows to grow/shrink the distances
    """
    go_X = geod.Direct(*origin, orientation + 90, x * scale)  # x is East-coordinate
    go_Y = geod.Direct(go_X["lat2"], go_X["lon2"], orientation + 0, y * scale)  # y is North-coordinate
    return go_Y["lat2"], go_Y["lon2"]


original_line = LineString([(0,0), (100,100), (200,100)])
global_line = LineString([local_to_latlong(x, y) for y, x in original_line.coords])

然而,我希望这不是最聪明的方法,还有更聪明的方法...

我想将这样的变换应用于GeoDataFrame中的任何形状。理想情况下,使用“to_crs”可以工作,但我不确定如何变换形状,使其“参照原点”,以及使用哪个crs。

共有1个答案

赵选
2023-03-14
  • 鉴于您的原点是EPSG: 4326,您可以估计UTM区域
  • 有了这个,你可以得到原点的UTM区域坐标
  • 将您自定义的200x200米区域转换为UTM区域的坐标
  • 最后用to_crs()转换成EPSG: 4326
import shapely.geometry
import geopandas as gpd
import pandas as pd
import numpy as np

# generate some polygons (squares), where grid is 200*200
gdf = gpd.GeoDataFrame(
    geometry=pd.DataFrame(
        np.repeat(np.sort(np.random.randint(0, 200, [20, 2]), axis=1), 2, axis=1)
    ).apply(lambda d: shapely.geometry.box(*d), axis=1)
)
# chage to linestrings, clearer when we plot
gdf["geometry"] = gdf["geometry"].exterior

origin = (2.350983211585546, 48.853772345870176)  # this is somewhere in Paris, for example

# work out utm crs of point.  utm is in metres
gdf_o = gpd.GeoDataFrame(geometry=[shapely.geometry.Point(origin)], crs="EPSG:4326")
crs = gdf_o.estimate_utm_crs()
# where is origin in utm zone
xo,yo = gdf_o.to_crs(crs).loc[0,"geometry"].xy

# translate custom zone to co-ordinates of utm zone
# assume point is center of 200x200 grid (hence subtract 100)
gdf_gps = gdf["geometry"].translate(xoff=xo[0]-100, yoff=yo[0]-100).set_crs(crs).to_crs("epsg:4326")

# plot on map to show it has worked...
m = gdf_gps.explore()
m = gdf_o.explore(m=m, color="red", marker_kwds={"radius":20})
m


 类似资料:
  • 完成1.1节和1.2节案例后,想必你已经迫切希望呈现出三维的效果,不过在实现三维效果之前,本节课预先进行三维坐标系的讲解。 在xyz轴上分别设置一个顶点,三个顶点确定一个三角形,然后通过WebGL渲染出来,本节课的目的就是通过这样一个案例让你建立WebGL三维坐标系和投影两个概念。本节课的渲染效果并不是上图所表达的效果,上图只是给你展示下三个顶点如何构成了一个三角形区域。 源码中通过下面代码定义了

  • 问题内容: 我正在使用jProfiler查找Java swing应用程序中的内存泄漏。我确定了数量不断增长的JFrame实例。 此框架被打开,然后关闭。 使用jProfiler并查看GC根目录的路径,只有一个引用“ JNI全局引用”。 这是什么意思?为什么将它挂在框架的每个实例上? 问题答案: Wikipedia很好地概述了Java本机接口,从本质上讲,它允许Java与以其他语言编写的本机操作系统

  • 一个点的spherical coordinates(球坐标)。 构造函数 Spherical( radius : Float, phi : Float, theta : Float ) radius - 半径值,或者说从该点到原点的 Euclidean distance(欧几里得距离,即直线距离)。默认值为1.0。 phi - 与 y (up) 轴的极坐标角(以弧度为单位)。 默认值为 0。 th

  • 我正在尝试将球坐标转换为笛卡尔坐标,以绘制一个简单的三维金字塔。 下面是获取金字塔四个主要角的代码,具体取决于极角yrad和方位角xrad以及顶点坐标x和y: 方位角轴似乎工作正常,但问题是,在操纵极轴角时,当它们越过天顶或底部时,左右会互换,如图所示(选择顶部的mp4以更平滑地播放):http://gyazo.com/4a245713c232893960863cf4ea4186f6 怎么了?

  • vote|投票标签: 标签名称:vote 标记简介: 功能说明:用于获取一组投票表单 适用范围:全局使用 基本语法: {dede:vote id='' lineheight='22' tablewidth='100%' titlebgcolor='#EDEDE2' titlebackground='' tablebgcolor='#FFFFFF'/} 参数说明: id='' 数字,当前投票ID l

  • D3默认包括了一些常见投影,如下所示。众多的(不太常用的)投影在扩展地理投影插件和多面体投影插件中是可用的。 由D3提供的大多数投影都是通过d3.geo.projection来创建并配置的,你可以旋转这个地球,缩放或转换画布等。除非你正在执行一个新的原始投影,否则你可能不会用D3.geo.projection来构造,但是你有可能使用这个配置方法。 d3.geo.projection(raw) 从指

  • 问题内容: 我有一个来自3轴加速度计(XYZ)的300万个数据点的数组,我想向该数组添加3列,其中包含等效的球坐标(r,theta,phi)。以下代码有效,但似乎太慢了。我该如何做得更好? 问题答案: 这类似于Justin Peel的答案,但是使用just并利用其内置的矢量化功能: 请注意,正如注释中所建议,我已经从您的原始功能 更改了仰角的定义 。在使用进行测试的机器上,时间从76秒缩短到3.3

  • 所以我想在10x10坐标系中转换不同支点之间的三个点 想象我想要什么: 这是我的第一个坐标系 翻译成: 现在,这些点必须保持在不同系统之间的同一点上,因此只有这些点的坐标应该更改。首先,我想我应该把之前的原点添加到转换后的坐标中,这对A和B是有效的,但C是不同的,也许我使用了一个错误的公式或其他东西 请你帮帮我