gpt4 book ai didi

ruby-on-rails - RGeo:将多边形投影到具有不同 SRID 的谷歌地图上

转载 作者:行者123 更新时间:2023-12-05 09:23:10 29 4
gpt4 key购买 nike

我有一个代表学区的多边形,它是我从 NYC Open Data 导入的.我相信坐标在 epsg projection 2263 - nad83 / new york long island

我无法将坐标转换为 Google map 可用的格式。

这是我从原始 shapefile 导入多边形的代码:

proj4 = "+proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs"
factory = RGeo::Geographic.projected_factory(:projection_proj4 => proj4, :projection_srid => 2263)

RGeo::Shapefile::Reader.open("/Users/dmanaster1/flatiron_school/nycdata/db/source/ES_Zones_2013-2014.shp", :factory => factory.projection_factory) do |file|
file.each do |record|
school_zone = ES_Zone.new
...
school_zone.geometry = record.geometry
school_zone.save
end
file.rewind
end

在我的模型中:

class ES_Zone < ActiveRecord::Base
proj4 = "+proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs"
FACTORY = RGeo::Geographic.projected_factory(:projection_proj4 => proj4, :projection_srid => 2263)
set_rgeo_factory_for_column(:geometry, FACTORY.projection_factory)
end

在我的 Controller 中:

  def index
polygons = format_polygon(ES_Zone.first)
gon.polygons = JSON.parse(polygons.to_json)
end

private

def format_polygon(zone)
array = Array.new
zone.geometry.each do |polygon|
polygon.exterior_ring.points.each do |point|
x = point.x
y = point.y
array << { "lng" => x, "lat" => y }
end
end
[array]
end

我知道我遗漏了一些关于如何转换坐标的信息,但我不确定从这里到哪里去,即使在阅读 Daniel Azuma 的 excellent guide 之后也是如此.有人知道怎么做吗?

最佳答案

我通常不使用 rgeo 转换数据,但我了解坐标系,所以 dazuma 的指南对我来说非常清楚。

您首先定义 WGS84(它将在 Google map 上呈现得很好,它使用的坐标系略有不同,但它们映射完美)

wgs84_proj4 = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'

wgs84_factory = RGeo::Geographic.spherical_factory(:srid => 4326, :proj4 => wgs84_proj4)

现在您有一个可以创建 WGS84 点/几何的工厂。现在使用该工厂来转换您的几何图形。

假设您已经使用您指定的工厂为您的 ES_Zone 创建了几何体,那么您可以简单地做

some_es_zone_wgs84 = RGeo::Feature.cast(some_es_zone, :factory => wgs84_factory, :project => true)

但是如果您从数据库中获取它们,工厂将具有正确的 srid,但没有正确的 proj4 信息来执行此转换。但是,这很容易修复:

some_es_zone = ES_Zone.find(params[:id])
some_es_zone_2263 = RGeo::Feature.cast(some_es_zone, :factory => 2263_factory, :project => false)
some_es_zone_wgs84 = RGeo::Feature.cast(some_es_zone, :factory => wgs84_factory, :project => true)

简而言之:在不投影几何体的情况下使用正确的工厂进行转换,然后将其转换到所需的坐标系和项目。因为我们现在指定了 from 和 to,所以它会起作用。

现在您可以使用 rgeo-geojson gem 将其转换为 geoJson 并将其发送到您的浏览器。

如果您像我一样使用 postgis,我通常只使用 postgis 功能来创建 geoJson,然后将其包含在我的页面中并使用传单呈现。

因此,我将以下方法添加到我的模型中:

def as_geojson
sql = "SELECT ST_asgeojson(ST_Transform(ST_SetSRID(geom,31370),4326)) FROM samples where id = #{self.id};"

cursor = Sample.connection.execute(sql)
cursor.first["st_asgeojson"]
end

请注意,我将我的几何图形从比利时坐标系 (EPRS 31370) 转换为 wgs84 (EPRS 4326)并一次性将其转换为 geojson。 postgis 也知道所有的投影,并且它们得到维护,所以我不必摆弄 proj4 定义。

我使用的另一种选择(取决于空间数据量)是我使用地理服务器来提供空间数据。因此,当我使用 rails 来存储和维护它时,我使用 geoserver 来有效地托管和查询它(以及前端的 openlayers)。但它确实涉及设置一个额外的组件。所以这取决于您的需求。

关于ruby-on-rails - RGeo:将多边形投影到具有不同 SRID 的谷歌地图上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23918272/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com