2009-07-07 3 views
2

postgres db 에 저장된 다각형의 점을 검색하고 싶습니다. DB를 의 내용은 다음과Libpqxx를 사용하여 Postgres에 저장된 다각형의 점에 어떻게 액세스합니까?

polygonid |vertices 
-----------+--------------------------------------------------------------------- 
     2 |((1,0),(1.5,-1),(2,-1),(2,1),(1,1),(0,0),(0,2),(3,2),(3,-2),(1,-2)) 
     4 | ((3,3),(4,4),(5,5)) 

정점 컬럼 형 다각형이다.

저는 C++ 용 libpqxx 라이브러리를 사용하고 있습니다.

result R = W.exec ("select * from polygon_tbl"); 
    for (result::const_iterator r = R.begin(); 
     r != R.end(); 
     ++r) 
    { 
     int x = 0; 
     cout << "Polygon ID: " << r[0].to(x) << endl; 

     //Suppose i would like to print the first point of every polygon, 
     //how would i access it? 
     cout << "First vertex: " << r[1][0] << endl; ??? 

     //Or suppose i would like to print the first x coordinate of 
     //every polygon, how would i access it? 
     cout << "First x coordinate: " << r[1][0][0] << endl; //???? (am just guessing here..) 

    } 

미안 libpqxx 매우 새로 온 :

은 가정하자 나는 내가 C++에서이 문을 실행할 것, 검색하고 정점 열에서 포인트를 액세스하려는. libpqxx 이 어떻게 작동하는지 꽤 많이 이해했지만 Polygon 유형이 붙어 있습니다. Postgres에서 우리의 폴리곤에 대한 간단한 저장소가 필요하지만 libpqxx를 사용하여 에 액세스하는 방법을 모르겠습니다.

답변

0

libpqxx에 익숙하지 않지만 대부분의 클라이언트 라이브러리에서 결과가 문자열로 반환됩니다. 그래서 첫 번째 단계로 문자열을 필드로 변환하고 그것을 인쇄하려고합니다. 그렇다면 그것이 psql에 보이는 방식으로 보게되면, 더 쉽게 작업 할 수있는 뭔가를 스스로 파싱합니다.

+0

안녕하세요. 실제로 r [1] .c_str()을 사용하여 문자열로 검색 할 수 있습니다. 그런 다음 문자열을 구문 분석하여 값을 가져옵니다. 우리가 얻는 문자열은 ((3,3), (4,4), (5,5))와 같습니다. 그걸로 우리는 그것을 파싱 할 수 있지만 이것을 최후의 수단으로 들고 있습니다. 그것이 그걸 할 수있는 유일한 방법이라면 파싱이 답입니다. 하지만 libpqxx에 대한 리소스가 많지 않기 때문에 이것이 최선의 방법인지 확실하지 않습니다. –

0

당신은 당신의 poylgon를 구축하는 정규식을 사용할 수 있습니다 :/(\ D \ D)/

공지 사항 당신이 그 (것)들을 경기 개체 반복 검색 할 수 있도록 내부 번호가 그룹화됩니다. 각 반복은 다각형에 xy 쌍을 추가합니다. \ d 대신 부동 소수점과 일치 할 수있는 정규 표현식을 사용해야합니다.

그러나이 경우 좌표를 검색하기 전에 문자열의 유효성을 올바르게 검사 할 수 없습니다. 한편 대한

+0

안녕하세요. 정보를 제공해 주셔서 감사합니다. 문자열 조작을 할 수 있지만 C++/libpqxx가 쉽게 사용할 수있는 일부 유형의 컨테이너에 Postgres 폴리곤/포인트 유형을 캐스팅 할 생각을했습니다. 이게 내가 찾는거야. 아무 것도 없다면 문자열 조작에 의존해야 할 것입니다. –

2

난 그냥이를 사용하여 문자열을 토큰 화하는 것입니다 :

typedef boost::tokenizer<boost::char_separator<char> > tokenizer; 
boost::char_separator<char> sep(",()"); 
tokenizer tokens(str_coordinates, sep); 
for (tokenizer::iterator tok_iter = tokens.begin(); 
    tok_iter != tokens.end(); ++tok_iter) 
    { 
     std::cout << "x:<" << *tok_iter << "> "; 
     ++tok_iter; 
     std::cout << "y:<" << *tok_iter << "> " << endl; 
    } 
2

당신이 ST_X()ST_Y()를 사용할 수 없습니다를?

선 스트링의 N 번째 점에 액세스하려면 ST_PointN이 있습니다.