0 투표
PHP 개발자 입니다.

등산로 정보 shp 파일을 php 에서 열어볼려고 하는데, dbf 파일하고 같이 있어서요.

dbf 파일을 열려면 dbase 모듈이 필요한데, 어떻게 사용한는지 알려주세요.

2 답변

0 투표

요약해서 말씀드리면, shp 파일 자체를 PHP에서 직접 읽는 게 아니라, 함께 있는 DBF 파일을 dbase 확장으로 읽어서 속성 데이터만 처리하시면 됩니다. 좌표(도형) 정보는 PHP 단독으로 다루기엔 한계가 있어서 보통 다른 도구를 병행합니다.

먼저 전제부터 정리하면, shapefile은 최소 3개 파일이 한 세트입니다. .shp는 실제 도형(좌표), .shx는 인덱스, .dbf는 속성 데이터(테이블)입니다. PHP의 dbase 확장으로 다룰 수 있는 건 DBF 파일뿐입니다.


1️⃣ dbase 확장 설치 및 활성화

리눅스(Ubuntu 기준)

sudo apt-get install php-dbase
sudo service apache2 restart

확인

phpinfo();

또는

var_dump(function_exists('dbase_open'));

true가 나오면 정상입니다.

⚠️ 참고 최신 PHP(8.x)에서는 dbase 확장이 기본 저장소에서 빠진 경우가 많습니다. 이 경우 PHP 7.x 환경 또는 PECL 설치를 고려해야 합니다.


2️⃣ DBF 파일 열기 기본 예제

$dbf = dbase_open('/path/to/file.dbf', 0);

if (!$dbf) {
    die('DBF 파일을 열 수 없습니다.');
}

$recordCount = dbase_numrecords($dbf);
$fieldInfo   = dbase_get_header_info($dbf);

for ($i = 1; $i <= $recordCount; $i++) {
    $row = dbase_get_record_with_names($dbf, $i);

    if ($row['deleted']) continue;

    // 예시 출력
    echo $row['TRAIL_NAME'];
}

dbase_close($dbf);

중요 포인트

  • 레코드 인덱스는 1부터 시작
  • dbase_get_record_with_names()를 쓰면 컬럼명이 키로 나와서 편함
  • deleted 필드는 항상 체크

3️⃣ 한글 깨짐 문제 처리

DBF는 대부분 EUC-KR 또는 CP949로 저장돼 있습니다.

$value = iconv('EUC-KR', 'UTF-8', $row['NAME']);

한글이 깨진다면 거의 100% 인코딩 문제입니다.


4️⃣ shp 좌표 데이터는 어떻게 하나요?

PHP만으로 .shp를 직접 파싱하는 건 비추천입니다. 현실적인 방법은 다음 중 하나입니다.

  1. ogr2ogr (GDAL) 사용해서 변환

    ogr2ogr -f GeoJSON output.json input.shp
    

    → PHP에서 JSON 처리

  2. PostGIS에 적재

    shp2pgsql input.shp trails | psql
    

    → PHP에서는 DB 조회만 담당

  3. QGIS / Python에서 전처리 → 결과를 JSON/CSV로 넘김

실무에서는 PHP는 DBF + 변환된 결과를 읽는 역할만 맡기는 게 가장 안정적입니다.


5️⃣ 결론 정리

  • dbase 확장은 DBF 파일 읽기 전용
  • shp의 속성 데이터 확인·조회는 문제 없음
  • 좌표 처리까지 PHP로 하려 하지 말 것
  • GDAL + JSON 변환 후 PHP 연동이 가장 깔끔

즉, DBF는 PHP(dbase), 좌표는 외부 도구 이 조합이 정답에 가깝습니다. 이렇게 구성하시면 등산로 정보 처리도 충분히 안정적으로 가능합니다.

0 투표

아래처럼 PHP dbase 확장으로 .dbf(DBASE) 파일을 열어서 레코드를 읽을 수 있습니다. (shp의 속성은 보통 같은 이름의 .dbf에 들어있어요)


1) dbase 확장 설치/활성화

Ubuntu / Debian

sudo apt update
sudo apt install php-dbase
sudo phpenmod dbase
sudo systemctl restart apache2   # Apache면
# 또는
sudo systemctl restart php8.2-fpm # PHP-FPM이면 (버전은 환경에 맞게)

설치 확인:

php -m | grep dbase

Windows (XAMPP/WAMP 등)

  • php.ini에서 아래 주석 제거

    extension=dbase
    
  • 웹서버 재시작 후 phpinfo()에서 dbase 로드 확인

만약 패키지가 없거나 로드가 안 되면, 사용 중인 PHP 버전(예: 8.1/8.2)과 설치 방식(apt, source, windows)을 알려주시면 그 버전에 맞춰 안내드릴게요.


2) DBF 읽기 예제 코드

<?php
$dbfPath = __DIR__ . "/trail.dbf";   // shp와 같은 베이스 이름의 dbf 경로
$mode = 0; // 0=읽기 전용, 1=읽기/쓰기

$db = dbase_open($dbfPath, $mode);
if (!$db) {
    die("DBF 파일을 열 수 없습니다: {$dbfPath}");
}

$header = dbase_get_header_info($db);     // 필드(컬럼) 정보
$numRecords = dbase_numrecords($db);      // 총 레코드 수

// 필드명 목록 만들기
$fields = array_map(fn($f) => $f['name'], $header);

$result = [];
for ($i = 1; $i <= $numRecords; $i++) {   // dbase는 레코드 인덱스가 1부터 시작
    $row = dbase_get_record_with_names($db, $i);

    // 삭제 플래그가 있는 레코드 제외 (deleted=1)
    if (!empty($row['deleted'])) continue;

    // 값 정리 (공백 트림 등)
    foreach ($fields as $name) {
        if (isset($row[$name]) && is_string($row[$name])) {
            $row[$name] = rtrim($row[$name]);
        }
    }

    unset($row['deleted']); // 불필요
    $result[] = $row;
}

dbase_close($db);

// JSON으로 출력(디버깅)
header('Content-Type: application/json; charset=utf-8');
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

3) 자주 겪는 이슈

  • 한글 깨짐(인코딩): DBF가 CP949/EUC-KR로 저장된 경우가 많습니다. 깨지면 필드값에 iconv('CP949','UTF-8//IGNORE',$str) 같은 변환을 적용하세요.
  • shp “열기” 자체: dbase는 속성(DBF)만 읽습니다. 좌표/도형(shp)은 못 읽어요.

    • shp의 도형까지 필요하면 GDAL/OGR(ogr2ogr), MapServer, GeoPHP, shapefile-reader 라이브러리 같은 걸 쓰는 게 정석입니다.

원하시는 답변 톤이 “짧게 한 방에”인지, “친절한 튜토리얼형”인지도 맞춰드릴게요. 그리고 사용 환경이 Ubuntu+Apache인지 Nginx+PHP-FPM, 또는 Windows인지 알려주면 설치 파트는 더 정확히 써드릴게요.

구로역 맛집 시흥동 맛집
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
...