如何修复PostGIS中的InvalidParameterValue ST_DWithin()(在rails中)

时间:2016-10-25 12:51:15

标签: ruby-on-rails ruby postgresql postgis

我的桌子是

create_table :infomaps do |t|
  t.string :name_station
  t.string :name_location
  t.integer :waterlevel
  t.integer :rain
  t.integer :water_sealevel
  t.integer :tropical_level
  t.integer :bank_level
  t.string :river_name
  t.string :place
  t.st_point :lonlat, geographic: true
  t.integer :time
  t.timestamps null: false
end

我想使用以下示例代码:

SELECT name FROM nyc_streets WHERE ST_DWithin(
    geom,
    ST_GeomFromText('POINT(583571 4506714)',26918),
    10
  );

预期结果:

 name:Wall St, Broad St and   Nassau St

但是当尝试在轨道上的ruby中这样做时,像这样:

    @result = Infomap.find_by_sql("SELECT name_station FROM infomaps    WHERE ST_DWithin(lonlat,
    ST_GeomFromText('POINT(20 100)',26918),
    100); ")

我收到此错误:

PG::InvalidParameterValue: ERROR: Only lon/lat coordinate systems are supported in geography. : SELECT name_station FROM infomaps WHERE ST_DWithin(lonlat, ST_GeomFromText('POINT(20 100)',26918), 100); 

如何为ST_DWithin解决此InvalidParameterValue错误?

1 个答案:

答案 0 :(得分:0)

您正在混合使用if(values){ var first=values.first; var second=values.second; var third=values.third; var four=values.four; var five=values.five; var six=values.six; var seven=values.seven; var eight=values.eight; var nine=values.nine; var ten=values.ten; if(first){ userData.push(first); } if(second){ userData.push(second); } if(third){ userData.push(third); } if(four){ userData.push(four); } if(five){ userData.push(five); } if(six){ userData.push(six); } if(seven){ userData.push(seven); } if(eight){ userData.push(eight); } if(nine){ userData.push(nine); } if(ten){ userData.push(ten); } console.log(userData); geometry类型。有关更多背景信息,请参阅此PostGIS FAQ,并链接到其他更详细的讨论。

使用ST_DWithin时,两个参数必须属于同一类型。在同一投影坐标系中geography(想想lon / lat)或geography

请注意,您可以使用快捷geometry语法将geometry类型转换为geography。 e.g。

::geography

如果这不起作用,请尝试将几何点明确转换为EPSG代码4326,例如

SELECT name_station FROM infomaps
    WHERE ST_DWithin(
        lonlat::geography,
        ST_GeomFromText('POINT(20 100)',26918)::geography,
        100);

或者,将您的lonlat点转换为与SELECT name_station FROM infomaps WHERE ST_DWithin( lonlat::geography, ST_Transform(ST_GeomFromText('POINT(20 100)', 26918), 4326)::geography, 100); 点相同的投影坐标参考系统,计算速度应该更快一些(尽管根据您的使用情况可能会忽略不计):

geometry