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

使用pydeck的PathLayer(或三层)从GeoDataFrame打印线串Z

轩辕风华
2023-03-14

我有一个带有LINESTRING Z几何图形的geodataframe:

我可以绘制组件点使用pydeck的ScatterplotLayer使用原始(不是地理)数据帧,但我也需要绘制完整,平滑,轨道。

我试过这个:

        layers = [ 
pdk.Layer(
    type = "PathLayer",
    data=tracks,
    get_path="geometry",
    width_scale=20,
    width_min_pixels=5,
    get_width=5,
    get_color=[180, 0, 200, 140],
    pickable=True,
    ),
]
view_state = pdk.ViewState(
    latitude=gdf_polygon.centroid.x,
    longitude=gdf_polygon.centroid.y,
    zoom=6,
    min_zoom=5,
    max_zoom=15,
    pitch=40.5,
    bearing=-27.36)

r = pdk.Deck(layers=[layers], initial_view_state=view_state)
return(r)

默默地失败了。尽管我可能会尝试,但我无法找到一种方法来转换LINESTRING Z的(如果需要,我可以不用Z组件)到pydeck将接受的对象。

共有1个答案

佘茂才
2023-03-14

我找到了一种从GeoPandas中提取所需信息的方法,并使其在pydeck中工作。您只需要应用一个函数,从形状几何图形中提取坐标作为列表。以下是一个完全可复制的示例:

import shapely
import numpy as np
import pandas as pd
import pydeck as pdk
import geopandas as gpd


linestring_a = shapely.geometry.LineString([[0,1,2],
                                            [3,4,5],
                                            [6,7,8]])

linestring_b = shapely.geometry.LineString([[7,15,1],
                                            [8,14,2],
                                            [9,13,3]])

multilinestring = shapely.geometry.MultiLineString([[[10,11,2],
                                                     [13,14,5],
                                                     [16,17,8]],
                                                    [[19,10,11],
                                                     [12,15,4],
                                                     [10,13,0]]])



gdf = gpd.GeoDataFrame({'id':[1,2,3],
                        'geometry':[linestring_a,
                                    linestring_b,
                                    multilinestring],
                        'color_hex':['#ed1c24',
                                     '#faa61a',
                                     '#ffe800']})

# Function that transforms a hex string into an RGB tuple.
def hex_to_rgb(h):
    h = h.lstrip("#")
    return tuple(int(h[i : i + 2], 16) for i in (0, 2, 4))

# Applying the HEX-to-RGB function above
gdf['color_rgb'] = gdf['color_hex'].apply(hex_to_rgb)

# Function that extracts the 2d list of coordinates from an input geometry
def my_geom_coord_extractor(input_geom):
    if (input_geom is None) or (input_geom is np.nan):
        return []
    else:
        if input_geom.type[:len('multi')].lower() == 'multi':
            full_coord_list = []
            for geom_part in input_geom.geoms:
                geom_part_2d_coords = [[coord[0],coord[1]] for coord in list(geom_part.coords)]
                full_coord_list.append(geom_part_2d_coords)
        else:
            full_coord_list = [[coord[0],coord[1]] for coord in list(input_geom.coords)]
        return full_coord_list

# Applying the coordinate list extractor to the dataframe
gdf['coord_list'] = gdf['geometry'].apply(my_geom_coord_extractor)

gdf_polygon = gdf.unary_union.convex_hull 

# Establishing the default view for the pydeck output
view_state = pdk.ViewState(latitude=gdf_polygon.centroid.coords[0][1], 
                           longitude=gdf_polygon.centroid.coords[0][0], 
                           zoom=4)

# Creating the pydeck layer
layer = pdk.Layer(
    type="PathLayer",
    data=gdf,
    pickable=True,
    get_color='color_rgb',
    width_scale=20,
    width_min_pixels=2,
    get_path="coord_list",
    get_width=5,
)

# Finalizing the pydeck output
r = pdk.Deck(layers=[layer], initial_view_state=view_state, tooltip={"text": "{id}"})
r.to_html("path_layer.html")

看起来pyDeck不能处理MultiLineString几何。请注意,在上面的示例中,我的原始数据框有3个几何,但在屏幕截图中只画了2行。

 类似资料:
  • 我正在回答以下面试问题: 一个进程有三个线程。第一个线程打印1 1 1...,第二个打印2 2 2...,第三个打印3 3 3...无休止。你如何安排这三个线程以打印1 2 3 1 2 3... 我想出了下面的代码,使用两个线程打印,但我无法找出如何从第三个线程在这里打印数字的条件。 如何有效地解决这类问题?

  • 我在eclipse中使用FreeMarker2.3.23生成报告。下面是数据模型的代码: ----FTL堆栈跟踪(“~”表示与嵌套相关):

  • 问题内容: 使用线程进行奇数打印,创建一个线程类,两个线程实例。 一个将打印奇数,而另一个将打印偶数。 我做了以下编码。但这涉及到死锁状态。有人可以解释一下原因吗? 输出: 奇数1偶数2 然后陷入僵局!!!!!! 谢谢你的帮助。 问题答案: 您正在等待并通知其他对象( 监视器 )。 这个想法是,你在做和做的时候可以打电话等待一个人做。 将您的方法更改为类似 和方法类似。 然后为提供一个对象: 输出

  • 问题内容: 我想更改网页上的某些内容。我也想隐藏一些东西。打印时,有没有办法用CSS做到这一点?我尤其希望能够隐藏一些DIV及其包含的所有DIV。 问题答案: 可以使用单独的打印样式表来实现。该属性是关键:

  • 我有一些代码,我认为应该打印到我的兄弟打印机,但它似乎什么也做不了。它快把我逼疯了!! 任何人任何想法都请 它不会失败或出错,按它应该的方式逐行遍历每一行,只是不会打印。标签/模板可以通过usb从我的电脑直接连接到Brother打印机上打印出来。打印机为PT-9700PC 我被难住了。

  • 问题内容: 我对熊猫和matplotlib还不熟悉。无法获取对 绘制模式如下的“DataFrame” 喜欢画三维图形w.r.t.x,y和z 这是我使用的示例代码 I am getting a empty graph plot. definitely missing something. Any pointers? -Thx Request-1: Print df Result of top 10