Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RGeo:使用不同的SRID将多边形投影到google地图上_Ruby On Rails_Geospatial_Rgeo - Fatal编程技术网

Ruby on rails RGeo:使用不同的SRID将多边形投影到google地图上

Ruby on rails RGeo:使用不同的SRID将多边形投影到google地图上,ruby-on-rails,geospatial,rgeo,Ruby On Rails,Geospatial,Rgeo,我有一个表示学区的多边形,我是从中导入的。我相信座标是正确的 我无法将坐标转换为谷歌地图可用的格式 以下是我从原始形状文件导入多边形的代码: 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.304800

我有一个表示学区的多边形,我是从中导入的。我相信座标是正确的

我无法将坐标转换为谷歌地图可用的格式

以下是我从原始形状文件导入多边形的代码:

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
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
class ES_Zoneproj4,:projection\u srid=>2263)
为列设置工厂(:几何体、工厂、投影工厂)
结束
在我的控制器中:

  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
def索引
多边形=格式化多边形(ES\U区域。第一个)
gon.polygons=JSON.parse(polygons.to_JSON)
结束
私有的
def格式_多边形(分区)
array=array.new
zone.geometry.each do|多边形|
多边形.外部|环.点.每个do |点|
x=点x
y=点y
数组x,“lat”=>y}
结束
结束
[阵列]
结束

我知道我缺少了一些关于如何转换坐标的知识,但我不知道从这里开始该怎么做,即使在读了Daniel Azuma的书之后。有人知道怎么做吗?

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

首先定义WGS84(它将在GoogleMaps上渲染,GoogleMaps使用稍微不同的坐标系,但它们映射得非常完美)

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

假设您已使用指定的工厂为
ES_区域
创建了几何图形,则只需执行以下操作即可

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,然后将其包含在我的页面中,并使用传单呈现

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

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
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
定义


我使用的另一种替代方法(取决于空间数据的数量)是使用geoserver为空间数据提供服务。因此,当我使用rails存储和维护它时,我使用geoserver高效地托管和查询它(以及前端的openlayers)。但它确实需要设置一个额外的组件。因此,这取决于您的需要。

没有任何反馈?注意到一个小缺陷:从数据库获取几何图形时,它们将具有正确的srid,但工厂将没有正确的proj4信息。相应地更新了我的答案。